@@ -11,6 +11,7 @@ import (
11
11
)
12
12
13
13
var errIncorrectNetAddr = fmt .Errorf ("incorrect network addr conversion" )
14
+ var errNotIP = fmt .Errorf ("multiaddr does not start with an IP address" )
14
15
15
16
// FromNetAddr converts a net.Addr type to a Multiaddr.
16
17
func FromNetAddr (a net.Addr ) (ma.Multiaddr , error ) {
@@ -100,20 +101,22 @@ func FromIP(ip net.IP) (ma.Multiaddr, error) {
100
101
101
102
// ToIP converts a Multiaddr to a net.IP when possible
102
103
func ToIP (addr ma.Multiaddr ) (net.IP , error ) {
103
- _ , network , ip , _ , hostname , err := dialArgComponents (addr )
104
- if err != nil {
105
- return nil , err
106
- }
107
-
108
- if hostname {
109
- return nil , fmt .Errorf ("non IP Multiaddr: %s %s" , network , ip )
110
- }
111
- switch network {
112
- case "ip" , "ip4" , "ip6" , "tcp" , "tcp4" , "tcp6" , "udp" , "udp4" , "udp6" :
113
- return net .ParseIP (ip ), nil
114
- default :
115
- return nil , fmt .Errorf ("non IP Multiaddr: %s %s" , network , ip )
104
+ var ip net.IP
105
+ ma .ForEach (addr , func (c ma.Component ) bool {
106
+ switch c .Protocol ().Code {
107
+ case ma .P_IP6ZONE :
108
+ // we can't return these anyways.
109
+ return true
110
+ case ma .P_IP6 , ma .P_IP4 :
111
+ ip = net .IP (c .RawValue ())
112
+ return false
113
+ }
114
+ return false
115
+ })
116
+ if ip == nil {
117
+ return nil , errNotIP
116
118
}
119
+ return ip , nil
117
120
}
118
121
119
122
// DialArgs is a convenience function that returns network and address as
0 commit comments