diff --git a/unix/linux/types.go b/unix/linux/types.go index 1902573c..f2cbd2d4 100644 --- a/unix/linux/types.go +++ b/unix/linux/types.go @@ -968,7 +968,7 @@ const ( ) type Sigset_t C.sigset_t -type pselect6Sigset_t struct { +type sigset_argpack struct { ss *Sigset_t ssLen uintptr // Size (in bytes) of object pointed to by ss. } diff --git a/unix/syscall_linux.go b/unix/syscall_linux.go index e2966880..d2025c16 100644 --- a/unix/syscall_linux.go +++ b/unix/syscall_linux.go @@ -1885,7 +1885,7 @@ func Getpgrp() (pid int) { //sys PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) //sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT //sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) -//sys pselect6(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *pselect6Sigset_t) (n int, err error) +//sys pselect6(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *sigset_argpack) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Removexattr(path string, attr string) (err error) //sys Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) @@ -2450,16 +2450,17 @@ func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask * // The final argument of the pselect6() system call is not a // sigset_t * pointer, but is instead a structure - var kernelMask *pselect6Sigset_t + var kernelMask *sigset_argpack if sigmask != nil { - wordBits := 32 << (^uintptr(0) >> 63) - sigsetWords := (_C__NSIG - 1 + wordBits - 1) / (wordBits) + wordBits := 32 << (^uintptr(0) >> 63) // see math.intSize // A sigset stores one bit per signal, // offset by 1 (because signal 0 does not exist). // So the number of words needed is ⌈__C_NSIG - 1 / wordBits⌉. + sigsetWords := (_C__NSIG - 1 + wordBits - 1) / (wordBits) + sigsetBytes := sigsetWords * (wordBits / 8) - kernelMask = &pselect6Sigset_t{ + kernelMask = &sigset_argpack{ ss: sigmask, ssLen: uintptr(sigsetBytes), } diff --git a/unix/zsyscall_linux.go b/unix/zsyscall_linux.go index 44e033a1..a07321be 100644 --- a/unix/zsyscall_linux.go +++ b/unix/zsyscall_linux.go @@ -1356,7 +1356,7 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) ( // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pselect6(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *pselect6Sigset_t) (n int, err error) { +func pselect6(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *sigset_argpack) (n int, err error) { r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) n = int(r0) if e1 != 0 { diff --git a/unix/ztypes_linux.go b/unix/ztypes_linux.go index 69f3eecf..26ef52aa 100644 --- a/unix/ztypes_linux.go +++ b/unix/ztypes_linux.go @@ -866,7 +866,7 @@ const ( POLLNVAL = 0x20 ) -type pselect6Sigset_t struct { +type sigset_argpack struct { ss *Sigset_t ssLen uintptr }