42 lines
655 B
Go
42 lines
655 B
Go
package iplist
|
|
|
|
import (
|
|
"bufio"
|
|
"io"
|
|
"net"
|
|
)
|
|
|
|
func ParseCIDRListReader(r io.Reader) (ret []Range, err error) {
|
|
s := bufio.NewScanner(r)
|
|
for s.Scan() {
|
|
err = func() (err error) {
|
|
_, in, err := net.ParseCIDR(s.Text())
|
|
if err != nil {
|
|
return
|
|
}
|
|
ret = append(ret, Range{
|
|
First: in.IP,
|
|
Last: IPNetLast(in),
|
|
})
|
|
return
|
|
}()
|
|
if err != nil {
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
// Returns the last, inclusive IP in a net.IPNet.
|
|
func IPNetLast(in *net.IPNet) (last net.IP) {
|
|
n := len(in.IP)
|
|
if n != len(in.Mask) {
|
|
panic("wat")
|
|
}
|
|
last = make(net.IP, n)
|
|
for i := 0; i < n; i++ {
|
|
last[i] = in.IP[i] | ^in.Mask[i]
|
|
}
|
|
return
|
|
}
|