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);
}
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);
var name = basename(path);
var parentPath = dirname(path);
@ -660,6 +664,9 @@ function open_file(context, path, flags, callback) {
}
fileNode = result;
fileNode.nlinks += 1;
if(mode){
Node.setMode(mode, fileNode);
}
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) {
/**
* NOTE: we support the same signature as node with a `mode` arg,
* but ignore it. We need to add it. Here is what node.js does:
* function open(path, flags, mode, callback) {
* path = getPathFromURL(path);
* validatePath(path);
* const flagsNumber = stringToFlags(flags);
* if (arguments.length < 4) {
* callback = makeCallback(mode);
* mode = 0o666;
* } else {
* mode = validateAndMaskMode(mode, 'mode', 0o666);
* callback = makeCallback(callback);
* }
*/
if (arguments.length < 6 ){
callback = arguments[arguments.length - 1];
mode = 0o644;
}
else {
mode = validateAndMaskMode(mode, FULL_READ_WRITE_EXEC_PERMISSIONS, callback);
}
callback = arguments[arguments.length - 1];
if(!pathCheck(path, callback)) return;
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);
}
open_file(context, path, flags, check_result);
open_file(context, path, flags, mode, check_result);
}
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.
* When we fix https://github.com/filerjs/filer/issues/314 we'll have to update this.