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