njs_uint_t nargs, int default_flags);
static njs_int_t njs_fs_write_file_sync_internal(njs_vm_t *vm,
njs_value_t *args, njs_uint_t nargs, int default_flags);
+static njs_int_t njs_fs_rename_sync(njs_vm_t *vm, njs_value_t *args,
+ njs_uint_t nargs, njs_index_t unused);
static njs_int_t njs_fs_fd_read(njs_vm_t *vm, njs_value_t *path, int fd,
njs_str_t *data);
}
+static njs_int_t
+njs_fs_rename_sync(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
+ njs_index_t unused)
+{
+ int ret;
+ const char *old_path, *new_path;
+
+ if (njs_slow_path(!njs_is_string(njs_arg(args, nargs, 1)))) {
+ njs_type_error(vm, "oldPath must be a string");
+ return NJS_ERROR;
+ }
+
+ if (njs_slow_path(!njs_is_string(njs_arg(args, nargs, 2)))) {
+ njs_type_error(vm, "newPath must be a string");
+ return NJS_ERROR;
+ }
+
+ old_path = (const char *) njs_string_to_c_string(vm, njs_argument(args, 1));
+ if (njs_slow_path(old_path == NULL)) {
+ return NJS_ERROR;
+ }
+
+ new_path = (const char *) njs_string_to_c_string(vm, njs_argument(args, 2));
+ if (njs_slow_path(new_path == NULL)) {
+ return NJS_ERROR;
+ }
+
+ ret = rename(old_path, new_path);
+ if (njs_slow_path(ret != 0)) {
+ ret = njs_fs_error(vm, "rename", strerror(errno), NULL, errno,
+ &vm->retval);
+ return NJS_ERROR;
+ }
+
+ njs_set_undefined(&vm->retval);
+
+ return NJS_OK;
+}
+
+
static njs_int_t
njs_fs_fd_read(njs_vm_t *vm, njs_value_t *path, int fd, njs_str_t *data)
{
.configurable = 1,
},
+ {
+ .type = NJS_PROPERTY,
+ .name = njs_string("renameSync"),
+ .value = njs_native_function(njs_fs_rename_sync, NJS_STRING_ARG,
+ NJS_STRING_ARG, 0),
+ .writable = 1,
+ .configurable = 1,
+ },
+
};
"fs.writeFileSync('/njs_unknown_path', '', true)"),
njs_str("TypeError: Unknown options type (a string or object required)") },
+ /* require('fs').writeFileSync() */
+
+ { njs_str("var fs = require('fs');"
+ "fs.renameSync()"),
+ njs_str("TypeError: oldPath must be a string") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.renameSync({toString(){return '/path/1'}})"),
+ njs_str("TypeError: newPath must be a string") },
+
/* require('crypto').createHash() */
{ njs_str("require('crypto').createHash('sha1')"),
"'ABCABC'\r\n>> "}
}
+# require('fs').renameSync()
+
+njs_test {
+ {"var fs = require('fs'), mktemp = ()=> `/tmp/njs_${Math.round(Math.random() * 1000000)}`\r\n"
+ "undefined\r\n>> "}
+ {"var fn1 = mktemp(), fn2 = mktemp();\r\n"
+ "undefined\r\n>> "}
+ {"fs.writeFileSync(fn1, 'ABC')\r\n"
+ "undefined\r\n>> "}
+ {"fs.renameSync(fn1, fn2)\r\n"
+ "undefined\r\n>> "}
+ {"fs.readFileSync(fn2)\r\n"
+ "'ABC'\r\n>> "}
+}
+
+njs_test {
+ {"var fs = require('fs')\r\n"
+ "undefined\r\n>> "}
+ {"fs.renameSync('build/test/file2', 'test/fs/')\r\n"
+ "Error: Not a directory*"}
+}
+
# Modules
njs_run {"-p" "test/module/libs" "./test/module/normal.js"} \