github.com/gofiber/fiber/v2@v2.47.0/internal/gopsutil/common/common_freebsd.go (about) 1 //go:build freebsd || openbsd 2 // +build freebsd openbsd 3 4 package common 5 6 import ( 7 "fmt" 8 "os" 9 "os/exec" 10 "strings" 11 "unsafe" 12 13 "golang.org/x/sys/unix" 14 ) 15 16 func SysctlUint(mib string) (uint64, error) { 17 buf, err := unix.SysctlRaw(mib) 18 if err != nil { 19 return 0, err 20 } 21 if len(buf) == 8 { // 64 bit 22 return *(*uint64)(unsafe.Pointer(&buf[0])), nil 23 } 24 if len(buf) == 4 { // 32bit 25 t := *(*uint32)(unsafe.Pointer(&buf[0])) 26 return uint64(t), nil 27 } 28 return 0, fmt.Errorf("unexpected size: %s, %d", mib, len(buf)) 29 } 30 31 func DoSysctrl(mib string) ([]string, error) { 32 sysctl, err := exec.LookPath("sysctl") 33 if err != nil { 34 return []string{}, err 35 } 36 cmd := exec.Command(sysctl, "-n", mib) 37 cmd.Env = getSysctrlEnv(os.Environ()) 38 out, err := cmd.Output() 39 if err != nil { 40 return []string{}, err 41 } 42 v := strings.Replace(string(out), "{ ", "", 1) 43 v = strings.Replace(string(v), " }", "", 1) 44 values := strings.Fields(string(v)) 45 46 return values, nil 47 } 48 49 func CallSyscall(mib []int32) ([]byte, uint64, error) { 50 mibptr := unsafe.Pointer(&mib[0]) 51 miblen := uint64(len(mib)) 52 53 // get required buffer size 54 length := uint64(0) 55 _, _, err := unix.Syscall6( 56 unix.SYS___SYSCTL, 57 uintptr(mibptr), 58 uintptr(miblen), 59 0, 60 uintptr(unsafe.Pointer(&length)), 61 0, 62 0) 63 if err != 0 { 64 var b []byte 65 return b, length, err 66 } 67 if length == 0 { 68 var b []byte 69 return b, length, err 70 } 71 // get proc info itself 72 buf := make([]byte, length) 73 _, _, err = unix.Syscall6( 74 unix.SYS___SYSCTL, 75 uintptr(mibptr), 76 uintptr(miblen), 77 uintptr(unsafe.Pointer(&buf[0])), 78 uintptr(unsafe.Pointer(&length)), 79 0, 80 0) 81 if err != 0 { 82 return buf, length, err 83 } 84 85 return buf, length, nil 86 }