unix: use sort.Search for sysctl lookup on OpenBSD

Use sort.Search to look up sysctl mib values from names instead of using
a hand-crafted binary search.

Also add a simple test to verify sysctl is still working after the
change.

Change-Id: I844840ac434a704b14c3166c3730daffabd2f347
Reviewed-on: https://go-review.googlesource.com/76930
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Tobias Klauser
2017-11-14 16:20:44 +00:00
committed by Brad Fitzpatrick
parent 665f6529cc
commit bf42f188b9
2 changed files with 14 additions and 16 deletions
+8
View File
@@ -60,3 +60,11 @@ func TestSysctlRaw(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
} }
func TestSysctlUint32(t *testing.T) {
maxproc, err := unix.SysctlUint32("kern.maxproc")
if err != nil {
t.Fatal(err)
}
t.Logf("kern.maxproc: %v", maxproc)
}
+6 -16
View File
@@ -13,6 +13,7 @@
package unix package unix
import ( import (
"sort"
"syscall" "syscall"
"unsafe" "unsafe"
) )
@@ -32,22 +33,11 @@ type SockaddrDatalink struct {
func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
func nametomib(name string) (mib []_C_int, err error) { func nametomib(name string) (mib []_C_int, err error) {
// Perform lookup via a binary search i := sort.Search(len(sysctlMib), func(i int) bool {
left := 0 return sysctlMib[i].ctlname >= name
right := len(sysctlMib) - 1 })
for { if i < len(sysctlMib) && sysctlMib[i].ctlname == name {
idx := left + (right-left)/2 return sysctlMib[i].ctloid, nil
switch {
case name == sysctlMib[idx].ctlname:
return sysctlMib[idx].ctloid, nil
case name > sysctlMib[idx].ctlname:
left = idx + 1
default:
right = idx - 1
}
if left > right {
break
}
} }
return nil, EINVAL return nil, EINVAL
} }