From: Kevin Webb Date: Thu, 28 Jan 2010 16:23:52 +0000 (+0000) Subject: Dont ignore non-routable ip addresses if theyre the only choice! X-Git-Tag: DistributedRateLimiting-0.1-0~9 X-Git-Url: http://git.onelab.eu/?p=distributedratelimiting.git;a=commitdiff_plain;h=7d2cc424a51e76727008437fedf5cfa2126bac67 Dont ignore non-routable ip addresses if theyre the only choice! --- 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;