github.com/gofiber/fiber/v2@v2.47.0/internal/gopsutil/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 sysctl, err := exec.LookPath("sysctl") 17 if err != nil { 18 return []string{}, err 19 } 20 cmd := exec.Command(sysctl, "-n", mib) 21 cmd.Env = getSysctrlEnv(os.Environ()) 22 out, err := cmd.Output() 23 if err != nil { 24 return []string{}, err 25 } 26 v := strings.Replace(string(out), "{ ", "", 1) 27 v = strings.Replace(string(v), " }", "", 1) 28 values := strings.Fields(string(v)) 29 30 return values, nil 31 } 32 33 func CallSyscall(mib []int32) ([]byte, uint64, error) { 34 mibptr := unsafe.Pointer(&mib[0]) 35 miblen := uint64(len(mib)) 36 37 // get required buffer size 38 length := uint64(0) 39 _, _, err := unix.Syscall6( 40 unix.SYS___SYSCTL, 41 uintptr(mibptr), 42 uintptr(miblen), 43 0, 44 uintptr(unsafe.Pointer(&length)), 45 0, 46 0) 47 if err != 0 { 48 var b []byte 49 return b, length, err 50 } 51 if length == 0 { 52 var b []byte 53 return b, length, err 54 } 55 // get proc info itself 56 buf := make([]byte, length) 57 _, _, err = unix.Syscall6( 58 unix.SYS___SYSCTL, 59 uintptr(mibptr), 60 uintptr(miblen), 61 uintptr(unsafe.Pointer(&buf[0])), 62 uintptr(unsafe.Pointer(&length)), 63 0, 64 0) 65 if err != 0 { 66 return buf, length, err 67 } 68 69 return buf, length, nil 70 }