From 7d2cc424a51e76727008437fedf5cfa2126bac67 Mon Sep 17 00:00:00 2001 From: Kevin Webb Date: Thu, 28 Jan 2010 16:23:52 +0000 Subject: [PATCH] Dont ignore non-routable ip addresses if theyre the only choice! --- drl/util.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/drl/util.c b/drl/util.c index 4bf3d04..a99e27e 100644 --- a/drl/util.c +++ b/drl/util.c @@ -231,7 +231,7 @@ void map_insert(map_handle map, void *key, int keylen, void *value) { * return the string. */ char* get_local_ip(){ - char *ip; + char *ip, *localip; struct ifaddrs *ifa = NULL, *ifp = NULL; struct sockaddr *addr; uint32_t ho_addr; @@ -253,6 +253,7 @@ char* get_local_ip(){ #define STRINGSIZE 200 ip = (char *)malloc(STRINGSIZE); + localip = NULL; for (ifa = ifp; ifa; ifa=ifa->ifa_next){ @@ -279,20 +280,32 @@ char* get_local_ip(){ /* is it MSB first? */ - if ( (addrbyte != 192) && (addrbyte != 172) - && (addrbyte != 10) && (addrbyte != 127) ){ + /* We don't want to choose the loopback. */ + if (addrbyte == 127) + continue; + + /* If there's a non-local address, use that. */ + if ((addrbyte != 192) && (addrbyte != 172) && (addrbyte != 10)){ printlog(LOG_WARN, " Using ip: %s\n",ip); freeifaddrs(ifp); -#if 0 - return (ifa->ifa_addr->sin_addr); -#else + if (localip != NULL) { + free(localip); + } return(ip); /* for now return the IP address */ -#endif + } else { + if (localip == NULL) { + localip = malloc(STRINGSIZE); + } + strncpy(localip, ip, STRINGSIZE); } } freeifaddrs(ifp); free(ip); - return(NULL); + + if (localip != NULL) + return localip; + else + return(NULL); } static FILE *urandfd = NULL; -- 2.43.0