syscall: disable O_DIRECTORY on Windows for js/wasm

O_DIRECTORY is not available on all platforms, as described at

https://nodejs.org/docs/latest/api/fs.html#file-open-constants .

On Windows, only O_APPEND, O_CREAT, O_EXCL, O_RDONLY, O_RDWR,
O_TRUNC, O_WRONLY, and UV_FS_O_FILEMAP are available.

Fixes #71758

Change-Id: Iacc890ba9a30dcd75eb746ec324fa0c3e368048e
GitHub-Last-Rev: a0160e8fc8
GitHub-Pull-Request: golang/go#71770
Reviewed-on: https://go-review.googlesource.com/c/go/+/650015
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Auto-Submit: Dmitri Shuralyov <dmitshur@golang.org>
TryBot-Bypass: Dmitri Shuralyov <dmitshur@golang.org>
This commit is contained in:
Zxilly 2025-02-18 15:21:23 +00:00 committed by Gopher Robot
parent 0bdc792145
commit ad8b33002b
1 changed files with 23 additions and 8 deletions

View File

@ -23,15 +23,26 @@ var constants = jsFS.Get("constants")
var uint8Array = js.Global().Get("Uint8Array") var uint8Array = js.Global().Get("Uint8Array")
var ( var (
nodeWRONLY = constants.Get("O_WRONLY").Int() nodeWRONLY = constants.Get("O_WRONLY").Int()
nodeRDWR = constants.Get("O_RDWR").Int() nodeRDWR = constants.Get("O_RDWR").Int()
nodeCREATE = constants.Get("O_CREAT").Int() nodeCREATE = constants.Get("O_CREAT").Int()
nodeTRUNC = constants.Get("O_TRUNC").Int() nodeTRUNC = constants.Get("O_TRUNC").Int()
nodeAPPEND = constants.Get("O_APPEND").Int() nodeAPPEND = constants.Get("O_APPEND").Int()
nodeEXCL = constants.Get("O_EXCL").Int() nodeEXCL = constants.Get("O_EXCL").Int()
nodeDIRECTORY = constants.Get("O_DIRECTORY").Int()
// NodeJS on Windows does not support O_DIRECTORY, so we default
// to -1 and assign it in init if available.
// See https://nodejs.org/docs/latest/api/fs.html#file-open-constants.
nodeDIRECTORY = -1
) )
func init() {
oDir := constants.Get("O_DIRECTORY")
if !oDir.IsUndefined() {
nodeDIRECTORY = oDir.Int()
}
}
type jsFile struct { type jsFile struct {
path string path string
entries []string entries []string
@ -85,7 +96,11 @@ func Open(path string, openmode int, perm uint32) (int, error) {
return 0, errors.New("syscall.Open: O_SYNC is not supported by js/wasm") return 0, errors.New("syscall.Open: O_SYNC is not supported by js/wasm")
} }
if openmode&O_DIRECTORY != 0 { if openmode&O_DIRECTORY != 0 {
flags |= nodeDIRECTORY if nodeDIRECTORY != -1 {
flags |= nodeDIRECTORY
} else {
return 0, errors.New("syscall.Open: O_DIRECTORY is not supported on Windows")
}
} }
jsFD, err := fsCall("open", path, flags, perm) jsFD, err := fsCall("open", path, flags, perm)