common_darwin.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // +build darwin
  2. package common
  3. import (
  4. "context"
  5. "os"
  6. "os/exec"
  7. "strings"
  8. "unsafe"
  9. "golang.org/x/sys/unix"
  10. )
  11. func DoSysctrlWithContext(ctx context.Context, mib string) ([]string, error) {
  12. sysctl, err := exec.LookPath("/usr/sbin/sysctl")
  13. if err != nil {
  14. return []string{}, err
  15. }
  16. cmd := exec.CommandContext(ctx, sysctl, "-n", mib)
  17. cmd.Env = getSysctrlEnv(os.Environ())
  18. out, err := cmd.Output()
  19. if err != nil {
  20. return []string{}, err
  21. }
  22. v := strings.Replace(string(out), "{ ", "", 1)
  23. v = strings.Replace(string(v), " }", "", 1)
  24. values := strings.Fields(string(v))
  25. return values, nil
  26. }
  27. func CallSyscall(mib []int32) ([]byte, uint64, error) {
  28. miblen := uint64(len(mib))
  29. // get required buffer size
  30. length := uint64(0)
  31. _, _, err := unix.Syscall6(
  32. unix.SYS___SYSCTL,
  33. uintptr(unsafe.Pointer(&mib[0])),
  34. uintptr(miblen),
  35. 0,
  36. uintptr(unsafe.Pointer(&length)),
  37. 0,
  38. 0)
  39. if err != 0 {
  40. var b []byte
  41. return b, length, err
  42. }
  43. if length == 0 {
  44. var b []byte
  45. return b, length, err
  46. }
  47. // get proc info itself
  48. buf := make([]byte, length)
  49. _, _, err = unix.Syscall6(
  50. unix.SYS___SYSCTL,
  51. uintptr(unsafe.Pointer(&mib[0])),
  52. uintptr(miblen),
  53. uintptr(unsafe.Pointer(&buf[0])),
  54. uintptr(unsafe.Pointer(&length)),
  55. 0,
  56. 0)
  57. if err != 0 {
  58. return buf, length, err
  59. }
  60. return buf, length, nil
  61. }