summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiviu Ionescu <ilg@livius.net>2022-04-21 07:29:31 +0300
committerGitHub <noreply@github.com>2022-04-21 05:29:31 +0100
commitc6547c5362f39dd07cd2e609f34c7f586a3b222d (patch)
treedfcd65762dc7172e28aec134b48fa2818cef7e79
parent61fefe1959a8ab9e796f409346ff619c14036c81 (diff)
downloadnode-new-c6547c5362f39dd07cd2e609f34c7f586a3b222d.tar.gz
src: define fs.constants.S_IWUSR & S_IRUSR for Win
On Windows, most of the POSIX file mode definitions are not available. However, functionally equivalent read/write definitions exists, and chmod() can use them. This patch defines two aliases, so that these definintions are issued in fs.constants. fixes: https://github.com/nodejs/node/issues/41591 PR-URL: https://github.com/nodejs/node/pull/42757 Refs: https://github.com/nodejs/node/issues/41591 Reviewed-By: Darshan Sen <raisinten@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
-rw-r--r--doc/api/fs.md18
-rw-r--r--src/node_constants.cc10
-rw-r--r--test/parallel/test-fs-constants.js8
3 files changed, 35 insertions, 1 deletions
diff --git a/doc/api/fs.md b/doc/api/fs.md
index 246b369f31..46a15ba547 100644
--- a/doc/api/fs.md
+++ b/doc/api/fs.md
@@ -6771,7 +6771,11 @@ operations.
The following constants are exported by `fs.constants`.
-Not every constant will be available on every operating system.
+Not every constant will be available on every operating system;
+this is especially important for Windows, where many of the POSIX specific
+definitions are not available.
+For portable applications it is recommended to check for their presence
+before use.
To use more than one constant, use the bitwise OR `|` operator.
@@ -6824,6 +6828,8 @@ The following constants are meant for use as the `mode` parameter passed to
</tr>
</table>
+The definitions are also available on Windows.
+
##### File copy constants
The following constants are meant for use with [`fs.copyFile()`][].
@@ -6852,6 +6858,8 @@ The following constants are meant for use with [`fs.copyFile()`][].
</tr>
</table>
+The definitions are also available on Windows.
+
##### File open constants
The following constants are meant for use with `fs.open()`.
@@ -6946,6 +6954,9 @@ The following constants are meant for use with `fs.open()`.
</tr>
</table>
+On Windows, only `O_APPEND`, `O_CREAT`, `O_EXCL`, `O_RDONLY`, `O_RDWR`,
+`O_TRUNC`, `O_WRONLY` and `UV_FS_O_FILEMAP` are available.
+
##### File type constants
The following constants are meant for use with the {fs.Stats} object's
@@ -6990,6 +7001,9 @@ The following constants are meant for use with the {fs.Stats} object's
</tr>
</table>
+On Windows, only `S_IFCHR`, `S_IFDIR`, `S_IFLNK`, `S_IFMT`, and `S_IFREG`,
+are available.
+
##### File mode constants
The following constants are meant for use with the {fs.Stats} object's
@@ -7050,6 +7064,8 @@ The following constants are meant for use with the {fs.Stats} object's
</tr>
</table>
+On Windows, only `S_IRUSR` and `S_IWUSR` are available.
+
## Notes
### Ordering of callback and promise-based operations
diff --git a/src/node_constants.cc b/src/node_constants.cc
index 38c8f2738b..3269e3003a 100644
--- a/src/node_constants.cc
+++ b/src/node_constants.cc
@@ -47,6 +47,16 @@
#include <dlfcn.h>
#endif
+#if defined(_WIN32)
+#include <io.h> // _S_IREAD _S_IWRITE
+#ifndef S_IRUSR
+#define S_IRUSR _S_IREAD
+#endif // S_IRUSR
+#ifndef S_IWUSR
+#define S_IWUSR _S_IWRITE
+#endif // S_IWUSR
+#endif
+
#include <cerrno>
#include <csignal>
#include <limits>
diff --git a/test/parallel/test-fs-constants.js b/test/parallel/test-fs-constants.js
new file mode 100644
index 0000000000..49bcabd808
--- /dev/null
+++ b/test/parallel/test-fs-constants.js
@@ -0,0 +1,8 @@
+'use strict';
+require('../common');
+const fs = require('fs');
+const assert = require('assert');
+
+// Check if the two constants accepted by chmod() on Windows are defined.
+assert.notStrictEqual(fs.constants.S_IRUSR, undefined);
+assert.notStrictEqual(fs.constants.S_IWUSR, undefined);