Instead of duplicating this routine between the accord and zookeeper
drivers move it to lib/net.c as it is generic networking releated code.

Also rename the function to get_local_addr to be a bit more descriptive.

Signed-off-by: Christoph Hellwig <[email protected]>

diff --git a/include/net.h b/include/net.h
index 0286ea5..d97984e 100644
--- a/include/net.h
+++ b/include/net.h
@@ -55,5 +55,6 @@ uint8_t *str_to_addr(int af, const char *ipstr, uint8_t 
*addr);
 int set_nonblocking(int fd);
 int set_nodelay(int fd);
 int set_timeout(int fd);
+int get_local_addr(uint8_t *bytes);
 
 #endif
diff --git a/lib/net.c b/lib/net.c
index 8e46969..db952dd 100644
--- a/lib/net.c
+++ b/lib/net.c
@@ -440,3 +440,57 @@ int set_timeout(int fd)
 
        return 0;
 }
+
+int get_local_addr(uint8_t *bytes)
+{
+       int ret;
+       char name[INET6_ADDRSTRLEN];
+       struct addrinfo hints, *res, *res0;
+
+       gethostname(name, sizeof(name));
+
+       memset(&hints, 0, sizeof(hints));
+
+       hints.ai_family = AF_INET;
+       hints.ai_socktype = SOCK_STREAM;
+       ret = getaddrinfo(name, NULL, &hints, &res0);
+       if (ret)
+               exit(1);
+
+       for (res = res0; res; res = res->ai_next) {
+               if (res->ai_family == AF_INET) {
+                       struct sockaddr_in *addr;
+                       addr = (struct sockaddr_in *)res->ai_addr;
+
+                       if (((char *) &addr->sin_addr)[0] == 127)
+                               continue;
+
+                       memset(bytes, 0, 12);
+                       memcpy(bytes + 12, &addr->sin_addr, 4);
+                       break;
+               } else if (res->ai_family == AF_INET6) {
+                       struct sockaddr_in6 *addr;
+                       uint8_t localhost[16] = { 0, 0, 0, 0, 0, 0, 0, 0,
+                                                 0, 0, 0, 0, 0, 0, 0, 1 };
+
+                       addr = (struct sockaddr_in6 *)res->ai_addr;
+
+                       if (memcmp(&addr->sin6_addr, localhost, 16) == 0)
+                               continue;
+
+                       memcpy(bytes, &addr->sin6_addr, 16);
+                       break;
+               } else
+                       dprintf("unknown address family\n");
+       }
+
+       if (res == NULL) {
+               eprintf("failed to get address info\n");
+               return -1;
+       }
+
+       freeaddrinfo(res0);
+
+       return 0;
+}
+
diff --git a/sheep/cluster/accord.c b/sheep/cluster/accord.c
index abb6db1..1472b24 100644
--- a/sheep/cluster/accord.c
+++ b/sheep/cluster/accord.c
@@ -11,7 +11,6 @@
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
-#include <netdb.h>
 #include <search.h>
 #include <assert.h>
 #include <pthread.h>
@@ -292,58 +291,6 @@ out:
        return 0;
 }
 
-static int get_addr(uint8_t *bytes)
-{
-       int ret;
-       char name[INET6_ADDRSTRLEN];
-       struct addrinfo hints, *res, *res0;
-
-       gethostname(name, sizeof(name));
-
-       memset(&hints, 0, sizeof(hints));
-
-       hints.ai_socktype = SOCK_STREAM;
-       ret = getaddrinfo(name, NULL, &hints, &res0);
-       if (ret)
-               exit(1);
-
-       for (res = res0; res; res = res->ai_next) {
-               if (res->ai_family == AF_INET) {
-                       struct sockaddr_in *addr;
-                       addr = (struct sockaddr_in *)res->ai_addr;
-
-                       if (((char *) &addr->sin_addr)[0] == 127)
-                               continue;
-
-                       memset(bytes, 0, 12);
-                       memcpy(bytes + 12, &addr->sin_addr, 4);
-                       break;
-               } else if (res->ai_family == AF_INET6) {
-                       struct sockaddr_in6 *addr;
-                       uint8_t localhost[16] = { 0, 0, 0, 0, 0, 0, 0, 0,
-                                                 0, 0, 0, 0, 0, 0, 0, 1 };
-
-                       addr = (struct sockaddr_in6 *)res->ai_addr;
-
-                       if (memcmp(&addr->sin6_addr, localhost, 16) == 0)
-                               continue;
-
-                       memcpy(bytes, &addr->sin6_addr, 16);
-                       break;
-               } else
-                       dprintf("unknown address family\n");
-       }
-
-       if (res == NULL) {
-               eprintf("failed to get address info\n");
-               return -1;
-       }
-
-       freeaddrinfo(res0);
-
-       return 0;
-}
-
 static void find_queue_end(struct acrd_handle *ah, const char *path, void *arg)
 {
        int max;
@@ -599,7 +546,7 @@ static int accord_init(const char *option, uint8_t *myaddr)
                return -1;
        }
 
-       if (get_addr(myaddr) < 0)
+       if (get_local_addr(myaddr) < 0)
                return -1;
 
        efd = eventfd(0, EFD_NONBLOCK);
diff --git a/sheep/cluster/zookeeper.c b/sheep/cluster/zookeeper.c
index 3dde1e4..a8bff05 100644
--- a/sheep/cluster/zookeeper.c
+++ b/sheep/cluster/zookeeper.c
@@ -11,7 +11,6 @@
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
-#include <netdb.h>
 #include <search.h>
 #include <assert.h>
 #include <sys/epoll.h>
@@ -574,59 +573,6 @@ static void watcher(zhandle_t *zh, int type, int state, 
const char *path, void*
        eventfd_write(efd, value);
 }
 
-static int get_addr(uint8_t *bytes)
-{
-       int ret;
-       char name[INET6_ADDRSTRLEN];
-       struct addrinfo hints, *res, *res0;
-
-       gethostname(name, sizeof(name));
-
-       memset(&hints, 0, sizeof(hints));
-
-       hints.ai_family = AF_INET;
-       hints.ai_socktype = SOCK_STREAM;
-       ret = getaddrinfo(name, NULL, &hints, &res0);
-       if (ret)
-               exit(1);
-
-       for (res = res0; res; res = res->ai_next) {
-               if (res->ai_family == AF_INET) {
-                       struct sockaddr_in *addr;
-                       addr = (struct sockaddr_in *)res->ai_addr;
-
-                       if (((char *) &addr->sin_addr)[0] == 127)
-                               continue;
-
-                       memset(bytes, 0, 12);
-                       memcpy(bytes + 12, &addr->sin_addr, 4);
-                       break;
-               } else if (res->ai_family == AF_INET6) {
-                       struct sockaddr_in6 *addr;
-                       uint8_t localhost[16] = { 0, 0, 0, 0, 0, 0, 0, 0,
-                                                 0, 0, 0, 0, 0, 0, 0, 1 };
-
-                       addr = (struct sockaddr_in6 *)res->ai_addr;
-
-                       if (memcmp(&addr->sin6_addr, localhost, 16) == 0)
-                               continue;
-
-                       memcpy(bytes, &addr->sin6_addr, 16);
-                       break;
-               } else
-                       dprintf("unknown address family\n");
-       }
-
-       if (res == NULL) {
-               eprintf("failed to get address info\n");
-               return -1;
-       }
-
-       freeaddrinfo(res0);
-
-       return 0;
-}
-
 static int zk_join(struct sd_node *myself,
                   void *opaque, size_t opaque_len)
 {
@@ -861,7 +807,7 @@ static int zk_init(const char *option, uint8_t *myaddr)
                "negotiated session timeout:%dms\n",
                SESSION_TIMEOUT, zoo_recv_timeout(zhandle));
 
-       if (get_addr(myaddr) < 0)
+       if (get_local_addr(myaddr) < 0)
                return -1;
 
        zk_queue_init(zhandle);
-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to