summaryrefslogtreecommitdiff
path: root/sys/src/libip
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2014-12-26 09:34:30 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2014-12-26 09:34:30 +0100
commit7a54873252a6e8a55dd296ee155469e6ffbdd475 (patch)
tree739bb397235dfdeaad8b33098b90676c23bf7607 /sys/src/libip
parentde349cf9b06c155a89675e2b453a518e43808e81 (diff)
libip: skip ipv6 loopback address (thanks mischief)
Diffstat (limited to 'sys/src/libip')
-rw-r--r--sys/src/libip/myipaddr.c25
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;