diff --git a/unix/syscall_darwin.go b/unix/syscall_darwin.go index a8c13317..b799c5d7 100644 --- a/unix/syscall_darwin.go +++ b/unix/syscall_darwin.go @@ -430,6 +430,23 @@ func GetsockoptXucred(fd, level, opt int) (*Xucred, error) { return x, err } +func SysctlKinfoProc(name string, args ...int) (*KinfoProc, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return nil, err + } + + var kinfo KinfoProc + n := uintptr(SizeofKinfoProc) + if err := sysctl(mib, (*byte)(unsafe.Pointer(&kinfo)), &n, nil, 0); err != nil { + return nil, err + } + if n != SizeofKinfoProc { + return nil, EIO + } + return &kinfo, nil +} + func SysctlKinfoProcSlice(name string) ([]KinfoProc, error) { mib, err := sysctlmib(name) if err != nil { diff --git a/unix/syscall_darwin_test.go b/unix/syscall_darwin_test.go index 731488f4..9a68bfba 100644 --- a/unix/syscall_darwin_test.go +++ b/unix/syscall_darwin_test.go @@ -256,3 +256,14 @@ func TestGetsockoptXucred(t *testing.T) { } } } + +func TestSysctlKinfoProc(t *testing.T) { + pid := unix.Getpid() + kp, err := unix.SysctlKinfoProc("kern.proc.pid", pid) + if err != nil { + t.Fatalf("SysctlKinfoProc: %v", err) + } + if got, want := int(kp.Proc.P_pid), pid; got != want { + t.Errorf("got pid %d, want %d", got, want) + } +}