};
+njs_inline njs_int_t
+njs_fs_path_arg(njs_vm_t *vm, const char **dst,
+ const njs_value_t* src, const njs_str_t *prop_name)
+{
+ if (njs_slow_path(!njs_is_string(src))) {
+ njs_type_error(vm, "\"%V\" must be a string", prop_name);
+ return NJS_ERROR;
+ }
+
+ *dst = njs_string_to_c_string(vm, njs_value_arg(src));
+ if (njs_slow_path(*dst == NULL)) {
+ return NJS_ERROR;
+ }
+
+ return NJS_OK;
+}
+
+
static njs_int_t
njs_fs_read_file(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
njs_index_t unused)
njs_object_prop_t *prop;
njs_lvlhsh_query_t lhq;
- if (njs_slow_path(nargs < 3)) {
- njs_type_error(vm, "too few arguments");
- return NJS_ERROR;
+ ret = njs_fs_path_arg(vm, &path, njs_arg(args, nargs, 1),
+ &njs_str_value("path"));
+ if (njs_slow_path(ret != NJS_OK)) {
+ return ret;
}
- if (njs_slow_path(!njs_is_string(&args[1]))) {
- njs_type_error(vm, "path must be a string");
+ if (njs_slow_path(nargs < 3)) {
+ njs_type_error(vm, "too few arguments");
return NJS_ERROR;
}
return NJS_ERROR;
}
- path = njs_string_to_c_string(vm, &args[1]);
- if (njs_slow_path(path == NULL)) {
- return NJS_ERROR;
- }
-
if (encoding.length != 0
&& (encoding.length != 4 || memcmp(encoding.start, "utf8", 4) != 0))
{
njs_object_prop_t *prop;
njs_lvlhsh_query_t lhq;
- if (njs_slow_path(nargs < 2)) {
- njs_type_error(vm, "too few arguments");
- return NJS_ERROR;
+ ret = njs_fs_path_arg(vm, &path, njs_arg(args, nargs, 1),
+ &njs_str_value("path"));
+ if (njs_slow_path(ret != NJS_OK)) {
+ return ret;
}
- if (njs_slow_path(!njs_is_string(&args[1]))) {
- njs_type_error(vm, "path must be a string");
+ if (njs_slow_path(nargs < 2)) {
+ njs_type_error(vm, "too few arguments");
return NJS_ERROR;
}
njs_object_prop_t *prop;
njs_lvlhsh_query_t lhq;
- if (njs_slow_path(nargs < 4)) {
- njs_type_error(vm, "too few arguments");
- return NJS_ERROR;
+ ret = njs_fs_path_arg(vm, &path, njs_arg(args, nargs, 1),
+ &njs_str_value("path"));
+ if (njs_slow_path(ret != NJS_OK)) {
+ return ret;
}
- if (njs_slow_path(!njs_is_string(&args[1]))) {
- njs_type_error(vm, "path must be a string");
+ if (njs_slow_path(nargs < 4)) {
+ njs_type_error(vm, "too few arguments");
return NJS_ERROR;
}
md = 0666;
}
- path = njs_string_to_c_string(vm, &args[1]);
- if (njs_slow_path(path == NULL)) {
- return NJS_ERROR;
- }
-
if (encoding.length != 0
&& (encoding.length != 4 || memcmp(encoding.start, "utf8", 4) != 0))
{
njs_object_prop_t *prop;
njs_lvlhsh_query_t lhq;
- if (njs_slow_path(nargs < 3)) {
- njs_type_error(vm, "too few arguments");
- return NJS_ERROR;
+ ret = njs_fs_path_arg(vm, &path, njs_arg(args, nargs, 1),
+ &njs_str_value("path"));
+ if (njs_slow_path(ret != NJS_OK)) {
+ return ret;
}
- if (njs_slow_path(!njs_is_string(&args[1]))) {
- njs_type_error(vm, "path must be a string");
+ if (njs_slow_path(nargs < 3)) {
+ njs_type_error(vm, "too few arguments");
return NJS_ERROR;
}
md = 0666;
}
- path = njs_string_to_c_string(vm, &args[1]);
- if (njs_slow_path(path == NULL)) {
- return NJS_ERROR;
- }
-
if (encoding.length != 0
&& (encoding.length != 4 || memcmp(encoding.start, "utf8", 4) != 0))
{
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;
- njs_value_t *old, *new;
-
- if (njs_slow_path(nargs < 3)) {
- if (nargs < 2) {
- njs_type_error(vm, "oldPath must be a string");
- return NJS_ERROR;
- }
-
- njs_type_error(vm, "newPath must be a string");
- return NJS_ERROR;
- }
-
- old = njs_argument(args, 1);
- new = njs_argument(args, 2);
+ njs_int_t ret;
+ const char *old_path, *new_path;
- if (njs_slow_path(!njs_is_string(old))) {
- ret = njs_value_to_string(vm, old, old);
- if (njs_slow_path(ret != NJS_OK)) {
- return ret;
- }
- }
-
- if (njs_slow_path(!njs_is_string(new))) {
- ret = njs_value_to_string(vm, new, new);
- if (njs_slow_path(ret != NJS_OK)) {
- return ret;
- }
- }
-
- old_path = njs_string_to_c_string(vm, old);
- if (njs_slow_path(old_path == NULL)) {
- return NJS_ERROR;
+ ret = njs_fs_path_arg(vm, &old_path, njs_arg(args, nargs, 1),
+ &njs_str_value("oldPath"));
+ if (njs_slow_path(ret != NJS_OK)) {
+ return ret;
}
- new_path = njs_string_to_c_string(vm, new);
- if (njs_slow_path(new_path == NULL)) {
- return NJS_ERROR;
+ ret = njs_fs_path_arg(vm, &new_path, njs_arg(args, nargs, 2),
+ &njs_str_value("newPath"));
+ if (njs_slow_path(ret != NJS_OK)) {
+ return ret;
}
ret = rename(old_path, new_path);
{ njs_str("var fs = require('fs');"
"fs.readFile()"),
- njs_str("TypeError: too few arguments") },
+ njs_str("TypeError: \"path\" must be a string") },
{ njs_str("var fs = require('fs');"
"fs.readFile('/njs_unknown_path')"),
{ njs_str("var fs = require('fs');"
"fs.readFileSync()"),
- njs_str("TypeError: too few arguments") },
+ njs_str("TypeError: \"path\" must be a string") },
{ njs_str("var fs = require('fs');"
"fs.readFileSync({})"),
- njs_str("TypeError: path must be a string") },
+ njs_str("TypeError: \"path\" must be a string") },
{ njs_str("var fs = require('fs');"
"fs.readFileSync('/njs_unknown_path', {flag:'xx'})"),
{ njs_str("var fs = require('fs');"
"fs.writeFile()"),
- njs_str("TypeError: too few arguments") },
+ njs_str("TypeError: \"path\" must be a string") },
{ njs_str("var fs = require('fs');"
"fs.writeFile('/njs_unknown_path')"),
{ njs_str("var fs = require('fs');"
"fs.writeFile({}, '', function () {})"),
- njs_str("TypeError: path must be a string") },
+ njs_str("TypeError: \"path\" must be a string") },
{ njs_str("var fs = require('fs');"
"fs.writeFile('/njs_unknown_path', '', 'utf8')"),
{ njs_str("var fs = require('fs');"
"fs.writeFileSync()"),
- njs_str("TypeError: too few arguments") },
+ njs_str("TypeError: \"path\" must be a string") },
{ njs_str("var fs = require('fs');"
"fs.writeFileSync('/njs_unknown_path')"),
{ njs_str("var fs = require('fs');"
"fs.writeFileSync({}, '')"),
- njs_str("TypeError: path must be a string") },
+ njs_str("TypeError: \"path\" must be a string") },
{ njs_str("var fs = require('fs');"
"fs.writeFileSync('/njs_unknown_path', '', {flag:'xx'})"),
"fs.writeFileSync('/njs_unknown_path', '', true)"),
njs_str("TypeError: Unknown options type (a string or object required)") },
- /* require('fs').writeFileSync() */
+ /* require('fs').renameSync() */
{ njs_str("var fs = require('fs');"
"fs.renameSync()"),
- njs_str("TypeError: oldPath must be a string") },
+ njs_str("TypeError: \"oldPath\" must be a string") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.renameSync('/njs_unknown_path')"),
+ njs_str("TypeError: \"newPath\" must be a string") },
{ njs_str("var fs = require('fs');"
- "fs.renameSync({toString(){return '/path/1'}})"),
- njs_str("TypeError: newPath must be a string") },
+ "[undefined, null, false, NaN, Symbol(), {}, Object('/njs_unknown_path')]"
+ ".map((x) => { try { fs.renameSync(x, '/njs_unknown_path'); } "
+ " catch (e) { return (e instanceof TypeError); } })"
+ ".every((x) => x === true)"),
+ njs_str("true")},
+
+ { njs_str("var fs = require('fs');"
+ "[undefined, null, false, NaN, Symbol(), {}, Object('/njs_unknown_path')]"
+ ".map((x) => { try { fs.renameSync('/njs_unknown_path', x); } "
+ " catch (e) { return (e instanceof TypeError); } })"
+ ".every((x) => x === true)"),
+ njs_str("true")},
+
+ { njs_str("var "
+ "fs = require('fs'),"
+ "func = ["
+ "'readFile',"
+ "'readFileSync',"
+ "'writeFile',"
+ "'writeFileSync',"
+ "'appendFile',"
+ "'appendFileSync',"
+ "],"
+ "test = (fname) =>"
+ "[undefined, null, false, NaN, Symbol(), {}, Object('/njs_unknown_path')]"
+ ".map((x) => { try { fs[fname](x); } "
+ " catch (e) { return (e instanceof TypeError); } })"
+ ".every((x) => x === true);"
+ "func.map(test).every((x) => x)"),
+ njs_str("true")},
/* require('crypto').createHash() */