| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- // Copyright 2012 The Go Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- package ipv4
- import (
- "errors"
- "net"
- )
- var (
- errNoSuchInterface = errors.New("no such interface")
- errNoSuchMulticastInterface = errors.New("no such multicast interface")
- )
- func boolint(b bool) int {
- if b {
- return 1
- }
- return 0
- }
- func netAddrToIP4(a net.Addr) net.IP {
- switch v := a.(type) {
- case *net.UDPAddr:
- if ip := v.IP.To4(); ip != nil {
- return ip
- }
- case *net.IPAddr:
- if ip := v.IP.To4(); ip != nil {
- return ip
- }
- }
- return nil
- }
- func netIP4ToInterface(ip net.IP) (*net.Interface, error) {
- ift, err := net.Interfaces()
- if err != nil {
- return nil, err
- }
- for _, ifi := range ift {
- ifat, err := ifi.Addrs()
- if err != nil {
- return nil, err
- }
- for _, ifa := range ifat {
- switch v := ifa.(type) {
- case *net.IPAddr:
- if ip.Equal(v.IP) {
- return &ifi, nil
- }
- case *net.IPNet:
- if ip.Equal(v.IP) {
- return &ifi, nil
- }
- }
- }
- }
- return nil, errNoSuchInterface
- }
- func netInterfaceToIP4(ifi *net.Interface) (net.IP, error) {
- if ifi == nil {
- return net.IPv4zero, nil
- }
- ifat, err := ifi.Addrs()
- if err != nil {
- return nil, err
- }
- for _, ifa := range ifat {
- switch v := ifa.(type) {
- case *net.IPAddr:
- if v.IP.To4() != nil {
- return v.IP, nil
- }
- case *net.IPNet:
- if v.IP.To4() != nil {
- return v.IP, nil
- }
- }
- }
- return nil, errNoSuchInterface
- }
|