common_freebsd.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // +build freebsd openbsd
  2. package common
  3. import (
  4. "fmt"
  5. "os"
  6. "os/exec"
  7. "strings"
  8. "unsafe"
  9. "golang.org/x/sys/unix"
  10. )
  11. func SysctlUint(mib string) (uint64, error) {
  12. buf, err := unix.SysctlRaw(mib)
  13. if err != nil {
  14. return 0, err
  15. }
  16. if len(buf) == 8 { // 64 bit
  17. return *(*uint64)(unsafe.Pointer(&buf[0])), nil
  18. }
  19. if len(buf) == 4 { // 32bit
  20. t := *(*uint32)(unsafe.Pointer(&buf[0]))
  21. return uint64(t), nil
  22. }
  23. return 0, fmt.Errorf("unexpected size: %s, %d", mib, len(buf))
  24. }
  25. func DoSysctrl(mib string) ([]string, error) {
  26. sysctl, err := exec.LookPath("sysctl")
  27. if err != nil {
  28. return []string{}, err
  29. }
  30. cmd := exec.Command(sysctl, "-n", mib)
  31. cmd.Env = getSysctrlEnv(os.Environ())
  32. out, err := cmd.Output()
  33. if err != nil {
  34. return []string{}, err
  35. }
  36. v := strings.Replace(string(out), "{ ", "", 1)
  37. v = strings.Replace(string(v), " }", "", 1)
  38. values := strings.Fields(string(v))
  39. return values, nil
  40. }
  41. func CallSyscall(mib []int32) ([]byte, uint64, error) {
  42. mibptr := unsafe.Pointer(&mib[0])
  43. miblen := uint64(len(mib))
  44. // get required buffer size
  45. length := uint64(0)
  46. _, _, err := unix.Syscall6(
  47. unix.SYS___SYSCTL,
  48. uintptr(mibptr),
  49. uintptr(miblen),
  50. 0,
  51. uintptr(unsafe.Pointer(&length)),
  52. 0,
  53. 0)
  54. if err != 0 {
  55. var b []byte
  56. return b, length, err
  57. }
  58. if length == 0 {
  59. var b []byte
  60. return b, length, err
  61. }
  62. // get proc info itself
  63. buf := make([]byte, length)
  64. _, _, err = unix.Syscall6(
  65. unix.SYS___SYSCTL,
  66. uintptr(mibptr),
  67. uintptr(miblen),
  68. uintptr(unsafe.Pointer(&buf[0])),
  69. uintptr(unsafe.Pointer(&length)),
  70. 0,
  71. 0)
  72. if err != 0 {
  73. return buf, length, err
  74. }
  75. return buf, length, nil
  76. }