github.com/pwn-term/docker@v0.0.0-20210616085119-6e977cce2565/libnetwork/portallocator/portallocator_linux.go (about)

     1  package portallocator
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"os"
     7  )
     8  
     9  func getDynamicPortRange() (start int, end int, err error) {
    10  	const portRangeKernelParam = "/proc/sys/net/ipv4/ip_local_port_range"
    11  	portRangeFallback := fmt.Sprintf("using fallback port range %d-%d", defaultPortRangeStart, defaultPortRangeEnd)
    12  	file, err := os.Open(portRangeKernelParam)
    13  	if err != nil {
    14  		return 0, 0, fmt.Errorf("port allocator - %s due to error: %v", portRangeFallback, err)
    15  	}
    16  
    17  	defer file.Close()
    18  
    19  	n, err := fmt.Fscanf(bufio.NewReader(file), "%d\t%d", &start, &end)
    20  	if n != 2 || 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 from %s - %s: %v", portRangeKernelParam, portRangeFallback, err)
    25  	}
    26  	return start, end, nil
    27  }