github.com/unionj-cloud/go-doudou@v1.3.8-0.20221011095552-0088008e5b31/toolkit/internal/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 cmd := exec.CommandContext(ctx, "sysctl", "-n", mib) 18 cmd.Env = getSysctrlEnv(os.Environ()) 19 out, err := cmd.Output() 20 if err != nil { 21 return []string{}, err 22 } 23 v := strings.Replace(string(out), "{ ", "", 1) 24 v = strings.Replace(string(v), " }", "", 1) 25 values := strings.Fields(string(v)) 26 27 return values, nil 28 } 29 30 func CallSyscall(mib []int32) ([]byte, uint64, error) { 31 miblen := uint64(len(mib)) 32 33 // get required buffer size 34 length := uint64(0) 35 _, _, err := unix.Syscall6( 36 202, // unix.SYS___SYSCTL https://github.com/golang/sys/blob/76b94024e4b621e672466e8db3d7f084e7ddcad2/unix/zsysnum_darwin_amd64.go#L146 37 uintptr(unsafe.Pointer(&mib[0])), 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 202, // unix.SYS___SYSCTL https://github.com/golang/sys/blob/76b94024e4b621e672466e8db3d7f084e7ddcad2/unix/zsysnum_darwin_amd64.go#L146 55 uintptr(unsafe.Pointer(&mib[0])), 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 }