unix: add PidfdOpen and PidfdGetfd

Add wrappers for the pidfd_open and pidfd_getfd sycalls, available since 5.3.

PIDFD_NONBLOCK is defined manually since mkerrors.sh doesn't handle including
linux/pidfd.h well.

See https://man7.org/linux/man-pages/man2/pidfd_open.2.html

Change-Id: I68dfb52f6a7a44b7f3324a8379860a1bb765e71b
Reviewed-on: https://go-review.googlesource.com/c/sys/+/347332
Reviewed-by: Tobias Klauser <tobias.klauser@gmail.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
This commit is contained in:
Lorenz Bauer
2021-09-08 10:09:57 +01:00
committed by Ian Lance Taylor
parent aa78b53d33
commit 528a39cd75
17 changed files with 87 additions and 0 deletions

View File

@@ -3829,3 +3829,9 @@ type LandlockPathBeneathAttr C.struct_landlock_path_beneath_attr
const (
LANDLOCK_RULE_PATH_BENEATH = C.LANDLOCK_RULE_PATH_BENEATH
)
// pidfd flags.
const (
PIDFD_NONBLOCK = C.O_NONBLOCK
)

View File

@@ -2288,6 +2288,9 @@ type RemoteIovec struct {
//sys ProcessVMReadv(pid int, localIov []Iovec, remoteIov []RemoteIovec, flags uint) (n int, err error) = SYS_PROCESS_VM_READV
//sys ProcessVMWritev(pid int, localIov []Iovec, remoteIov []RemoteIovec, flags uint) (n int, err error) = SYS_PROCESS_VM_WRITEV
//sys PidfdOpen(pid int, flags int) (fd int, err error) = SYS_PIDFD_OPEN
//sys PidfdGetfd(pidfd int, targetfd int, flags int) (fd int, err error) = SYS_PIDFD_GETFD
/*
* Unimplemented
*/

View File

@@ -1945,6 +1945,28 @@ func ProcessVMWritev(pid int, localIov []Iovec, remoteIov []RemoteIovec, flags u
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func PidfdOpen(pid int, flags int) (fd int, err error) {
r0, _, e1 := Syscall(SYS_PIDFD_OPEN, uintptr(pid), uintptr(flags), 0)
fd = int(r0)
if e1 != 0 {
err = errnoErr(e1)
}
return
}
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func PidfdGetfd(pidfd int, targetfd int, flags int) (fd int, err error) {
r0, _, e1 := Syscall(SYS_PIDFD_GETFD, uintptr(pidfd), uintptr(targetfd), uintptr(flags))
fd = int(r0)
if e1 != 0 {
err = errnoErr(e1)
}
return
}
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func pipe2(p *[2]_C_int, flags int) (err error) {
_, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)
if e1 != 0 {

View File

@@ -635,3 +635,7 @@ const (
PPS_GETCAP = 0x800470a3
PPS_FETCH = 0xc00470a4
)
const (
PIDFD_NONBLOCK = 0x800
)

View File

@@ -653,3 +653,7 @@ const (
PPS_GETCAP = 0x800870a3
PPS_FETCH = 0xc00870a4
)
const (
PIDFD_NONBLOCK = 0x800
)

View File

@@ -630,3 +630,7 @@ const (
PPS_GETCAP = 0x800470a3
PPS_FETCH = 0xc00470a4
)
const (
PIDFD_NONBLOCK = 0x800
)

View File

@@ -632,3 +632,7 @@ const (
PPS_GETCAP = 0x800870a3
PPS_FETCH = 0xc00870a4
)
const (
PIDFD_NONBLOCK = 0x800
)

View File

@@ -636,3 +636,7 @@ const (
PPS_GETCAP = 0x400470a3
PPS_FETCH = 0xc00470a4
)
const (
PIDFD_NONBLOCK = 0x80
)

View File

@@ -635,3 +635,7 @@ const (
PPS_GETCAP = 0x400870a3
PPS_FETCH = 0xc00870a4
)
const (
PIDFD_NONBLOCK = 0x80
)

View File

@@ -635,3 +635,7 @@ const (
PPS_GETCAP = 0x400870a3
PPS_FETCH = 0xc00870a4
)
const (
PIDFD_NONBLOCK = 0x80
)

View File

@@ -636,3 +636,7 @@ const (
PPS_GETCAP = 0x400470a3
PPS_FETCH = 0xc00470a4
)
const (
PIDFD_NONBLOCK = 0x80
)

View File

@@ -642,3 +642,7 @@ const (
PPS_GETCAP = 0x400470a3
PPS_FETCH = 0xc00470a4
)
const (
PIDFD_NONBLOCK = 0x800
)

View File

@@ -642,3 +642,7 @@ const (
PPS_GETCAP = 0x400870a3
PPS_FETCH = 0xc00870a4
)
const (
PIDFD_NONBLOCK = 0x800
)

View File

@@ -642,3 +642,7 @@ const (
PPS_GETCAP = 0x400870a3
PPS_FETCH = 0xc00870a4
)
const (
PIDFD_NONBLOCK = 0x800
)

View File

@@ -660,3 +660,7 @@ const (
PPS_GETCAP = 0x800870a3
PPS_FETCH = 0xc00870a4
)
const (
PIDFD_NONBLOCK = 0x800
)

View File

@@ -656,3 +656,7 @@ const (
PPS_GETCAP = 0x800870a3
PPS_FETCH = 0xc00870a4
)
const (
PIDFD_NONBLOCK = 0x800
)

View File

@@ -637,3 +637,7 @@ const (
PPS_GETCAP = 0x400870a3
PPS_FETCH = 0xc00870a4
)
const (
PIDFD_NONBLOCK = 0x4000
)