@ -15,8 +15,6 @@ import (
"net"
"net"
"net/netip"
"net/netip"
"os"
"os"
"os/exec"
"runtime"
"strings"
"strings"
"sync/atomic"
"sync/atomic"
@ -50,9 +48,6 @@ ens18 0000000A 00000000 0001 0 0 0 0000FFFF
func likelyHomeRouterIPLinux ( ) ( ret netip . Addr , myIP netip . Addr , ok bool ) {
func likelyHomeRouterIPLinux ( ) ( ret netip . Addr , myIP netip . Addr , ok bool ) {
if procNetRouteErr . Load ( ) {
if procNetRouteErr . Load ( ) {
// If we failed to read /proc/net/route previously, don't keep trying.
// If we failed to read /proc/net/route previously, don't keep trying.
if runtime . GOOS == "android" {
return likelyHomeRouterIPAndroid ( )
}
return ret , myIP , false
return ret , myIP , false
}
}
lineNum := 0
lineNum := 0
@ -94,9 +89,6 @@ func likelyHomeRouterIPLinux() (ret netip.Addr, myIP netip.Addr, ok bool) {
}
}
if err != nil {
if err != nil {
procNetRouteErr . Store ( true )
procNetRouteErr . Store ( true )
if runtime . GOOS == "android" {
return likelyHomeRouterIPAndroid ( )
}
log . Printf ( "interfaces: failed to read /proc/net/route: %v" , err )
log . Printf ( "interfaces: failed to read /proc/net/route: %v" , err )
}
}
if ret . IsValid ( ) {
if ret . IsValid ( ) {
@ -137,41 +129,6 @@ func likelyHomeRouterIPLinux() (ret netip.Addr, myIP netip.Addr, ok bool) {
return netip . Addr { } , netip . Addr { } , false
return netip . Addr { } , netip . Addr { } , false
}
}
// Android apps don't have permission to read /proc/net/route, at
// least on Google devices and the Android emulator.
func likelyHomeRouterIPAndroid ( ) ( ret netip . Addr , _ netip . Addr , ok bool ) {
cmd := exec . Command ( "/system/bin/ip" , "route" , "show" , "table" , "0" )
out , err := cmd . StdoutPipe ( )
if err != nil {
return
}
if err := cmd . Start ( ) ; err != nil {
log . Printf ( "interfaces: running /system/bin/ip: %v" , err )
return
}
// Search for line like "default via 10.0.2.2 dev radio0 table 1016 proto static mtu 1500 "
lineread . Reader ( out , func ( line [ ] byte ) error {
const pfx = "default via "
if ! mem . HasPrefix ( mem . B ( line ) , mem . S ( pfx ) ) {
return nil
}
line = line [ len ( pfx ) : ]
sp := bytes . IndexByte ( line , ' ' )
if sp == - 1 {
return nil
}
ipb := line [ : sp ]
if ip , err := netip . ParseAddr ( string ( ipb ) ) ; err == nil && ip . Is4 ( ) {
ret = ip
log . Printf ( "interfaces: found Android default route %v" , ip )
}
return nil
} )
cmd . Process . Kill ( )
cmd . Wait ( )
return ret , netip . Addr { } , ret . IsValid ( )
}
func defaultRoute ( ) ( d DefaultRouteDetails , err error ) {
func defaultRoute ( ) ( d DefaultRouteDetails , err error ) {
v , err := defaultRouteInterfaceProcNet ( )
v , err := defaultRouteInterfaceProcNet ( )
if err == nil {
if err == nil {