diff options
| author | Chris O'Hara <cohara87@gmail.com> | 2023-05-08 17:06:08 +1000 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2023-05-11 23:29:04 +0000 |
| commit | 41893389a6fb6d4d8b181cd90ca58d9d65326f76 (patch) | |
| tree | f9636c4a2e3f1bfedbb60c413f6d6658bbbf4030 /src/syscall | |
| parent | 70247126415246c7716ec4d28d6bc1f4077aee1f (diff) | |
| download | go-41893389a6fb6d4d8b181cd90ca58d9d65326f76.tar.xz | |
syscall: implement wasip1 SetNonblock and IsNonblock
Allows for the NONBLOCK file descriptor flag to be set and queried
on wasip1.
syscall.SetNonblock uses the fd_fdstat_set_flags WASI system call
and unix.IsNonblock uses the fd_fdstat_get system call.
This is a prerequisite for non-blocking I/O support.
Change-Id: I2bf79fd57142b2ec53eed3977d9aac8c6337eb80
Reviewed-on: https://go-review.googlesource.com/c/go/+/493356
Auto-Submit: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
Run-TryBot: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
Reviewed-by: Julien Fabre <ju.pryz@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Achille Roussel <achille.roussel@gmail.com>
Diffstat (limited to 'src/syscall')
| -rw-r--r-- | src/syscall/fs_wasip1.go | 24 | ||||
| -rw-r--r-- | src/syscall/net_wasip1.go | 4 | ||||
| -rw-r--r-- | src/syscall/syscall_wasip1.go | 14 |
3 files changed, 38 insertions, 4 deletions
diff --git a/src/syscall/fs_wasip1.go b/src/syscall/fs_wasip1.go index 84c65c070f..25cabf8234 100644 --- a/src/syscall/fs_wasip1.go +++ b/src/syscall/fs_wasip1.go @@ -255,6 +255,30 @@ func path_open(rootFD int32, dirflags lookupflags, path unsafe.Pointer, pathLen //go:noescape func random_get(buf unsafe.Pointer, bufLen size) Errno +// https://github.com/WebAssembly/WASI/blob/a2b96e81c0586125cc4dc79a5be0b78d9a059925/legacy/preview1/docs.md#-fdstat-record +// fdflags must be at offset 2, hence the uint16 type rather than the +// fdflags (uint32) type. +type fdstat struct { + filetype filetype + fdflags uint16 + rightsBase rights + rightsInheriting rights +} + +//go:wasmimport wasi_snapshot_preview1 fd_fdstat_get +//go:noescape +func fd_fdstat_get(fd int32, buf unsafe.Pointer) Errno + +//go:wasmimport wasi_snapshot_preview1 fd_fdstat_set_flags +//go:noescape +func fd_fdstat_set_flags(fd int32, flags fdflags) Errno + +func fd_fdstat_get_flags(fd int) (uint32, error) { + var stat fdstat + errno := fd_fdstat_get(int32(fd), unsafe.Pointer(&stat)) + return uint32(stat.fdflags), errnoErr(errno) +} + type preopentype = uint8 const ( diff --git a/src/syscall/net_wasip1.go b/src/syscall/net_wasip1.go index d41e873bed..896dd3e770 100644 --- a/src/syscall/net_wasip1.go +++ b/src/syscall/net_wasip1.go @@ -122,7 +122,3 @@ func SetWriteDeadline(fd int, t int64) error { func Shutdown(fd int, how int) error { return ENOSYS } - -func SetNonblock(fd int, nonblocking bool) error { - return ENOSYS -} diff --git a/src/syscall/syscall_wasip1.go b/src/syscall/syscall_wasip1.go index 73a461763a..5d19c000ae 100644 --- a/src/syscall/syscall_wasip1.go +++ b/src/syscall/syscall_wasip1.go @@ -464,3 +464,17 @@ const ( //go:wasmimport wasi_snapshot_preview1 clock_time_get //go:noescape func clock_time_get(id clockid, precision timestamp, time unsafe.Pointer) Errno + +func SetNonblock(fd int, nonblocking bool) error { + flags, err := fd_fdstat_get_flags(fd) + if err != nil { + return err + } + if nonblocking { + flags |= FDFLAG_NONBLOCK + } else { + flags &^= FDFLAG_NONBLOCK + } + errno := fd_fdstat_set_flags(int32(fd), flags) + return errnoErr(errno) +} |
