]> Cypherpunks repositories - gostls13.git/commitdiff
syscall, internal/syscall/unix: add Openat support for wasip1
authorDamien Neil <dneil@google.com>
Fri, 4 Oct 2024 21:30:31 +0000 (14:30 -0700)
committerDamien Neil <dneil@google.com>
Mon, 7 Oct 2024 19:25:11 +0000 (19:25 +0000)
The syscall package is mostly frozen, but wasip1 file syscall
support was added to syscall and the Open and Openat
implementations overlap. Implement Openat in syscall for
overall simplicity.

We already have syscall.Openat for some platforms, so this
doesn't add any new functions to syscall.

For #67002

Change-Id: Ia34b12ef11fc7a3b7832e07b3546a760c23efe5b
Reviewed-on: https://go-review.googlesource.com/c/go/+/617378
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
src/internal/syscall/unix/at_wasip1.go
src/syscall/fs_wasip1.go
src/syscall/syscall_wasip1.go

index 5cce1030f10d03653d1fbe00ce6c2e3923ac6207..888b156741171affe43854bad78e356595ad196b 100644 (file)
@@ -19,6 +19,10 @@ const (
        UTIME_OMIT = -0x2
 )
 
+func Openat(dirfd int, path string, flags int, perm uint32) (int, error) {
+       return syscall.Openat(dirfd, path, flags, perm)
+}
+
 func Readlinkat(dirfd int, path string, buf []byte) (int, error) {
        var nwritten size
        errno := path_readlink(
index c249891dd2181c6721c64d1077b4d6a1fab6f16a..da36d8f5b84aa1804a5d2ecadd9fa0b86549f855 100644 (file)
@@ -520,7 +520,14 @@ func Open(path string, openmode int, perm uint32) (int, error) {
                return -1, EINVAL
        }
        dirFd, pathPtr, pathLen := preparePath(path)
+       return openat(dirFd, pathPtr, pathLen, openmode, perm)
+}
+
+func Openat(dirFd int, path string, openmode int, perm uint32) (int, error) {
+       return openat(int32(dirFd), stringPointer(path), size(len(path)), openmode, perm)
+}
 
+func openat(dirFd int32, pathPtr unsafe.Pointer, pathLen size, openmode int, perm uint32) (int, error) {
        var oflags oflags
        if (openmode & O_CREATE) != 0 {
                oflags |= OFLAG_CREATE
@@ -558,10 +565,15 @@ func Open(path string, openmode int, perm uint32) (int, error) {
                fdflags |= FDFLAG_SYNC
        }
 
+       var lflags lookupflags
+       if openmode&O_NOFOLLOW == 0 {
+               lflags = LOOKUP_SYMLINK_FOLLOW
+       }
+
        var fd int32
        errno := path_open(
                dirFd,
-               LOOKUP_SYMLINK_FOLLOW,
+               lflags,
                pathPtr,
                pathLen,
                oflags,
index b98f99745f29e37a77f016305caaa9d0d085612b..a125777933310781f6c217bf181f8064ab7ca020 100644 (file)
@@ -223,6 +223,7 @@ const (
        O_EXCL      = 0200
        O_SYNC      = 010000
        O_DIRECTORY = 020000
+       O_NOFOLLOW  = 0400
 
        O_CLOEXEC = 0
 )