From 07c388f17c039c0bb9a3fd0fd70bf5494aa7ee2c Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Tue, 7 Nov 2023 13:10:48 +0100 Subject: [PATCH] syscall: use fchmodat2 in Fchmodat The fchmodat2 syscall was added in Linux kernel 6.6. Mirror the implementation in golang.org/x/sys/unix.Fchmodat (CL 539635) and use fchmodat2 in Fchmodat if flags are given. It will return ENOSYS on older kernels (or EINVAL or any other bogus error in some container implementations). Also update ztypes_linux_$GOARCH.go for all linux platforms to add _AT_EMPTY_PATH. It was added to linux/types in CL 407694 but was only updated for linux/loong64 at that time. Updates #61636 Change-Id: I863d06e35cd366f1cf99052e9f77c22ab8168b3f Reviewed-on: https://go-review.googlesource.com/c/go/+/540435 Reviewed-by: Mauri de Souza Meneguzzo TryBot-Result: Gopher Robot Run-TryBot: Tobias Klauser LUCI-TryBot-Result: Go LUCI Reviewed-by: Heschi Kreinick Reviewed-by: Bryan Mills Auto-Submit: Tobias Klauser --- src/syscall/syscall_linux.go | 26 +++++++++++++++++--------- src/syscall/syscall_linux_386.go | 1 + src/syscall/syscall_linux_amd64.go | 1 + src/syscall/syscall_linux_arm.go | 1 + src/syscall/syscall_linux_arm64.go | 1 + src/syscall/syscall_linux_loong64.go | 1 + src/syscall/syscall_linux_mips64x.go | 1 + src/syscall/syscall_linux_mipsx.go | 1 + src/syscall/syscall_linux_ppc64x.go | 1 + src/syscall/syscall_linux_riscv64.go | 1 + src/syscall/syscall_linux_s390x.go | 1 + src/syscall/zsyscall_linux_386.go | 15 +++++++++++++++ src/syscall/zsyscall_linux_amd64.go | 15 +++++++++++++++ src/syscall/zsyscall_linux_arm.go | 15 +++++++++++++++ src/syscall/zsyscall_linux_arm64.go | 15 +++++++++++++++ src/syscall/zsyscall_linux_loong64.go | 15 +++++++++++++++ src/syscall/zsyscall_linux_mips.go | 15 +++++++++++++++ src/syscall/zsyscall_linux_mips64.go | 15 +++++++++++++++ src/syscall/zsyscall_linux_mips64le.go | 15 +++++++++++++++ src/syscall/zsyscall_linux_mipsle.go | 15 +++++++++++++++ src/syscall/zsyscall_linux_ppc64.go | 15 +++++++++++++++ src/syscall/zsyscall_linux_ppc64le.go | 15 +++++++++++++++ src/syscall/zsyscall_linux_riscv64.go | 15 +++++++++++++++ src/syscall/zsyscall_linux_s390x.go | 15 +++++++++++++++ src/syscall/ztypes_linux_386.go | 1 + src/syscall/ztypes_linux_amd64.go | 1 + src/syscall/ztypes_linux_arm.go | 1 + src/syscall/ztypes_linux_arm64.go | 1 + src/syscall/ztypes_linux_mips.go | 1 + src/syscall/ztypes_linux_mips64.go | 1 + src/syscall/ztypes_linux_mips64le.go | 1 + src/syscall/ztypes_linux_mipsle.go | 1 + src/syscall/ztypes_linux_ppc64.go | 1 + src/syscall/ztypes_linux_ppc64le.go | 1 + src/syscall/ztypes_linux_riscv64.go | 1 + src/syscall/ztypes_linux_s390x.go | 1 + 36 files changed, 234 insertions(+), 9 deletions(-) diff --git a/src/syscall/syscall_linux.go b/src/syscall/syscall_linux.go index 96ad4fbe3f..b6e84203e8 100644 --- a/src/syscall/syscall_linux.go +++ b/src/syscall/syscall_linux.go @@ -241,15 +241,23 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { } //sys fchmodat(dirfd int, path string, mode uint32) (err error) - -func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { - // Linux fchmodat doesn't support the flags parameter. Mimic glibc's behavior - // and check the flags. Otherwise the mode would be applied to the symlink - // destination which is not what the user expects. - if flags&^_AT_SYMLINK_NOFOLLOW != 0 { - return EINVAL - } else if flags&_AT_SYMLINK_NOFOLLOW != 0 { - return EOPNOTSUPP +//sys fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) = _SYS_fchmodat2 + +func Fchmodat(dirfd int, path string, mode uint32, flags int) error { + // Linux fchmodat doesn't support the flags parameter, but fchmodat2 does. + // Try fchmodat2 if flags are specified. + if flags != 0 { + err := fchmodat2(dirfd, path, mode, flags) + if err == ENOSYS { + // fchmodat2 isn't available. If the flags are known to be valid, + // return EOPNOTSUPP to indicate that fchmodat doesn't support them. + if flags&^(_AT_SYMLINK_NOFOLLOW|_AT_EMPTY_PATH) != 0 { + return EINVAL + } else if flags&(_AT_SYMLINK_NOFOLLOW|_AT_EMPTY_PATH) != 0 { + return EOPNOTSUPP + } + } + return err } return fchmodat(dirfd, path, mode) } diff --git a/src/syscall/syscall_linux_386.go b/src/syscall/syscall_linux_386.go index f9d47236e5..1ab6c5e148 100644 --- a/src/syscall/syscall_linux_386.go +++ b/src/syscall/syscall_linux_386.go @@ -11,6 +11,7 @@ const ( _SYS_clone3 = 435 _SYS_faccessat2 = 439 _SYS_pidfd_send_signal = 424 + _SYS_fchmodat2 = 452 ) func setTimespec(sec, nsec int64) Timespec { diff --git a/src/syscall/syscall_linux_amd64.go b/src/syscall/syscall_linux_amd64.go index 0652590cfe..1083a507c7 100644 --- a/src/syscall/syscall_linux_amd64.go +++ b/src/syscall/syscall_linux_amd64.go @@ -13,6 +13,7 @@ const ( _SYS_clone3 = 435 _SYS_faccessat2 = 439 _SYS_pidfd_send_signal = 424 + _SYS_fchmodat2 = 452 ) //sys Dup2(oldfd int, newfd int) (err error) diff --git a/src/syscall/syscall_linux_arm.go b/src/syscall/syscall_linux_arm.go index 15c53d64b6..2641cd2868 100644 --- a/src/syscall/syscall_linux_arm.go +++ b/src/syscall/syscall_linux_arm.go @@ -11,6 +11,7 @@ const ( _SYS_clone3 = 435 _SYS_faccessat2 = 439 _SYS_pidfd_send_signal = 424 + _SYS_fchmodat2 = 452 ) func setTimespec(sec, nsec int64) Timespec { diff --git a/src/syscall/syscall_linux_arm64.go b/src/syscall/syscall_linux_arm64.go index 48067e22dd..74d6e3a958 100644 --- a/src/syscall/syscall_linux_arm64.go +++ b/src/syscall/syscall_linux_arm64.go @@ -11,6 +11,7 @@ const ( _SYS_clone3 = 435 _SYS_faccessat2 = 439 _SYS_pidfd_send_signal = 424 + _SYS_fchmodat2 = 452 ) //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT diff --git a/src/syscall/syscall_linux_loong64.go b/src/syscall/syscall_linux_loong64.go index 62533e8011..eb275bc717 100644 --- a/src/syscall/syscall_linux_loong64.go +++ b/src/syscall/syscall_linux_loong64.go @@ -11,6 +11,7 @@ const ( _SYS_clone3 = 435 _SYS_faccessat2 = 439 _SYS_pidfd_send_signal = 424 + _SYS_fchmodat2 = 452 ) //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT diff --git a/src/syscall/syscall_linux_mips64x.go b/src/syscall/syscall_linux_mips64x.go index 061585a1bf..3bdee928ed 100644 --- a/src/syscall/syscall_linux_mips64x.go +++ b/src/syscall/syscall_linux_mips64x.go @@ -15,6 +15,7 @@ const ( _SYS_clone3 = 5435 _SYS_faccessat2 = 5439 _SYS_pidfd_send_signal = 5424 + _SYS_fchmodat2 = 5452 ) //sys Dup2(oldfd int, newfd int) (err error) diff --git a/src/syscall/syscall_linux_mipsx.go b/src/syscall/syscall_linux_mipsx.go index 168148ab24..7253c648e7 100644 --- a/src/syscall/syscall_linux_mipsx.go +++ b/src/syscall/syscall_linux_mipsx.go @@ -13,6 +13,7 @@ const ( _SYS_clone3 = 4435 _SYS_faccessat2 = 4439 _SYS_pidfd_send_signal = 4424 + _SYS_fchmodat2 = 4452 ) func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) diff --git a/src/syscall/syscall_linux_ppc64x.go b/src/syscall/syscall_linux_ppc64x.go index 91cd9838c3..9cfe2dc695 100644 --- a/src/syscall/syscall_linux_ppc64x.go +++ b/src/syscall/syscall_linux_ppc64x.go @@ -15,6 +15,7 @@ const ( _SYS_clone3 = 435 _SYS_faccessat2 = 439 _SYS_pidfd_send_signal = 424 + _SYS_fchmodat2 = 452 ) //sys Dup2(oldfd int, newfd int) (err error) diff --git a/src/syscall/syscall_linux_riscv64.go b/src/syscall/syscall_linux_riscv64.go index 50c3988e82..61fb4c1668 100644 --- a/src/syscall/syscall_linux_riscv64.go +++ b/src/syscall/syscall_linux_riscv64.go @@ -11,6 +11,7 @@ const ( _SYS_clone3 = 435 _SYS_faccessat2 = 439 _SYS_pidfd_send_signal = 424 + _SYS_fchmodat2 = 452 ) //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT diff --git a/src/syscall/syscall_linux_s390x.go b/src/syscall/syscall_linux_s390x.go index ecdabbf98f..3a0afc404a 100644 --- a/src/syscall/syscall_linux_s390x.go +++ b/src/syscall/syscall_linux_s390x.go @@ -11,6 +11,7 @@ const ( _SYS_clone3 = 435 _SYS_faccessat2 = 439 _SYS_pidfd_send_signal = 424 + _SYS_fchmodat2 = 452 ) //sys Dup2(oldfd int, newfd int) (err error) diff --git a/src/syscall/zsyscall_linux_386.go b/src/syscall/zsyscall_linux_386.go index 51f2066558..661cfe7bed 100644 --- a/src/syscall/zsyscall_linux_386.go +++ b/src/syscall/zsyscall_linux_386.go @@ -54,6 +54,21 @@ func fchmodat(dirfd int, path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(_SYS_fchmodat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) diff --git a/src/syscall/zsyscall_linux_amd64.go b/src/syscall/zsyscall_linux_amd64.go index be00d5857a..9d05781893 100644 --- a/src/syscall/zsyscall_linux_amd64.go +++ b/src/syscall/zsyscall_linux_amd64.go @@ -54,6 +54,21 @@ func fchmodat(dirfd int, path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(_SYS_fchmodat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) diff --git a/src/syscall/zsyscall_linux_arm.go b/src/syscall/zsyscall_linux_arm.go index 245a44a4d8..a386120f78 100644 --- a/src/syscall/zsyscall_linux_arm.go +++ b/src/syscall/zsyscall_linux_arm.go @@ -54,6 +54,21 @@ func fchmodat(dirfd int, path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(_SYS_fchmodat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) diff --git a/src/syscall/zsyscall_linux_arm64.go b/src/syscall/zsyscall_linux_arm64.go index fa0d8fd110..a1c91071f1 100644 --- a/src/syscall/zsyscall_linux_arm64.go +++ b/src/syscall/zsyscall_linux_arm64.go @@ -54,6 +54,21 @@ func fchmodat(dirfd int, path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(_SYS_fchmodat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) diff --git a/src/syscall/zsyscall_linux_loong64.go b/src/syscall/zsyscall_linux_loong64.go index 74ec8f50c5..e32c87d9b8 100644 --- a/src/syscall/zsyscall_linux_loong64.go +++ b/src/syscall/zsyscall_linux_loong64.go @@ -54,6 +54,21 @@ func fchmodat(dirfd int, path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(_SYS_fchmodat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) diff --git a/src/syscall/zsyscall_linux_mips.go b/src/syscall/zsyscall_linux_mips.go index 2f4ecb3dac..7e216b04ea 100644 --- a/src/syscall/zsyscall_linux_mips.go +++ b/src/syscall/zsyscall_linux_mips.go @@ -54,6 +54,21 @@ func fchmodat(dirfd int, path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(_SYS_fchmodat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) diff --git a/src/syscall/zsyscall_linux_mips64.go b/src/syscall/zsyscall_linux_mips64.go index e99d85aab2..8c894b1088 100644 --- a/src/syscall/zsyscall_linux_mips64.go +++ b/src/syscall/zsyscall_linux_mips64.go @@ -54,6 +54,21 @@ func fchmodat(dirfd int, path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(_SYS_fchmodat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) diff --git a/src/syscall/zsyscall_linux_mips64le.go b/src/syscall/zsyscall_linux_mips64le.go index a856ee370b..812a6ba8e6 100644 --- a/src/syscall/zsyscall_linux_mips64le.go +++ b/src/syscall/zsyscall_linux_mips64le.go @@ -54,6 +54,21 @@ func fchmodat(dirfd int, path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(_SYS_fchmodat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) diff --git a/src/syscall/zsyscall_linux_mipsle.go b/src/syscall/zsyscall_linux_mipsle.go index ab9b1c86ff..d32a8afa4f 100644 --- a/src/syscall/zsyscall_linux_mipsle.go +++ b/src/syscall/zsyscall_linux_mipsle.go @@ -54,6 +54,21 @@ func fchmodat(dirfd int, path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(_SYS_fchmodat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) diff --git a/src/syscall/zsyscall_linux_ppc64.go b/src/syscall/zsyscall_linux_ppc64.go index c22a14f939..c321267b9b 100644 --- a/src/syscall/zsyscall_linux_ppc64.go +++ b/src/syscall/zsyscall_linux_ppc64.go @@ -54,6 +54,21 @@ func fchmodat(dirfd int, path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(_SYS_fchmodat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) diff --git a/src/syscall/zsyscall_linux_ppc64le.go b/src/syscall/zsyscall_linux_ppc64le.go index 381b2a5501..40475d76bf 100644 --- a/src/syscall/zsyscall_linux_ppc64le.go +++ b/src/syscall/zsyscall_linux_ppc64le.go @@ -54,6 +54,21 @@ func fchmodat(dirfd int, path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(_SYS_fchmodat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) diff --git a/src/syscall/zsyscall_linux_riscv64.go b/src/syscall/zsyscall_linux_riscv64.go index b3254c8217..dc74acfc88 100644 --- a/src/syscall/zsyscall_linux_riscv64.go +++ b/src/syscall/zsyscall_linux_riscv64.go @@ -54,6 +54,21 @@ func fchmodat(dirfd int, path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(_SYS_fchmodat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) diff --git a/src/syscall/zsyscall_linux_s390x.go b/src/syscall/zsyscall_linux_s390x.go index 2223808cbd..cc189d9ea7 100644 --- a/src/syscall/zsyscall_linux_s390x.go +++ b/src/syscall/zsyscall_linux_s390x.go @@ -54,6 +54,21 @@ func fchmodat(dirfd int, path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(_SYS_fchmodat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) diff --git a/src/syscall/ztypes_linux_386.go b/src/syscall/ztypes_linux_386.go index a45511e847..79a46a4aba 100644 --- a/src/syscall/ztypes_linux_386.go +++ b/src/syscall/ztypes_linux_386.go @@ -577,6 +577,7 @@ const ( _AT_REMOVEDIR = 0x200 _AT_SYMLINK_NOFOLLOW = 0x100 _AT_EACCESS = 0x200 + _AT_EMPTY_PATH = 0x1000 ) type pollFd struct { diff --git a/src/syscall/ztypes_linux_amd64.go b/src/syscall/ztypes_linux_amd64.go index 1bab13bf43..3d223fe256 100644 --- a/src/syscall/ztypes_linux_amd64.go +++ b/src/syscall/ztypes_linux_amd64.go @@ -595,6 +595,7 @@ const ( _AT_REMOVEDIR = 0x200 _AT_SYMLINK_NOFOLLOW = 0x100 _AT_EACCESS = 0x200 + _AT_EMPTY_PATH = 0x1000 ) type pollFd struct { diff --git a/src/syscall/ztypes_linux_arm.go b/src/syscall/ztypes_linux_arm.go index a4d61bd19b..9db1142c22 100644 --- a/src/syscall/ztypes_linux_arm.go +++ b/src/syscall/ztypes_linux_arm.go @@ -566,6 +566,7 @@ const ( _AT_REMOVEDIR = 0x200 _AT_SYMLINK_NOFOLLOW = 0x100 _AT_EACCESS = 0x200 + _AT_EMPTY_PATH = 0x1000 ) type pollFd struct { diff --git a/src/syscall/ztypes_linux_arm64.go b/src/syscall/ztypes_linux_arm64.go index 1e469c36d2..996950f4b0 100644 --- a/src/syscall/ztypes_linux_arm64.go +++ b/src/syscall/ztypes_linux_arm64.go @@ -574,6 +574,7 @@ const ( _AT_REMOVEDIR = 0x200 _AT_SYMLINK_NOFOLLOW = 0x100 _AT_EACCESS = 0x200 + _AT_EMPTY_PATH = 0x1000 ) type pollFd struct { diff --git a/src/syscall/ztypes_linux_mips.go b/src/syscall/ztypes_linux_mips.go index 621ef2d5a8..4ce84978b1 100644 --- a/src/syscall/ztypes_linux_mips.go +++ b/src/syscall/ztypes_linux_mips.go @@ -572,6 +572,7 @@ const ( _AT_REMOVEDIR = 0x200 _AT_SYMLINK_NOFOLLOW = 0x100 _AT_EACCESS = 0x200 + _AT_EMPTY_PATH = 0x1000 ) type pollFd struct { diff --git a/src/syscall/ztypes_linux_mips64.go b/src/syscall/ztypes_linux_mips64.go index 75a5bc4589..de39e732c8 100644 --- a/src/syscall/ztypes_linux_mips64.go +++ b/src/syscall/ztypes_linux_mips64.go @@ -579,6 +579,7 @@ const ( _AT_REMOVEDIR = 0x200 _AT_SYMLINK_NOFOLLOW = 0x100 _AT_EACCESS = 0x200 + _AT_EMPTY_PATH = 0x1000 ) type pollFd struct { diff --git a/src/syscall/ztypes_linux_mips64le.go b/src/syscall/ztypes_linux_mips64le.go index 75a5bc4589..de39e732c8 100644 --- a/src/syscall/ztypes_linux_mips64le.go +++ b/src/syscall/ztypes_linux_mips64le.go @@ -579,6 +579,7 @@ const ( _AT_REMOVEDIR = 0x200 _AT_SYMLINK_NOFOLLOW = 0x100 _AT_EACCESS = 0x200 + _AT_EMPTY_PATH = 0x1000 ) type pollFd struct { diff --git a/src/syscall/ztypes_linux_mipsle.go b/src/syscall/ztypes_linux_mipsle.go index 621ef2d5a8..4ce84978b1 100644 --- a/src/syscall/ztypes_linux_mipsle.go +++ b/src/syscall/ztypes_linux_mipsle.go @@ -572,6 +572,7 @@ const ( _AT_REMOVEDIR = 0x200 _AT_SYMLINK_NOFOLLOW = 0x100 _AT_EACCESS = 0x200 + _AT_EMPTY_PATH = 0x1000 ) type pollFd struct { diff --git a/src/syscall/ztypes_linux_ppc64.go b/src/syscall/ztypes_linux_ppc64.go index c830cee966..717e273425 100644 --- a/src/syscall/ztypes_linux_ppc64.go +++ b/src/syscall/ztypes_linux_ppc64.go @@ -584,6 +584,7 @@ const ( _AT_REMOVEDIR = 0x200 _AT_SYMLINK_NOFOLLOW = 0x100 _AT_EACCESS = 0x200 + _AT_EMPTY_PATH = 0x1000 ) type pollFd struct { diff --git a/src/syscall/ztypes_linux_ppc64le.go b/src/syscall/ztypes_linux_ppc64le.go index 770ddc9fe9..177c1f1e37 100644 --- a/src/syscall/ztypes_linux_ppc64le.go +++ b/src/syscall/ztypes_linux_ppc64le.go @@ -584,6 +584,7 @@ const ( _AT_REMOVEDIR = 0x200 _AT_SYMLINK_NOFOLLOW = 0x100 _AT_EACCESS = 0x200 + _AT_EMPTY_PATH = 0x1000 ) type pollFd struct { diff --git a/src/syscall/ztypes_linux_riscv64.go b/src/syscall/ztypes_linux_riscv64.go index f6b9cede0e..a6c4d7884a 100644 --- a/src/syscall/ztypes_linux_riscv64.go +++ b/src/syscall/ztypes_linux_riscv64.go @@ -599,6 +599,7 @@ const ( _AT_REMOVEDIR = 0x200 _AT_SYMLINK_NOFOLLOW = 0x100 _AT_EACCESS = 0x200 + _AT_EMPTY_PATH = 0x1000 ) type pollFd struct { diff --git a/src/syscall/ztypes_linux_s390x.go b/src/syscall/ztypes_linux_s390x.go index b67877f065..5c5a71461e 100644 --- a/src/syscall/ztypes_linux_s390x.go +++ b/src/syscall/ztypes_linux_s390x.go @@ -598,6 +598,7 @@ const ( _AT_REMOVEDIR = 0x200 _AT_SYMLINK_NOFOLLOW = 0x100 _AT_EACCESS = 0x200 + _AT_EMPTY_PATH = 0x1000 ) type pollFd struct { -- 2.44.0