@@ -108,52 +108,69 @@ func parseExternalIfaces(raw string) ([]net.Interface, map[string][]net.Addr) {
108108 continue
109109 }
110110
111- var name string
112- var index , mtu int
113- var up , broadcast , loopback , pointToPoint , multicast bool
114- _ , err := fmt .Sscanf (fields [0 ], "%s %d %d %t %t %t %t %t" ,
115- & name , & index , & mtu , & up , & broadcast , & loopback , & pointToPoint , & multicast )
111+ ni , err := parseIfaceHeader (fields [0 ])
116112 if err != nil {
117- log .Warnf ("network_addresses_android: cannot parse iface header %q: %v" , fields [ 0 ] , err )
113+ log .Warnf ("network_addresses_android: %v" , err )
118114 continue
119115 }
116+ ifaces = append (ifaces , ni )
117+ addrMap [ni .Name ] = parseIfaceAddrs (fields [1 ])
118+ }
119+ return ifaces , addrMap
120+ }
120121
121- ni := net.Interface {
122- Name : name ,
123- Index : index ,
124- MTU : mtu ,
125- }
126- if up {
127- ni .Flags |= net .FlagUp
128- }
129- if broadcast {
130- ni .Flags |= net .FlagBroadcast
131- }
132- if loopback {
133- ni .Flags |= net .FlagLoopback
134- }
135- if pointToPoint {
136- ni .Flags |= net .FlagPointToPoint
137- }
138- if multicast {
139- ni .Flags |= net .FlagMulticast
122+ // parseIfaceHeader parses the header portion of an external interface line
123+ // (everything before the "|") into a net.Interface with the correct flags.
124+ func parseIfaceHeader (header string ) (net.Interface , error ) {
125+ var name string
126+ var index , mtu int
127+ var up , broadcast , loopback , pointToPoint , multicast bool
128+ _ , err := fmt .Sscanf (header , "%s %d %d %t %t %t %t %t" ,
129+ & name , & index , & mtu , & up , & broadcast , & loopback , & pointToPoint , & multicast )
130+ if err != nil {
131+ return net.Interface {}, fmt .Errorf ("cannot parse iface header %q: %v" , header , err )
132+ }
133+
134+ ni := net.Interface {
135+ Name : name ,
136+ Index : index ,
137+ MTU : mtu ,
138+ }
139+
140+ type flagEntry struct {
141+ set bool
142+ flag net.Flags
143+ }
144+ for _ , f := range []flagEntry {
145+ {up , net .FlagUp },
146+ {broadcast , net .FlagBroadcast },
147+ {loopback , net .FlagLoopback },
148+ {pointToPoint , net .FlagPointToPoint },
149+ {multicast , net .FlagMulticast },
150+ } {
151+ if f .set {
152+ ni .Flags |= f .flag
140153 }
141- ifaces = append (ifaces , ni )
154+ }
155+
156+ return ni , nil
157+ }
142158
143- var addrs []net. Addr
144- for _ , addr := range strings . Split ( strings . Trim ( fields [ 1 ], " \n " ), " " ) {
145- if addr == "" || strings . Contains ( addr , "%" ) {
146- continue
147- }
148- ip , ipNet , err := net . ParseCIDR (addr )
149- if err != nil {
150- log . Warnf ( "network_addresses_android: cannot parse addr %q: %v" , addr , err )
151- continue
152- }
153- ipNet . IP = ip
154- addrs = append ( addrs , ipNet )
159+ // parseIfaceAddrs parses the address portion of an external interface line
160+ // (everything after the "|") into a slice of net.Addr.
161+ func parseIfaceAddrs ( raw string ) []net. Addr {
162+ var addrs []net. Addr
163+ for _ , addr := range strings . Split ( strings . Trim ( raw , " \n " ), " " ) {
164+ if addr == "" || strings . Contains (addr , "%" ) {
165+ continue
166+ }
167+ ip , ipNet , err := net . ParseCIDR ( addr )
168+ if err != nil {
169+ log . Warnf ( "network_addresses_android: cannot parse addr %q: %v" , addr , err )
170+ continue
155171 }
156- addrMap [name ] = addrs
172+ ipNet .IP = ip
173+ addrs = append (addrs , ipNet )
157174 }
158- return ifaces , addrMap
175+ return addrs
159176}
0 commit comments