Merge pull request #476 from steaward/issue-420

Fixes #420
This commit is contained in:
Alan K 2018-11-22 01:46:52 -05:00 committed by GitHub
commit d1afe9719d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 19 deletions

View File

@ -548,7 +548,11 @@ function remove_directory(context, path, callback) {
find_node(context, parentPath, read_parent_directory_data); find_node(context, parentPath, read_parent_directory_data);
} }
function open_file(context, path, flags, callback) { function open_file(context, path, flags, mode, callback) {
if (typeof mode === 'function'){
callback = mode;
mode = null;
}
path = normalize(path); path = normalize(path);
var name = basename(path); var name = basename(path);
var parentPath = dirname(path); var parentPath = dirname(path);
@ -660,6 +664,9 @@ function open_file(context, path, flags, callback) {
} }
fileNode = result; fileNode = result;
fileNode.nlinks += 1; fileNode.nlinks += 1;
if(mode){
Node.setMode(mode, fileNode);
}
context.putObject(fileNode.id, fileNode, write_file_data); context.putObject(fileNode.id, fileNode, write_file_data);
}); });
} }
@ -1629,23 +1636,14 @@ function pathCheck(path, allowRelative, callback) {
function open(fs, context, path, flags, mode, callback) { function open(fs, context, path, flags, mode, callback) {
/** if (arguments.length < 6 ){
* NOTE: we support the same signature as node with a `mode` arg, callback = arguments[arguments.length - 1];
* but ignore it. We need to add it. Here is what node.js does: mode = 0o644;
* function open(path, flags, mode, callback) { }
* path = getPathFromURL(path); else {
* validatePath(path); mode = validateAndMaskMode(mode, FULL_READ_WRITE_EXEC_PERMISSIONS, callback);
* const flagsNumber = stringToFlags(flags); }
* if (arguments.length < 4) {
* callback = makeCallback(mode);
* mode = 0o666;
* } else {
* mode = validateAndMaskMode(mode, 'mode', 0o666);
* callback = makeCallback(callback);
* }
*/
callback = arguments[arguments.length - 1];
if(!pathCheck(path, callback)) return; if(!pathCheck(path, callback)) return;
function check_result(error, fileNode) { function check_result(error, fileNode) {
@ -1669,7 +1667,7 @@ function open(fs, context, path, flags, mode, callback) {
callback(new Errors.EINVAL('flags is not valid'), path); callback(new Errors.EINVAL('flags is not valid'), path);
} }
open_file(context, path, flags, check_result); open_file(context, path, flags, mode, check_result);
} }
function close(fs, context, fd, callback) { function close(fs, context, fd, callback) {

View File

@ -106,6 +106,39 @@ describe('fs.open', function() {
}); });
}); });
it('should create a new file, when flagged for write, and set the mode to the passed value', function(done) {
var fs = util.fs();
fs.open('/myfile', 'w', 0o777, function(error) {
if(error) throw error;
fs.stat('/myfile', function(error, result) {
expect(error).not.to.exist;
expect(result).to.exist;
expect(result.mode).to.exist;
expect(result.mode & 0o777).to.equal(0o777);
done();
});
});
});
it('should create a new file, but no mode is passed, so the default value of 644 should be seen', function(done) {
var fs = util.fs();
fs.open('/myfile', 'w', function(error) {
if(error) throw error;
fs.stat('/myfile', function(error, result) {
expect(error).not.to.exist;
expect(result).to.exist;
expect(result.mode).to.exist;
expect(result.mode & 0o644).to.equal(0o644);
done();
});
});
});
/** /**
* This test is currently correct per our code, but incorrect according to the spec. * This test is currently correct per our code, but incorrect according to the spec.
* When we fix https://github.com/filerjs/filer/issues/314 we'll have to update this. * When we fix https://github.com/filerjs/filer/issues/314 we'll have to update this.