]> Sergey Matveev's repositories - btrtrc.git/blob - ipport.go
Drop support for go 1.20
[btrtrc.git] / ipport.go
1 package torrent
2
3 import (
4         "net"
5         "strconv"
6 )
7
8 // Extracts the port as an integer from an address string.
9 func addrPortOrZero(addr net.Addr) int {
10         switch raw := addr.(type) {
11         case *net.UDPAddr:
12                 return raw.Port
13         case *net.TCPAddr:
14                 return raw.Port
15         default:
16                 // Consider a unix socket on Windows with a name like "C:notanint".
17                 _, port, err := net.SplitHostPort(addr.String())
18                 if err != nil {
19                         return 0
20                 }
21                 i64, err := strconv.ParseUint(port, 0, 16)
22                 if err != nil {
23                         return 0
24                 }
25                 return int(i64)
26         }
27 }
28
29 func addrIpOrNil(addr net.Addr) net.IP {
30         if addr == nil {
31                 return nil
32         }
33         switch raw := addr.(type) {
34         case *net.UDPAddr:
35                 return raw.IP
36         case *net.TCPAddr:
37                 return raw.IP
38         default:
39                 host, _, err := net.SplitHostPort(addr.String())
40                 if err != nil {
41                         return nil
42                 }
43                 return net.ParseIP(host)
44         }
45 }
46
47 type ipPortAddr struct {
48         IP   net.IP
49         Port int
50 }
51
52 func (ipPortAddr) Network() string {
53         return ""
54 }
55
56 func (me ipPortAddr) String() string {
57         return net.JoinHostPort(me.IP.String(), strconv.FormatInt(int64(me.Port), 10))
58 }
59
60 func tryIpPortFromNetAddr(addr PeerRemoteAddr) (ipPortAddr, bool) {
61         ok := true
62         host, port, err := net.SplitHostPort(addr.String())
63         if err != nil {
64                 ok = false
65         }
66         portI64, err := strconv.ParseInt(port, 10, 0)
67         if err != nil {
68                 ok = false
69         }
70         return ipPortAddr{net.ParseIP(host), int(portI64)}, ok
71 }