summaryrefslogtreecommitdiff
path: root/sys/src/libip/myipaddr.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2019-02-13 18:56:21 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2019-02-13 18:56:21 +0100
commitdc6772fccc90d90c700eb679b9dfcde4a71fc8cb (patch)
tree3448fafe58abe4fbbd6253868abf95e6b0468f96 /sys/src/libip/myipaddr.c
parent06912e53e491dedb495ca4e6a308831ef7af544f (diff)
libip: prefer v4 over v6 for myipaddr()
myipaddr() is used in legacy applications that assume a single ip address per host. so prefer to retun a v4 address over a v6 one.
Diffstat (limited to 'sys/src/libip/myipaddr.c')
-rw-r--r--sys/src/libip/myipaddr.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/sys/src/libip/myipaddr.c b/sys/src/libip/myipaddr.c
index 31f5573ce..e744cb179 100644
--- a/sys/src/libip/myipaddr.c
+++ b/sys/src/libip/myipaddr.c
@@ -21,8 +21,8 @@ static uchar loopback6[IPaddrlen] = {
0, 0, 0, 1
};
-// find first ip addr that isn't the friggin loopback address
-// unless there are no others
+// find first ip that isn't a friggin loopback or
+// link-local address. prefer v4 over v6.
int
myipaddr(uchar *ip, char *net)
{
@@ -31,29 +31,39 @@ myipaddr(uchar *ip, char *net)
static Ipifc *ifc;
uchar mynet[IPaddrlen];
+ ipmove(ip, IPnoaddr);
ifc = readipifc(net, ifc, -1);
- for(nifc = ifc; nifc; nifc = nifc->next)
- for(lifc = nifc->lifc; lifc; lifc = lifc->next){
+ for(nifc = ifc; nifc != nil; nifc = nifc->next){
+ for(lifc = nifc->lifc; lifc != nil; lifc = lifc->next){
/* unspecified */
if(ipcmp(lifc->ip, IPnoaddr) == 0)
continue;
+ if(isv4(lifc->ip)){
+ /* ipv4 loopback */
+ maskip(lifc->ip, loopbackmask, mynet);
+ if(ipcmp(mynet, loopbacknet) == 0)
+ continue;
+
+ ipmove(ip, lifc->ip);
+ return 0;
+ }
+
+ /* already got a v6 address? */
+ if(ipcmp(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)
- continue;
-
/* ipv6 linklocal */
if(ISIPV6LINKLOCAL(lifc->ip))
continue;
+ /* save first v6 address */
ipmove(ip, lifc->ip);
- return 0;
}
- ipmove(ip, IPnoaddr);
- return -1;
+ }
+ return ipcmp(ip, IPnoaddr) != 0 ? 0 : -1;
}