portallocator_freebsd.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package portallocator
  2. import (
  3. "bytes"
  4. "fmt"
  5. "os/exec"
  6. )
  7. func getDynamicPortRange() (start int, end int, err error) {
  8. portRangeKernelSysctl := []string{"net.inet.ip.portrange.hifirst", "net.ip.portrange.hilast"}
  9. portRangeFallback := fmt.Sprintf("using fallback port range %d-%d", DefaultPortRangeStart, DefaultPortRangeEnd)
  10. portRangeLowCmd := exec.Command("/sbin/sysctl", portRangeKernelSysctl[0])
  11. var portRangeLowOut bytes.Buffer
  12. portRangeLowCmd.Stdout = &portRangeLowOut
  13. cmdErr := portRangeLowCmd.Run()
  14. if cmdErr != nil {
  15. return 0, 0, fmt.Errorf("port allocator - sysctl net.inet.ip.portrange.hifirst failed - %s: %v", portRangeFallback, err)
  16. }
  17. n, err := fmt.Sscanf(portRangeLowOut.String(), "%d", &start)
  18. if n != 1 || err != nil {
  19. if err == nil {
  20. err = fmt.Errorf("unexpected count of parsed numbers (%d)", n)
  21. }
  22. return 0, 0, fmt.Errorf("port allocator - failed to parse system ephemeral port range start from %s - %s: %v", portRangeLowOut.String(), portRangeFallback, err)
  23. }
  24. portRangeHighCmd := exec.Command("/sbin/sysctl", portRangeKernelSysctl[1])
  25. var portRangeHighOut bytes.Buffer
  26. portRangeHighCmd.Stdout = &portRangeHighOut
  27. cmdErr = portRangeHighCmd.Run()
  28. if cmdErr != nil {
  29. return 0, 0, fmt.Errorf("port allocator - sysctl net.inet.ip.portrange.hilast failed - %s: %v", portRangeFallback, err)
  30. }
  31. n, err = fmt.Sscanf(portRangeHighOut.String(), "%d", &end)
  32. if n != 1 || err != nil {
  33. if err == nil {
  34. err = fmt.Errorf("unexpected count of parsed numbers (%d)", n)
  35. }
  36. return 0, 0, fmt.Errorf("port allocator - failed to parse system ephemeral port range end from %s - %s: %v", portRangeHighOut.String(), portRangeFallback, err)
  37. }
  38. return start, end, nil
  39. }