common_freebsd.go 1.3 KB

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