-
Notifications
You must be signed in to change notification settings - Fork 0
/
util.go
113 lines (101 loc) · 2.19 KB
/
util.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package fakerpc
import (
"errors"
"net"
"net/url"
"strconv"
)
func ipnil(ip net.IP) net.IP {
if ip == nil {
return net.IPv4(0, 0, 0, 0)
}
return ip
}
func iptomask(ip net.IP) net.IPMask {
ip = ipnil(ip)
return net.IPv4Mask(ip[12], ip[13], ip[14], ip[15])
}
func masktoip(mask net.IPMask) (ip net.IP) {
if mask != nil {
ip = net.IPv4(mask[0], mask[1], mask[2], mask[3])
}
return ipnil(ip)
}
var addrcache = make(map[string]*net.TCPAddr)
func tcpaddr(addr net.Addr) (*net.TCPAddr, error) {
tcpa, ok := addr.(*net.TCPAddr)
if ok {
return tcpa, nil
}
tcpa, ok = addrcache[addr.String()]
if ok {
return tcpa, nil
}
host, port, err := net.SplitHostPort(addr.String())
if err != nil {
return nil, err
}
tcpa = &net.TCPAddr{}
if tcpa.Port, err = strconv.Atoi(port); err != nil {
return nil, err
}
if tcpa.IP = net.ParseIP(host); tcpa.IP != nil {
addrcache[addr.String()] = tcpa
return tcpa, nil
}
ips, err := net.LookupIP(host)
if err != nil {
return nil, err
}
tcpa.IP = ips[0]
addrcache[addr.String()] = tcpa
return tcpa, nil
}
func tcpaddrnil(addr net.Addr) (tcpa *net.TCPAddr) {
if a, err := tcpaddr(addr); err == nil {
tcpa = a
}
return
}
func tcpaddrequal(lhs, rhs *net.TCPAddr) bool {
return lhs == rhs || (lhs.IP.Equal(rhs.IP) && lhs.Port == rhs.Port)
}
func ipnetaddr(addr net.Addr) ([]*net.IPNet, error) {
ip, err := tcpaddr(addr)
if err != nil {
return nil, err
}
ifi, err := net.Interfaces()
if err != nil {
return nil, err
}
var all []*net.IPNet
for _, ifi := range ifi {
addr, err := ifi.Addrs()
if err != nil {
continue
}
for _, addr := range addr {
if ipnet, ok := addr.(*net.IPNet); ok {
if ipnet.Contains(ip.IP) {
return []*net.IPNet{ipnet}, nil
}
all = append(all, ipnet)
}
}
}
if len(all) == 0 {
return nil, errors.New("fakerpc: unable to find single network address for " + addr.String())
}
return all, nil
}
type hpwrap string
func (w hpwrap) Network() string { return string(w) }
func (w hpwrap) String() string { return string(w) }
func urltotcpaddr(u *url.URL) (*net.TCPAddr, error) {
hp := u.Host
if _, _, err := net.SplitHostPort(hp); err != nil {
hp = hp + ":80"
}
return tcpaddr(hpwrap(hp))
}