aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoyee Cheung <joyeec9h3@gmail.com>2018-01-24 09:37:52 +0800
committerJoyee Cheung <joyeec9h3@gmail.com>2018-02-01 15:52:40 +0800
commitf5e287ba208b8d9eed3c850577ff9a46d9935d9a (patch)
treed7cc63fb647561a427214d5c4695d40670020fc4
parentb3a7df7c6dddcc4aaf2106d569a2a4c017e9699c (diff)
downloadandroid-node-v8-f5e287ba208b8d9eed3c850577ff9a46d9935d9a.tar.gz
android-node-v8-f5e287ba208b8d9eed3c850577ff9a46d9935d9a.tar.bz2
android-node-v8-f5e287ba208b8d9eed3c850577ff9a46d9935d9a.zip
fs: throw errors from fs.fdatasyncSync in JS
PR-URL: https://github.com/nodejs/node/pull/18348 Refs: https://github.com/nodejs/node/issues/18106 Reviewed-By: Michaƫl Zasso <targos@protonmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
-rw-r--r--lib/fs.js6
-rw-r--r--src/node_file.cc17
-rw-r--r--test/parallel/test-fs-error-messages.js21
3 files changed, 37 insertions, 7 deletions
diff --git a/lib/fs.js b/lib/fs.js
index 8eaba7984c..49e550fe3d 100644
--- a/lib/fs.js
+++ b/lib/fs.js
@@ -1029,7 +1029,11 @@ fs.fdatasync = function(fd, callback) {
fs.fdatasyncSync = function(fd) {
validateUint32(fd, 'fd');
- return binding.fdatasync(fd);
+ const ctx = {};
+ binding.fdatasync(fd, undefined, ctx);
+ if (ctx.errno !== undefined) {
+ throw new errors.uvException(ctx);
+ }
};
fs.fsync = function(fd, callback) {
diff --git a/src/node_file.cc b/src/node_file.cc
index 10149b403e..6188da2448 100644
--- a/src/node_file.cc
+++ b/src/node_file.cc
@@ -735,16 +735,21 @@ static void FTruncate(const FunctionCallbackInfo<Value>& args) {
static void Fdatasync(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
- CHECK(args[0]->IsInt32());
+ const int argc = args.Length();
+ CHECK_GE(argc, 2);
- int fd = args[0]->Int32Value();
+ CHECK(args[0]->IsInt32());
+ const int fd = args[0]->As<Int32>()->Value();
- if (args[1]->IsObject()) {
- CHECK_EQ(args.Length(), 2);
+ if (args[1]->IsObject()) { // fdatasync(fd, req)
+ CHECK_EQ(argc, 2);
AsyncCall(env, args, "fdatasync", UTF8, AfterNoArgs,
uv_fs_fdatasync, fd);
- } else {
- SYNC_CALL(fdatasync, 0, fd)
+ } else { // fdatasync(fd, undefined, ctx)
+ CHECK_EQ(argc, 3);
+ fs_req_wrap req_wrap;
+ SyncCall(env, args[2], &req_wrap, "fdatasync",
+ uv_fs_fdatasync, fd);
}
}
diff --git a/test/parallel/test-fs-error-messages.js b/test/parallel/test-fs-error-messages.js
index b7e7ab6a2c..116c853724 100644
--- a/test/parallel/test-fs-error-messages.js
+++ b/test/parallel/test-fs-error-messages.js
@@ -482,3 +482,24 @@ function re(literals, ...values) {
validateError
);
}
+
+// fdatasync
+{
+ const validateError = (err) => {
+ assert.strictEqual(err.message, 'EBADF: bad file descriptor, fdatasync');
+ assert.strictEqual(err.errno, uv.UV_EBADF);
+ assert.strictEqual(err.code, 'EBADF');
+ assert.strictEqual(err.syscall, 'fdatasync');
+ return true;
+ };
+
+ const fd = fs.openSync(existingFile, 'r');
+ fs.closeSync(fd);
+
+ fs.fdatasync(fd, common.mustCall(validateError));
+
+ assert.throws(
+ () => fs.fdatasyncSync(fd),
+ validateError
+ );
+}