blob: 107e2c9cf9286dc114e6f2f1de6f87d0322f39f0 [file] [log] [blame]
Serge Bazanskicc25bdf2018-10-25 14:02:58 +02001// +build freebsd openbsd
2
3package common
4
5import (
6 "os"
7 "os/exec"
8 "strings"
9 "unsafe"
10
11 "golang.org/x/sys/unix"
12)
13
14func DoSysctrl(mib string) ([]string, error) {
15 sysctl, err := exec.LookPath("/sbin/sysctl")
16 if err != nil {
17 return []string{}, err
18 }
19 cmd := exec.Command(sysctl, "-n", mib)
20 cmd.Env = getSysctrlEnv(os.Environ())
21 out, err := cmd.Output()
22 if err != nil {
23 return []string{}, err
24 }
25 v := strings.Replace(string(out), "{ ", "", 1)
26 v = strings.Replace(string(v), " }", "", 1)
27 values := strings.Fields(string(v))
28
29 return values, nil
30}
31
32func CallSyscall(mib []int32) ([]byte, uint64, error) {
33 mibptr := unsafe.Pointer(&mib[0])
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(mibptr),
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(mibptr),
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}