github.com/spi-ca/misc@v1.0.1/networking/ip.go (about)

     1  package networking
     2  
     3  import (
     4  	"net"
     5  )
     6  
     7  // Bigger than we need, not too big to worry about overflow
     8  const big = 0x100
     9  
    10  // Parse IPv4 address (d.d.d.d).
    11  func ParseIPv4(s []byte) net.IP {
    12  	var p [net.IPv4len]byte
    13  	for i := 0; i < net.IPv4len; i++ {
    14  		if len(s) == 0 {
    15  			// Missing octets.
    16  			return nil
    17  		}
    18  
    19  		if i > 0 {
    20  			if s[0] != '.' {
    21  				return nil
    22  			}
    23  			s = s[1:]
    24  		}
    25  
    26  		n, c, ok := dtoi(s)
    27  		if !ok {
    28  			return nil
    29  		}
    30  		if c > 1 && s[0] == '0' {
    31  			// Reject non-zero components with leading zeroes.
    32  			return nil
    33  		}
    34  		s = s[c:]
    35  		p[i] = byte(n)
    36  	}
    37  	if len(s) != 0 {
    38  		return nil
    39  	}
    40  	return net.IPv4(p[0], p[1], p[2], p[3])
    41  }
    42  
    43  // Decimal to integer.
    44  // Returns number, characters consumed, success.
    45  func dtoi(s []byte) (n int, i int, ok bool) {
    46  	n = 0
    47  	for i = 0; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ {
    48  		n = n*10 + int(s[i]-'0')
    49  		if n >= big {
    50  			return big, i, false
    51  		}
    52  	}
    53  	if i == 0 {
    54  		return 0, 0, false
    55  	}
    56  	return n, i, true
    57  }