diff options
Diffstat (limited to 'src/libip/myipaddr.c')
-rw-r--r-- | src/libip/myipaddr.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/src/libip/myipaddr.c b/src/libip/myipaddr.c index d9b69201..a7149ffa 100644 --- a/src/libip/myipaddr.c +++ b/src/libip/myipaddr.c @@ -2,20 +2,44 @@ #include <libc.h> #include <ip.h> +static uchar loopbacknet[IPaddrlen] = { + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0xff, 0xff, + 127, 0, 0, 0 +}; +static uchar loopbackmask[IPaddrlen] = { + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0xff, 0, 0, 0 +}; + +// find first ip addr that isn't the friggin loopback address +// unless there are no others int myipaddr(uchar *ip, char *net) { Ipifc *nifc; Iplifc *lifc; - static Ipifc *ifc; + Ipifc *ifc; + uchar mynet[IPaddrlen]; - ifc = readipifc(net, ifc, -1); + ifc = readipifc(net, nil, -1); for(nifc = ifc; nifc; nifc = nifc->next) - for(lifc = nifc->lifc; lifc; lifc = lifc->next) + for(lifc = nifc->lifc; lifc; lifc = lifc->next){ + maskip(lifc->ip, loopbackmask, mynet); + if(ipcmp(mynet, loopbacknet) == 0){ + continue; + } if(ipcmp(lifc->ip, IPnoaddr) != 0){ ipmove(ip, lifc->ip); + freeipifc(ifc); return 0; } + } ipmove(ip, IPnoaddr); + freeipifc(ifc); return -1; } + |