Dont ignore non-routable ip addresses if theyre the only choice!
[distributedratelimiting.git] / drl / util.c
index 4bf3d04..a99e27e 100644 (file)
@@ -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;