TEXT ·libc_getgrgid_r_trampoline(SB),NOSPLIT,$0-0; JMP libc_getgrgid_r(SB)
TEXT ·libc_sysconf_trampoline(SB),NOSPLIT,$0-0; JMP libc_sysconf(SB)
TEXT ·libc_faccessat_trampoline(SB),NOSPLIT,$0-0; JMP libc_faccessat(SB)
+TEXT ·libc_readlinkat_trampoline(SB),NOSPLIT,$0-0; JMP libc_readlinkat(SB)
+TEXT ·libc_mkdirat_trampoline(SB),NOSPLIT,$0-0; JMP libc_mkdirat(SB)
JMP libc_faccessat(SB)
TEXT ·libc_arc4random_buf_trampoline(SB),NOSPLIT,$0-0
JMP libc_arc4random_buf(SB)
+TEXT ·libc_readlinkat_trampoline(SB),NOSPLIT,$0-0
+ JMP libc_readlinkat(SB)
+TEXT ·libc_mkdirat_trampoline(SB),NOSPLIT,$0-0
+ JMP libc_mkdirat(SB)
return int(fd), nil
}
+
+func Readlinkat(dirfd int, path string, buf []byte) (int, error) {
+ p0, err := syscall.BytePtrFromString(path)
+ if err != nil {
+ return 0, err
+ }
+ var p1 unsafe.Pointer
+ if len(buf) > 0 {
+ p1 = unsafe.Pointer(&buf[0])
+ } else {
+ p1 = unsafe.Pointer(&_zero)
+ }
+ n, _, errno := syscall.Syscall6(readlinkatTrap,
+ uintptr(dirfd),
+ uintptr(unsafe.Pointer(p0)),
+ uintptr(p1),
+ uintptr(len(buf)),
+ 0, 0)
+ if errno != 0 {
+ return 0, errno
+ }
+
+ return int(n), nil
+}
+
+func Mkdirat(dirfd int, path string, mode uint32) error {
+ p, err := syscall.BytePtrFromString(path)
+ if err != nil {
+ return err
+ }
+
+ _, _, errno := syscall.Syscall6(mkdiratTrap,
+ uintptr(dirfd),
+ uintptr(unsafe.Pointer(p)),
+ uintptr(mode),
+ 0, 0, 0)
+ if errno != 0 {
+ return errno
+ }
+ return nil
+}
//go:cgo_import_dynamic libc_fstatat fstatat "libc.a/shr_64.o"
//go:cgo_import_dynamic libc_openat openat "libc.a/shr_64.o"
//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.a/shr_64.o"
+//go:cgo_import_dynamic libc_readlinkat readlinkat "libc.a/shr_64.o"
+//go:cgo_import_dynamic libc_mkdirat mkdirat "libc.a/shr_64.o"
const (
AT_EACCESS = 0x1
--- /dev/null
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:build darwin
+
+package unix
+
+import (
+ "internal/abi"
+ "syscall"
+ "unsafe"
+)
+
+func libc_readlinkat_trampoline()
+
+//go:cgo_import_dynamic libc_readlinkat readlinkat "/usr/lib/libSystem.B.dylib"
+
+func Readlinkat(dirfd int, path string, buf []byte) (int, error) {
+ p0, err := syscall.BytePtrFromString(path)
+ if err != nil {
+ return 0, err
+ }
+ var p1 unsafe.Pointer
+ if len(buf) > 0 {
+ p1 = unsafe.Pointer(&buf[0])
+ } else {
+ p1 = unsafe.Pointer(&_zero)
+ }
+ n, _, errno := syscall_syscall6(abi.FuncPCABI0(libc_readlinkat_trampoline),
+ uintptr(dirfd),
+ uintptr(unsafe.Pointer(p0)),
+ uintptr(p1),
+ uintptr(len(buf)),
+ 0,
+ 0)
+ if errno != 0 {
+ return 0, errno
+ }
+ return int(n), nil
+}
+
+func libc_mkdirat_trampoline()
+
+//go:cgo_import_dynamic libc_mkdirat mkdirat "/usr/lib/libSystem.B.dylib"
+
+func Mkdirat(dirfd int, path string, mode uint32) error {
+ p, err := syscall.BytePtrFromString(path)
+ if err != nil {
+ return err
+ }
+ _, _, errno := syscall_syscall(abi.FuncPCABI0(libc_mkdirat_trampoline),
+ uintptr(dirfd),
+ uintptr(unsafe.Pointer(p)),
+ uintptr(mode))
+ if errno != 0 {
+ return errno
+ }
+ return nil
+}
//go:linkname procFstatat libc_fstatat
//go:linkname procOpenat libc_openat
//go:linkname procUnlinkat libc_unlinkat
+//go:linkname procReadlinkat libc_readlinkat
+//go:linkname procMkdirat libc_mkdirat
var (
procFstatat,
procOpenat,
- procUnlinkat uintptr
+ procUnlinkat,
+ procReadlinkat,
+ procMkdirat uintptr
)
func Unlinkat(dirfd int, path string, flags int) error {
return nil
}
+
+func Readlinkat(dirfd int, path string, buf []byte) (int, error) {
+ p0, err := syscall.BytePtrFromString(path)
+ if err != nil {
+ return 0, err
+ }
+ var p1 unsafe.Pointer
+ if len(buf) > 0 {
+ p1 = unsafe.Pointer(&buf[0])
+ } else {
+ p1 = unsafe.Pointer(&_zero)
+ }
+ n, _, errno := syscall6(uintptr(unsafe.Pointer(&procReadlinkat)), 4,
+ uintptr(dirfd),
+ uintptr(unsafe.Pointer(p0)),
+ uintptr(p1),
+ uintptr(len(buf)),
+ 0, 0)
+ if errno != 0 {
+ return 0, errno
+ }
+
+ return int(n), nil
+}
+
+func Mkdirat(dirfd int, path string, mode uint32) error {
+ p, err := syscall.BytePtrFromString(path)
+ if err != nil {
+ return err
+ }
+
+ _, _, errno := syscall6(uintptr(unsafe.Pointer(&procMkdirat)), 3,
+ uintptr(dirfd),
+ uintptr(unsafe.Pointer(p)),
+ uintptr(mode),
+ 0, 0, 0)
+ if errno != 0 {
+ return errno
+ }
+ return nil
+}
--- /dev/null
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:build openbsd && !mips64
+
+package unix
+
+import (
+ "internal/abi"
+ "syscall"
+ "unsafe"
+)
+
+//go:cgo_import_dynamic libc_readlinkat readlinkat "libc.so"
+
+func libc_readlinkat_trampoline()
+
+func Readlinkat(dirfd int, path string, buf []byte) (int, error) {
+ p0, err := syscall.BytePtrFromString(path)
+ if err != nil {
+ return 0, err
+ }
+ var p1 unsafe.Pointer
+ if len(buf) > 0 {
+ p1 = unsafe.Pointer(&buf[0])
+ } else {
+ p1 = unsafe.Pointer(&_zero)
+ }
+ n, _, errno := syscall_syscall6(abi.FuncPCABI0(libc_readlinkat_trampoline), uintptr(dirfd), uintptr(unsafe.Pointer(p0)), uintptr(p1), uintptr(len(buf)), 0, 0)
+ if errno != 0 {
+ return 0, errno
+ }
+ return int(n), nil
+}
+
+//go:cgo_import_dynamic libc_mkdirat mkdirat "libc.so"
+
+func libc_mkdirat_trampoline()
+
+func Mkdirat(dirfd int, path string, mode uint32) error {
+ p, err := syscall.BytePtrFromString(path)
+ if err != nil {
+ return err
+ }
+ _, _, errno := syscall_syscall6(abi.FuncPCABI0(libc_mkdirat_trampoline), uintptr(dirfd), uintptr(unsafe.Pointer(p)), 0, 0, 0, 0)
+ if errno != 0 {
+ return errno
+ }
+ return nil
+}
//go:cgo_import_dynamic libc_fstatat fstatat "libc.so"
//go:cgo_import_dynamic libc_openat openat "libc.so"
//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so"
+//go:cgo_import_dynamic libc_readlinkat readlinkat "libc.so"
+//go:cgo_import_dynamic libc_mkdirat mkdirat "libc.so"
//go:cgo_import_dynamic libc_uname uname "libc.so"
const (
import "syscall"
const (
- unlinkatTrap uintptr = syscall.SYS_UNLINKAT
- openatTrap uintptr = syscall.SYS_OPENAT
- fstatatTrap uintptr = syscall.SYS_FSTATAT
+ unlinkatTrap uintptr = syscall.SYS_UNLINKAT
+ openatTrap uintptr = syscall.SYS_OPENAT
+ fstatatTrap uintptr = syscall.SYS_FSTATAT
+ readlinkatTrap uintptr = syscall.SYS_READLINKAT
+ mkdiratTrap uintptr = syscall.SYS_MKDIRAT
AT_EACCESS = 0x4
AT_FDCWD = 0xfffafdcd
unlinkatTrap uintptr = syscall.SYS_UNLINKAT
openatTrap uintptr = syscall.SYS_OPENAT
posixFallocateTrap uintptr = syscall.SYS_POSIX_FALLOCATE
+ readlinkatTrap uintptr = syscall.SYS_READLINKAT
+ mkdiratTrap uintptr = syscall.SYS_MKDIRAT
)
import "syscall"
-const unlinkatTrap uintptr = syscall.SYS_UNLINKAT
-const openatTrap uintptr = syscall.SYS_OPENAT
+const (
+ unlinkatTrap uintptr = syscall.SYS_UNLINKAT
+ openatTrap uintptr = syscall.SYS_OPENAT
+ readlinkatTrap uintptr = syscall.SYS_READLINKAT
+ mkdiratTrap uintptr = syscall.SYS_MKDIRAT
+)
const (
AT_EACCESS = 0x200
import "syscall"
-const unlinkatTrap uintptr = syscall.SYS_UNLINKAT
-const openatTrap uintptr = syscall.SYS_OPENAT
-const fstatatTrap uintptr = syscall.SYS_FSTATAT
+const (
+ unlinkatTrap uintptr = syscall.SYS_UNLINKAT
+ openatTrap uintptr = syscall.SYS_OPENAT
+ fstatatTrap uintptr = syscall.SYS_FSTATAT
+ readlinkatTrap uintptr = syscall.SYS_READLINKAT
+ mkdiratTrap uintptr = syscall.SYS_MKDIRAT
+)
const (
AT_EACCESS = 0x100
import "syscall"
-const unlinkatTrap uintptr = syscall.SYS_UNLINKAT
-const openatTrap uintptr = syscall.SYS_OPENAT
-const fstatatTrap uintptr = syscall.SYS_FSTATAT
+const (
+ unlinkatTrap uintptr = syscall.SYS_UNLINKAT
+ openatTrap uintptr = syscall.SYS_OPENAT
+ fstatatTrap uintptr = syscall.SYS_FSTATAT
+ readlinkatTrap uintptr = syscall.SYS_READLINKAT
+ mkdiratTrap uintptr = syscall.SYS_MKDIRAT
+)
const (
AT_EACCESS = 0x1
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+//go:build wasip1
+
package unix
+import (
+ "syscall"
+ "unsafe"
+)
+
const (
// UTIME_OMIT is the sentinel value to indicate that a time value should not
// be changed. It is useful for example to indicate for example with UtimesNano
// Its value must match syscall/fs_wasip1.go
UTIME_OMIT = -0x2
)
+
+func Readlinkat(dirfd int, path string, buf []byte) (int, error) {
+ var nwritten size
+ errno := path_readlink(
+ int32(dirfd),
+ unsafe.Pointer(unsafe.StringData(path)),
+ size(len(path)),
+ unsafe.Pointer(&buf[0]),
+ size(len(buf)),
+ unsafe.Pointer(&nwritten))
+ return int(nwritten), errnoErr(errno)
+
+}
+
+type (
+ size = uint32
+)
+
+//go:wasmimport wasi_snapshot_preview1 path_readlink
+//go:noescape
+func path_readlink(fd int32, path unsafe.Pointer, pathLen size, buf unsafe.Pointer, bufLen size, nwritten unsafe.Pointer) syscall.Errno
+
+func Mkdirat(dirfd int, path string, mode uint32) error {
+ if path == "" {
+ return syscall.EINVAL
+ }
+ return errnoErr(path_create_directory(
+ int32(dirfd),
+ unsafe.Pointer(unsafe.StringData(path)),
+ size(len(path)),
+ ))
+}
+
+//go:wasmimport wasi_snapshot_preview1 path_create_directory
+//go:noescape
+func path_create_directory(fd int32, path unsafe.Pointer, pathLen size) syscall.Errno
+
+func errnoErr(errno syscall.Errno) error {
+ if errno == 0 {
+ return nil
+ }
+ return errno
+}
--- /dev/null
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package unix
+
+// Single-word zero for use when we need a valid pointer to 0 bytes.
+var _zero uintptr
copyFileRangeTrap uintptr = 377
pidfdSendSignalTrap uintptr = 424
pidfdOpenTrap uintptr = 434
+ openat2Trap uintptr = 437
)
copyFileRangeTrap uintptr = 326
pidfdSendSignalTrap uintptr = 424
pidfdOpenTrap uintptr = 434
+ openat2Trap uintptr = 437
)
copyFileRangeTrap uintptr = 391
pidfdSendSignalTrap uintptr = 424
pidfdOpenTrap uintptr = 434
+ openat2Trap uintptr = 437
)
copyFileRangeTrap uintptr = 285
pidfdSendSignalTrap uintptr = 424
pidfdOpenTrap uintptr = 434
+ openat2Trap uintptr = 437
)
copyFileRangeTrap uintptr = 5320
pidfdSendSignalTrap uintptr = 5424
pidfdOpenTrap uintptr = 5434
+ openat2Trap uintptr = 5437
)
copyFileRangeTrap uintptr = 4360
pidfdSendSignalTrap uintptr = 4424
pidfdOpenTrap uintptr = 4434
+ openat2Trap uintptr = 4437
)
copyFileRangeTrap uintptr = 379
pidfdSendSignalTrap uintptr = 424
pidfdOpenTrap uintptr = 434
+ openat2Trap uintptr = 437
)
copyFileRangeTrap uintptr = 375
pidfdSendSignalTrap uintptr = 424
pidfdOpenTrap uintptr = 434
+ openat2Trap uintptr = 437
)