github.com/unionj-cloud/go-doudou@v1.3.8-0.20221011095552-0088008e5b31/toolkit/internal/common/common_openbsd.go (about) 1 //go:build openbsd 2 // +build openbsd 3 4 package common 5 6 import ( 7 "os" 8 "os/exec" 9 "strings" 10 "unsafe" 11 12 "golang.org/x/sys/unix" 13 ) 14 15 func DoSysctrl(mib string) ([]string, error) { 16 cmd := exec.Command("sysctl", "-n", mib) 17 cmd.Env = getSysctrlEnv(os.Environ()) 18 out, err := cmd.Output() 19 if err != nil { 20 return []string{}, err 21 } 22 v := strings.Replace(string(out), "{ ", "", 1) 23 v = strings.Replace(string(v), " }", "", 1) 24 values := strings.Fields(string(v)) 25 26 return values, nil 27 } 28 29 func CallSyscall(mib []int32) ([]byte, uint64, error) { 30 mibptr := unsafe.Pointer(&mib[0]) 31 miblen := uint64(len(mib)) 32 33 // get required buffer size 34 length := uint64(0) 35 _, _, err := unix.Syscall6( 36 unix.SYS___SYSCTL, 37 uintptr(mibptr), 38 uintptr(miblen), 39 0, 40 uintptr(unsafe.Pointer(&length)), 41 0, 42 0) 43 if err != 0 { 44 var b []byte 45 return b, length, err 46 } 47 if length == 0 { 48 var b []byte 49 return b, length, err 50 } 51 // get proc info itself 52 buf := make([]byte, length) 53 _, _, err = unix.Syscall6( 54 unix.SYS___SYSCTL, 55 uintptr(mibptr), 56 uintptr(miblen), 57 uintptr(unsafe.Pointer(&buf[0])), 58 uintptr(unsafe.Pointer(&length)), 59 0, 60 0) 61 if err != 0 { 62 return buf, length, err 63 } 64 65 return buf, length, nil 66 }