diff --git a/src/constants.js b/src/constants.js index 6d3f812..c688a7a 100644 --- a/src/constants.js +++ b/src/constants.js @@ -1,9 +1,3 @@ -var O_READ = 'READ'; -var O_WRITE = 'WRITE'; -var O_CREATE = 'CREATE'; -var O_EXCLUSIVE = 'EXCLUSIVE'; -var O_TRUNCATE = 'TRUNCATE'; -var O_APPEND = 'APPEND'; var XATTR_CREATE = 'CREATE'; var XATTR_REPLACE = 'REPLACE'; @@ -43,27 +37,6 @@ module.exports = { FS_NOMTIME: 'NOMTIME', FS_NODUPEIDCHECK: 'FS_NODUPEIDCHECK', - // FS File Open Flags - O_READ: O_READ, - O_WRITE: O_WRITE, - O_CREATE: O_CREATE, - O_EXCLUSIVE: O_EXCLUSIVE, - O_TRUNCATE: O_TRUNCATE, - O_APPEND: O_APPEND, - - O_FLAGS: { - 'r': [O_READ], - 'r+': [O_READ, O_WRITE], - 'w': [O_WRITE, O_CREATE, O_TRUNCATE], - 'w+': [O_WRITE, O_READ, O_CREATE, O_TRUNCATE], - 'wx': [O_WRITE, O_CREATE, O_EXCLUSIVE, O_TRUNCATE], - 'wx+': [O_WRITE, O_READ, O_CREATE, O_EXCLUSIVE, O_TRUNCATE], - 'a': [O_WRITE, O_CREATE, O_APPEND], - 'a+': [O_WRITE, O_READ, O_CREATE, O_APPEND], - 'ax': [O_WRITE, O_CREATE, O_EXCLUSIVE, O_APPEND], - 'ax+': [O_WRITE, O_READ, O_CREATE, O_EXCLUSIVE, O_APPEND] - }, - XATTR_CREATE: XATTR_CREATE, XATTR_REPLACE: XATTR_REPLACE, diff --git a/src/filesystem/implementation.js b/src/filesystem/implementation.js index b5a8f8b..35334de 100644 --- a/src/filesystem/implementation.js +++ b/src/filesystem/implementation.js @@ -17,13 +17,6 @@ var ROOT_DIRECTORY_NAME = Constants.ROOT_DIRECTORY_NAME; var SUPER_NODE_ID = Constants.SUPER_NODE_ID; var SYMLOOP_MAX = Constants.SYMLOOP_MAX; -var O_READ = Constants.O_READ; -var O_WRITE = Constants.O_WRITE; -var O_CREATE = Constants.O_CREATE; -var O_EXCLUSIVE = Constants.O_EXCLUSIVE; -var O_APPEND = Constants.O_APPEND; -var O_FLAGS = Constants.O_FLAGS; - var XATTR_CREATE = Constants.XATTR_CREATE; var XATTR_REPLACE = Constants.XATTR_REPLACE; var FS_NOMTIME = Constants.FS_NOMTIME; @@ -593,7 +586,8 @@ function open_file(context, path, flags, mode, callback) { var followedCount = 0; if(ROOT_DIRECTORY_NAME === name) { - if(flags.includes(O_WRITE)) { + flags = stringToFlags(flags); + if(flags & Constants.fsConstants.O_WRONLY) { callback(new Errors.EISDIR('the named file is a directory and O_WRITE is set', path)); } else { find_node(context, path, set_file_node); @@ -617,20 +611,21 @@ function open_file(context, path, flags, mode, callback) { if(error) { callback(error); } else { + flags = stringToFlags(flags); directoryData = result; if(directoryData.hasOwnProperty(name)) { - if(flags.includes(O_EXCLUSIVE)) { + if(flags & Constants.fsConstants.O_EXCL) { callback(new Errors.EEXIST('O_CREATE and O_EXCLUSIVE are set, and the named file exists', path)); } else { directoryEntry = directoryData[name]; - if(directoryEntry.type === NODE_TYPE_DIRECTORY && flags.includes(O_WRITE)) { + if(directoryEntry.type === NODE_TYPE_DIRECTORY && flags & Constants.fsConstants.O_WRONLY) { callback(new Errors.EISDIR('the named file is a directory and O_WRITE is set', path)); } else { context.getObject(directoryEntry.id, check_if_symbolic_link); } } } else { - if(!flags.includes(O_CREATE)) { + if(!flags & Constants.fsConstants.O_CREAT) { callback(new Errors.ENOENT('O_CREATE is not set and the named file does not exist', path)); } else { write_file_node(); @@ -662,7 +657,8 @@ function open_file(context, path, flags, mode, callback) { parentPath = dirname(data); name = basename(data); if(ROOT_DIRECTORY_NAME === name) { - if(flags.includes(O_WRITE)) { + flags = stringToFlags(flags); + if(flags & Constants.fsConstants.O_WRONLY) { callback(new Errors.EISDIR('the named file is a directory and O_WRITE is set', path)); } else { find_node(context, path, set_file_node); @@ -1617,8 +1613,45 @@ function fremovexattr_file (context, ofd, name, callback) { } } +//TODO: refactor this so it can be validated function validate_flags(flags) { - return O_FLAGS.hasOwnProperty(flags) ? O_FLAGS[flags] : null; + flags = stringToFlags(flags); + + if(flags & stringToFlags('r')) { + return flags; + } + else if(flags & stringToFlags('r+')) { + return flags; + } + else if(flags & stringToFlags('w')) { + return flags; + } + else if(flags & stringToFlags('w+')) { + return flags; + } + else if(flags & stringToFlags('wx')) { + return flags; + } + else if(flags & stringToFlags('wx+')) { + return flags; + } + else if(flags & stringToFlags('a')) { + return flags; + } + else if(flags & stringToFlags('a+')) { + return flags; + } + else if(flags & stringToFlags('ax')) { + return flags; + } + else if(flags & stringToFlags('ax+')) { + return flags; + } + + return null; + + + //return Constants.fsConstants.hasOwnProperty(flags) ? Constants.fsConstants[flags] : null; } function validate_file_options(options, enc, fileMode){ @@ -1646,7 +1679,8 @@ function open(context, path, flags, mode, callback) { callback(error); } else { var position; - if(flags.includes(O_APPEND)) { + flags = stringToFlags(flags); + if(flags & Constants.fsConstants.O_APPEND) { position = fileNode.size; } else { position = 0; @@ -1769,9 +1803,10 @@ function read(context, fd, buffer, offset, length, position, callback) { callback = arguments[arguments.length - 1]; var ofd = openFiles.getOpenFileDescription(fd); + ofd.flags = stringToFlags(ofd.flags); if(!ofd) { callback(new Errors.EBADF()); - } else if(!ofd.flags.includes(O_READ)) { + } else if(!ofd.flags & Constants.fsConstants.O_RDONLY) { callback(new Errors.EBADF('descriptor does not permit reading')); } else { read_data(context, ofd, buffer, offset, length, position, wrapped_cb); @@ -1850,8 +1885,9 @@ function write(context, fd, buffer, offset, length, position, callback) { var ofd = openFiles.getOpenFileDescription(fd); if(!ofd) { + ofd.flags = stringToFlags(ofd.flags); callback(new Errors.EBADF()); - } else if(!ofd.flags.includes(O_WRITE)) { + } else if(!ofd.flags & Constants.fsConstants.O_WRONLY) { callback(new Errors.EBADF('descriptor does not permit writing')); } else if(buffer.length - offset < length) { callback(new Errors.EIO('input buffer is too small')); @@ -2090,10 +2126,11 @@ function fsetxattr(context, fd, name, value, flag, callback) { } var ofd = openFiles.getOpenFileDescription(fd); + ofd.flags = stringToFlags(ofd.flags); if (!ofd) { callback(new Errors.EBADF()); } - else if (!ofd.flags.includes(O_WRITE)) { + else if (!ofd.flags & Constants.fsConstants.O_WRONLY) { callback(new Errors.EBADF('descriptor does not permit writing')); } else { @@ -2107,10 +2144,11 @@ function removexattr(context, path, name, callback) { function fremovexattr(context, fd, name, callback) { var ofd = openFiles.getOpenFileDescription(fd); + ofd.flags = stringToFlags(ofd.flags); if (!ofd) { callback(new Errors.EBADF()); } - else if (!ofd.flags.includes(O_WRITE)) { + else if (!ofd.flags & Constants.fsConstants.O_WRONLY) { callback(new Errors.EBADF('descriptor does not permit writing')); } else { @@ -2185,9 +2223,10 @@ function futimes(context, fd, atime, mtime, callback) { mtime = (mtime) ? toUnixTimestamp(mtime) : toUnixTimestamp(currentTime); var ofd = openFiles.getOpenFileDescription(fd); + ofd.flags = stringToFlags(ofd.flags); if(!ofd) { callback(new Errors.EBADF()); - } else if(!ofd.flags.includes(O_WRITE)) { + } else if(!ofd.flags & Constants.fsConstants.O_WRONLY) { callback(new Errors.EBADF('descriptor does not permit writing')); } else { futimes_file(context, ofd, atime, mtime, callback); @@ -2206,9 +2245,10 @@ function fchmod(context, fd, mode, callback) { if(!mode) return; var ofd = openFiles.getOpenFileDescription(fd); + ofd.flags = stringToFlags(ofd.flags); if(!ofd) { callback(new Errors.EBADF()); - } else if(!ofd.flags.includes(O_WRITE)) { + } else if(!ofd.flags & Constants.fsConstants.O_WRONLY) { callback(new Errors.EBADF('descriptor does not permit writing')); } else { fchmod_file(context, ofd, mode, callback); @@ -2235,9 +2275,10 @@ function fchown(context, fd, uid, gid, callback) { } var ofd = openFiles.getOpenFileDescription(fd); + ofd.flags = stringToFlags(ofd.flags); if(!ofd) { callback(new Errors.EBADF()); - } else if(!ofd.flags.includes(O_WRITE)) { + } else if(!ofd.flags & Constants.fsConstants.O_WRONLY) { callback(new Errors.EBADF('descriptor does not permit writing')); } else { fchown_file(context, ofd, uid, gid, callback); @@ -2395,9 +2436,10 @@ function ftruncate(context, fd, length, callback) { length = length || 0; var ofd = openFiles.getOpenFileDescription(fd); + ofd.flags = stringToFlags(ofd.flags); if(!ofd) { callback(new Errors.EBADF()); - } else if(!ofd.flags.includes(O_WRITE)) { + } else if(!ofd.flags & Constants.fsConstants.O_WRONLY) { callback(new Errors.EBADF('descriptor does not permit writing')); } else { if(validateInteger(length, callback) !== length) return; @@ -2405,6 +2447,24 @@ function ftruncate(context, fd, length, callback) { } } +function stringToFlags(flags) { + if(typeof flags === 'number') { + return flags; + } + switch(flags) { + case 'r': return Constants.fsConstants.O_RDONLY; + case 'r+': return Constants.fsConstants.O_RDWR; + case 'w': return Constants.fsConstants.O_WRONLY | Constants.fsConstants.O_CREAT | Constants.fsConstants.O_TRUNC; + case 'w+': return Constants.fsConstants.O_WRONLY | Constants.fsConstants.O_RDONLY | Constants.fsConstants.O_CREAT | Constants.fsConstants.O_TRUNC; + case 'wx': return Constants.fsConstants.O_WRONLY | Constants.fsConstants.O_CREAT | Constants.fsConstants.O_EXCL | Constants.fsConstants.O_TRUNC; + case 'wx+': return Constants.fsConstants.O_WRONLY | Constants.fsConstants.O_RDONLY | Constants.fsConstants.O_CREAT | Constants.fsConstants.O_EXCL | Constants.fsConstants.O_TRUNC; + case 'a': return Constants.fsConstants.O_WRONLY | Constants.fsConstants.O_RDONLY | Constants.fsConstants.O_APPEND; + case 'a+': return Constants.fsConstants.O_WRONLY | Constants.fsConstants.O_RDONLY | Constants.fsConstants.O_CREAT | Constants.fsConstants.O_APPEND; + case 'ax': return Constants.fsConstants.O_WRONLY | Constants.fsConstants.O_CREAT | Constants.fsConstants.O_EXCL | Constants.fsConstants.O_APPEND; + case 'ax+': return Constants.fsConstants.O_WRONLY | Constants.fsConstants.O_RDONLY | Constants.fsConstants.O_CREAT | Constants.fsConstants.O_EXCL | Constants.fsConstants.O_APPEND; + } +} + module.exports = { appendFile, access,