diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-12-26 09:34:30 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-12-26 09:34:30 +0100 |
commit | 7a54873252a6e8a55dd296ee155469e6ffbdd475 (patch) | |
tree | 739bb397235dfdeaad8b33098b90676c23bf7607 /sys/src/libip | |
parent | de349cf9b06c155a89675e2b453a518e43808e81 (diff) |
libip: skip ipv6 loopback address (thanks mischief)
Diffstat (limited to 'sys/src/libip')
-rw-r--r-- | sys/src/libip/myipaddr.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/sys/src/libip/myipaddr.c b/sys/src/libip/myipaddr.c index e1a2773bd..48a099ef6 100644 --- a/sys/src/libip/myipaddr.c +++ b/sys/src/libip/myipaddr.c @@ -14,6 +14,12 @@ static uchar loopbackmask[IPaddrlen] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0, 0 }; +static uchar loopback6[IPaddrlen] = { + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 1 +}; // find first ip addr that isn't the friggin loopback address // unless there are no others @@ -28,14 +34,21 @@ myipaddr(uchar *ip, char *net) ifc = readipifc(net, ifc, -1); for(nifc = ifc; nifc; nifc = nifc->next) for(lifc = nifc->lifc; lifc; lifc = lifc->next){ + /* unspecified */ + if(ipcmp(lifc->ip, IPnoaddr) == 0) + continue; + + /* ipv6 loopback */ + if(ipcmp(lifc->ip, loopback6) == 0) + continue; + + /* ipv4 loopback */ maskip(lifc->ip, loopbackmask, mynet); - if(ipcmp(mynet, loopbacknet) == 0){ + if(ipcmp(mynet, loopbacknet) == 0) continue; - } - if(ipcmp(lifc->ip, IPnoaddr) != 0){ - ipmove(ip, lifc->ip); - return 0; - } + + ipmove(ip, lifc->ip); + return 0; } ipmove(ip, IPnoaddr); return -1; |