diff --git a/unix/syscall_bsd.go b/unix/syscall_bsd.go index 68605db6..60bbe10a 100644 --- a/unix/syscall_bsd.go +++ b/unix/syscall_bsd.go @@ -527,6 +527,23 @@ func SysctlClockinfo(name string) (*Clockinfo, error) { return &ci, nil } +func SysctlTimeval(name string) (*Timeval, error) { + mib, err := sysctlmib(name) + if err != nil { + return nil, err + } + + var tv Timeval + n := uintptr(unsafe.Sizeof(tv)) + if err := sysctl(mib, (*byte)(unsafe.Pointer(&tv)), &n, nil, 0); err != nil { + return nil, err + } + if n != unsafe.Sizeof(tv) { + return nil, EIO + } + return &tv, nil +} + //sys utimes(path string, timeval *[2]Timeval) (err error) func Utimes(path string, tv []Timeval) error { diff --git a/unix/syscall_bsd_test.go b/unix/syscall_bsd_test.go index f8ec9d1c..81937fbd 100644 --- a/unix/syscall_bsd_test.go +++ b/unix/syscall_bsd_test.go @@ -10,6 +10,7 @@ import ( "os/exec" "runtime" "testing" + "time" "golang.org/x/sys/unix" ) @@ -73,3 +74,11 @@ func TestSysctlClockinfo(t *testing.T) { t.Logf("tick = %v, hz = %v, profhz = %v, stathz = %v", ci.Tick, ci.Hz, ci.Profhz, ci.Stathz) } + +func TestSysctlTimeval(t *testing.T) { + tv, err := unix.SysctlTimeval("kern.boottime") + if err != nil { + t.Fatal(err) + } + t.Logf("boottime = %v", time.Unix(tv.Unix())) +}