github.com/gofiber/fiber/v2@v2.47.0/internal/gopsutil/common/common_darwin.go (about) 1 //go:build darwin 2 // +build darwin 3 4 package common 5 6 import ( 7 "context" 8 "os" 9 "os/exec" 10 "strings" 11 "unsafe" 12 13 "golang.org/x/sys/unix" 14 ) 15 16 func DoSysctrlWithContext(ctx context.Context, mib string) ([]string, error) { 17 sysctl, err := exec.LookPath("sysctl") 18 if err != nil { 19 return []string{}, err 20 } 21 cmd := exec.CommandContext(ctx, sysctl, "-n", mib) 22 cmd.Env = getSysctrlEnv(os.Environ()) 23 out, err := cmd.Output() 24 if err != nil { 25 return []string{}, err 26 } 27 v := strings.Replace(string(out), "{ ", "", 1) 28 v = strings.Replace(string(v), " }", "", 1) 29 values := strings.Fields(string(v)) 30 31 return values, nil 32 } 33 34 func CallSyscall(mib []int32) ([]byte, uint64, error) { 35 miblen := uint64(len(mib)) 36 37 // get required buffer size 38 length := uint64(0) 39 _, _, err := unix.Syscall6( 40 202, // unix.SYS___SYSCTL https://github.com/golang/sys/blob/76b94024e4b621e672466e8db3d7f084e7ddcad2/unix/zsysnum_darwin_amd64.go#L146 41 uintptr(unsafe.Pointer(&mib[0])), 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 202, // unix.SYS___SYSCTL https://github.com/golang/sys/blob/76b94024e4b621e672466e8db3d7f084e7ddcad2/unix/zsysnum_darwin_amd64.go#L146 59 uintptr(unsafe.Pointer(&mib[0])), 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 }