open should follow symbolic links

This functionality is tested implicitly through tests in
writefile, readfile
This commit is contained in:
Abir Viqar 2013-11-23 13:35:23 -05:00
parent a95bf43069
commit 702dd1a3a3
2 changed files with 65 additions and 1 deletions

View File

@ -414,6 +414,8 @@ define(function(require) {
var fileNode; var fileNode;
var fileData; var fileData;
var followedCount = 0;
if(ROOT_DIRECTORY_NAME == name) { if(ROOT_DIRECTORY_NAME == name) {
if(_(flags).contains(O_WRITE)) { if(_(flags).contains(O_WRITE)) {
callback(new EIsDirectory('the named file is a directory and O_WRITE is set')); callback(new EIsDirectory('the named file is a directory and O_WRITE is set'));
@ -446,7 +448,7 @@ define(function(require) {
if(directoryEntry.type == MODE_DIRECTORY && _(flags).contains(O_WRITE)) { if(directoryEntry.type == MODE_DIRECTORY && _(flags).contains(O_WRITE)) {
callback(new EIsDirectory('the named file is a directory and O_WRITE is set')); callback(new EIsDirectory('the named file is a directory and O_WRITE is set'));
} else { } else {
read_object(objectStore, directoryEntry.id, set_file_node); read_object(objectStore, directoryEntry.id, check_if_symbolic_link);
} }
} }
} else { } else {
@ -459,6 +461,38 @@ define(function(require) {
} }
} }
function check_if_symbolic_link(error, result) {
if(error) {
callback(error);
} else {
var node = result;
if(node.mode == MODE_SYMBOLIC_LINK) {
followedCount++;
if(followedCount > SYMLOOP_MAX){
callback(new ELoop('too many symbolic links were encountered'));
} else {
follow_symbolic_link(node.data);
}
} else {
set_file_node(undefined, node);
}
}
}
function follow_symbolic_link(data) {
data = normalize(data);
parentPath = dirname(data);
name = basename(data);
if(ROOT_DIRECTORY_NAME == name) {
if(_(flags).contains(O_WRITE)) {
callback(new EIsDirectory('the named file is a directory and O_WRITE is set'));
} else {
find_node(objectStore, path, set_file_node);
}
}
find_node(objectStore, parentPath, read_directory_data);
}
function set_file_node(error, result) { function set_file_node(error, result) {
if(error) { if(error) {
callback(error); callback(error);

View File

@ -1063,6 +1063,36 @@ describe('fs.writeFile, fs.readFile', function() {
}); });
}); });
it('should follow symbolic links', function () {
var complete = false;
var _result;
var that = this;
var contents = "This is a file.";
that.fs.writeFile('/myfile', '', { encoding: 'utf8' }, function(error) {
if(error) throw error;
that.fs.symlink('/myfile', '/myFileLink', function (error) {
if (error) throw error;
that.fs.writeFile('/myFileLink', contents, 'utf8', function (error) {
if (error) throw error;
that.fs.readFile('/myFileLink', 'utf8', function(error, data) {
if(error) throw error;
_result = data;
complete = true;
});
});
});
});
waitsFor(function() {
return complete;
}, 'test to complete', DEFAULT_TIMEOUT);
runs(function() {
expect(_result).toEqual(contents);
});
});
}); });
describe('fs.read', function() { describe('fs.read', function() {