unix: add SysctlClockinfo on dragonfly and freebsd

Change-Id: I0d439b5c59c79594c6ecfebe0375971e1344cc09
Reviewed-on: https://go-review.googlesource.com/c/sys/+/213400
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/unix/syscall_bsd.go b/unix/syscall_bsd.go
index c704054..68605db 100644
--- a/unix/syscall_bsd.go
+++ b/unix/syscall_bsd.go
@@ -510,6 +510,23 @@
 	return buf[:n], nil
 }
 
+func SysctlClockinfo(name string) (*Clockinfo, error) {
+	mib, err := sysctlmib(name)
+	if err != nil {
+		return nil, err
+	}
+
+	n := uintptr(SizeofClockinfo)
+	var ci Clockinfo
+	if err := sysctl(mib, (*byte)(unsafe.Pointer(&ci)), &n, nil, 0); err != nil {
+		return nil, err
+	}
+	if n != SizeofClockinfo {
+		return nil, EIO
+	}
+	return &ci, 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 b552324..f8ec9d1 100644
--- a/unix/syscall_bsd_test.go
+++ b/unix/syscall_bsd_test.go
@@ -64,3 +64,12 @@
 	}
 	t.Logf("kern.maxproc: %v", maxproc)
 }
+
+func TestSysctlClockinfo(t *testing.T) {
+	ci, err := unix.SysctlClockinfo("kern.clockrate")
+	if err != nil {
+		t.Fatal(err)
+	}
+	t.Logf("tick = %v, hz = %v, profhz = %v, stathz = %v",
+		ci.Tick, ci.Hz, ci.Profhz, ci.Stathz)
+}
diff --git a/unix/syscall_darwin.go b/unix/syscall_darwin.go
index 3440c52..9a5a6ee 100644
--- a/unix/syscall_darwin.go
+++ b/unix/syscall_darwin.go
@@ -155,23 +155,6 @@
 
 //sys getattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error)
 
-func SysctlClockinfo(name string) (*Clockinfo, error) {
-	mib, err := sysctlmib(name)
-	if err != nil {
-		return nil, err
-	}
-
-	n := uintptr(SizeofClockinfo)
-	var ci Clockinfo
-	if err := sysctl(mib, (*byte)(unsafe.Pointer(&ci)), &n, nil, 0); err != nil {
-		return nil, err
-	}
-	if n != SizeofClockinfo {
-		return nil, EIO
-	}
-	return &ci, nil
-}
-
 //sysnb pipe() (r int, w int, err error)
 
 func Pipe(p []int) (err error) {
diff --git a/unix/syscall_darwin_test.go b/unix/syscall_darwin_test.go
index 4a9b50c..65691d5 100644
--- a/unix/syscall_darwin_test.go
+++ b/unix/syscall_darwin_test.go
@@ -4,12 +4,6 @@
 
 package unix_test
 
-import (
-	"testing"
-
-	"golang.org/x/sys/unix"
-)
-
 // stringsFromByteSlice converts a sequence of attributes to a []string.
 // On Darwin, each entry is a NULL-terminated string.
 func stringsFromByteSlice(buf []byte) []string {
@@ -23,12 +17,3 @@
 	}
 	return result
 }
-
-func TestSysctlClockinfo(t *testing.T) {
-	ci, err := unix.SysctlClockinfo("kern.clockrate")
-	if err != nil {
-		t.Fatal(err)
-	}
-	t.Logf("tick = %v, tickadj = %v, hz = %v, profhz = %v, stathz = %v",
-		ci.Tick, ci.Tickadj, ci.Hz, ci.Profhz, ci.Stathz)
-}
diff --git a/unix/syscall_netbsd.go b/unix/syscall_netbsd.go
index e8224c7..45b50a6 100644
--- a/unix/syscall_netbsd.go
+++ b/unix/syscall_netbsd.go
@@ -106,23 +106,6 @@
 	return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
 }
 
-func SysctlClockinfo(name string) (*Clockinfo, error) {
-	mib, err := sysctlmib(name)
-	if err != nil {
-		return nil, err
-	}
-
-	n := uintptr(SizeofClockinfo)
-	var ci Clockinfo
-	if err := sysctl(mib, (*byte)(unsafe.Pointer(&ci)), &n, nil, 0); err != nil {
-		return nil, err
-	}
-	if n != SizeofClockinfo {
-		return nil, EIO
-	}
-	return &ci, nil
-}
-
 //sysnb pipe() (fd1 int, fd2 int, err error)
 func Pipe(p []int) (err error) {
 	if len(p) != 2 {
diff --git a/unix/syscall_netbsd_test.go b/unix/syscall_netbsd_test.go
index 3292cbd..2316d26 100644
--- a/unix/syscall_netbsd_test.go
+++ b/unix/syscall_netbsd_test.go
@@ -27,15 +27,6 @@
 	return result
 }
 
-func TestSysctlClockinfo(t *testing.T) {
-	ci, err := unix.SysctlClockinfo("kern.clockrate")
-	if err != nil {
-		t.Fatal(err)
-	}
-	t.Logf("tick = %v, tickadj = %v, hz = %v, profhz = %v, stathz = %v",
-		ci.Tick, ci.Tickadj, ci.Hz, ci.Profhz, ci.Stathz)
-}
-
 func TestIoctlPtmget(t *testing.T) {
 	fd, err := unix.Open("/dev/ptmx", unix.O_NOCTTY|unix.O_RDWR, 0666)
 	if err != nil {
diff --git a/unix/syscall_openbsd.go b/unix/syscall_openbsd.go
index 5628a68..2629a32 100644
--- a/unix/syscall_openbsd.go
+++ b/unix/syscall_openbsd.go
@@ -55,23 +55,6 @@
 	return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
 }
 
-func SysctlClockinfo(name string) (*Clockinfo, error) {
-	mib, err := sysctlmib(name)
-	if err != nil {
-		return nil, err
-	}
-
-	n := uintptr(SizeofClockinfo)
-	var ci Clockinfo
-	if err := sysctl(mib, (*byte)(unsafe.Pointer(&ci)), &n, nil, 0); err != nil {
-		return nil, err
-	}
-	if n != SizeofClockinfo {
-		return nil, EIO
-	}
-	return &ci, nil
-}
-
 func SysctlUvmexp(name string) (*Uvmexp, error) {
 	mib, err := sysctlmib(name)
 	if err != nil {
diff --git a/unix/syscall_openbsd_test.go b/unix/syscall_openbsd_test.go
index 7bf75ee..b95f334 100644
--- a/unix/syscall_openbsd_test.go
+++ b/unix/syscall_openbsd_test.go
@@ -40,15 +40,6 @@
 	}
 }
 
-func TestSysctlClockinfo(t *testing.T) {
-	ci, err := unix.SysctlClockinfo("kern.clockrate")
-	if err != nil {
-		t.Fatal(err)
-	}
-	t.Logf("tick = %v, tickadj = %v, hz = %v, profhz = %v, stathz = %v",
-		ci.Tick, ci.Tickadj, ci.Hz, ci.Profhz, ci.Stathz)
-}
-
 func TestSysctlUvmexp(t *testing.T) {
 	uvm, err := unix.SysctlUvmexp("vm.uvmexp")
 	if err != nil {
diff --git a/unix/types_dragonfly.go b/unix/types_dragonfly.go
index 3365dd7..6574f6b 100644
--- a/unix/types_dragonfly.go
+++ b/unix/types_dragonfly.go
@@ -261,3 +261,9 @@
 // Uname
 
 type Utsname C.struct_utsname
+
+// Clockinfo
+
+const SizeofClockinfo = C.sizeof_struct_clockinfo
+
+type Clockinfo C.struct_clockinfo
diff --git a/unix/types_freebsd.go b/unix/types_freebsd.go
index a121dc3..c6fde42 100644
--- a/unix/types_freebsd.go
+++ b/unix/types_freebsd.go
@@ -398,3 +398,9 @@
 // Uname
 
 type Utsname C.struct_utsname
+
+// Clockinfo
+
+const SizeofClockinfo = C.sizeof_struct_clockinfo
+
+type Clockinfo C.struct_clockinfo
diff --git a/unix/ztypes_dragonfly_amd64.go b/unix/ztypes_dragonfly_amd64.go
index c206f2b..71ea1d6 100644
--- a/unix/ztypes_dragonfly_amd64.go
+++ b/unix/ztypes_dragonfly_amd64.go
@@ -467,3 +467,13 @@
 	Version  [32]byte
 	Machine  [32]byte
 }
+
+const SizeofClockinfo = 0x14
+
+type Clockinfo struct {
+	Hz      int32
+	Tick    int32
+	Tickadj int32
+	Stathz  int32
+	Profhz  int32
+}
diff --git a/unix/ztypes_freebsd_386.go b/unix/ztypes_freebsd_386.go
index 7312e95..cd16bc5 100644
--- a/unix/ztypes_freebsd_386.go
+++ b/unix/ztypes_freebsd_386.go
@@ -698,3 +698,13 @@
 	Version  [256]byte
 	Machine  [256]byte
 }
+
+const SizeofClockinfo = 0x14
+
+type Clockinfo struct {
+	Hz     int32
+	Tick   int32
+	Spare  int32
+	Stathz int32
+	Profhz int32
+}
diff --git a/unix/ztypes_freebsd_amd64.go b/unix/ztypes_freebsd_amd64.go
index 29ba2f5..4eb6ae3 100644
--- a/unix/ztypes_freebsd_amd64.go
+++ b/unix/ztypes_freebsd_amd64.go
@@ -704,3 +704,13 @@
 	Version  [256]byte
 	Machine  [256]byte
 }
+
+const SizeofClockinfo = 0x14
+
+type Clockinfo struct {
+	Hz     int32
+	Tick   int32
+	Spare  int32
+	Stathz int32
+	Profhz int32
+}
diff --git a/unix/ztypes_freebsd_arm.go b/unix/ztypes_freebsd_arm.go
index b4090ef..a1d4aaf 100644
--- a/unix/ztypes_freebsd_arm.go
+++ b/unix/ztypes_freebsd_arm.go
@@ -681,3 +681,13 @@
 	Version  [256]byte
 	Machine  [256]byte
 }
+
+const SizeofClockinfo = 0x14
+
+type Clockinfo struct {
+	Hz     int32
+	Tick   int32
+	Spare  int32
+	Stathz int32
+	Profhz int32
+}
diff --git a/unix/ztypes_freebsd_arm64.go b/unix/ztypes_freebsd_arm64.go
index c681d7d..1d27d6f 100644
--- a/unix/ztypes_freebsd_arm64.go
+++ b/unix/ztypes_freebsd_arm64.go
@@ -682,3 +682,13 @@
 	Version  [256]byte
 	Machine  [256]byte
 }
+
+const SizeofClockinfo = 0x14
+
+type Clockinfo struct {
+	Hz     int32
+	Tick   int32
+	Spare  int32
+	Stathz int32
+	Profhz int32
+}