github.com/anacrolix/torrent@v1.61.0/iplist/cidr.go (about)

     1  package iplist
     2  
     3  import (
     4  	"bufio"
     5  	"io"
     6  	"net"
     7  )
     8  
     9  func ParseCIDRListReader(r io.Reader) (ret []Range, err error) {
    10  	s := bufio.NewScanner(r)
    11  	for s.Scan() {
    12  		err = func() (err error) {
    13  			_, in, err := net.ParseCIDR(s.Text())
    14  			if err != nil {
    15  				return
    16  			}
    17  			ret = append(ret, Range{
    18  				First: in.IP,
    19  				Last:  IPNetLast(in),
    20  			})
    21  			return
    22  		}()
    23  		if err != nil {
    24  			return
    25  		}
    26  	}
    27  	return
    28  }
    29  
    30  // Returns the last, inclusive IP in a net.IPNet.
    31  func IPNetLast(in *net.IPNet) (last net.IP) {
    32  	n := len(in.IP)
    33  	if n != len(in.Mask) {
    34  		panic("wat")
    35  	}
    36  	last = make(net.IP, n)
    37  	for i := 0; i < n; i++ {
    38  		last[i] = in.IP[i] | ^in.Mask[i]
    39  	}
    40  	return
    41  }