blob: 3e85cc06b8adb8a1c379139e118e2828f19c75a9 [file] [log] [blame]
Serge Bazanskicc25bdf2018-10-25 14:02:58 +02001// +build darwin
2
3package common
4
5import (
6 "context"
7 "os"
8 "os/exec"
9 "strings"
10 "unsafe"
11
12 "golang.org/x/sys/unix"
13)
14
15func DoSysctrlWithContext(ctx context.Context, mib string) ([]string, error) {
16 sysctl, err := exec.LookPath("/usr/sbin/sysctl")
17 if err != nil {
18 return []string{}, err
19 }
20 cmd := exec.CommandContext(ctx, 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
33func CallSyscall(mib []int32) ([]byte, uint64, error) {
34 miblen := uint64(len(mib))
35
36 // get required buffer size
37 length := uint64(0)
38 _, _, err := unix.Syscall6(
39 unix.SYS___SYSCTL,
40 uintptr(unsafe.Pointer(&mib[0])),
41 uintptr(miblen),
42 0,
43 uintptr(unsafe.Pointer(&length)),
44 0,
45 0)
46 if err != 0 {
47 var b []byte
48 return b, length, err
49 }
50 if length == 0 {
51 var b []byte
52 return b, length, err
53 }
54 // get proc info itself
55 buf := make([]byte, length)
56 _, _, err = unix.Syscall6(
57 unix.SYS___SYSCTL,
58 uintptr(unsafe.Pointer(&mib[0])),
59 uintptr(miblen),
60 uintptr(unsafe.Pointer(&buf[0])),
61 uintptr(unsafe.Pointer(&length)),
62 0,
63 0)
64 if err != 0 {
65 return buf, length, err
66 }
67
68 return buf, length, nil
69}