This is against the next branch. = From: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp> Date: Sun, 28 Mar 2010 21:10:43 +0900 Subject: [PATCH] get ip address from corosync Better get the ip address info from corosync instead of trying to get it in a hacky way. Signed-off-by: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp> --- collie/Makefile | 2 +- collie/group.c | 89 +++++++++++++++++++++++++++---------------------------- 2 files changed, 45 insertions(+), 46 deletions(-) diff --git a/collie/Makefile b/collie/Makefile index 2bfc9c6..c2f7eb9 100644 --- a/collie/Makefile +++ b/collie/Makefile @@ -2,7 +2,7 @@ sbindir ?= $(PREFIX)/sbin CFLAGS += -g -O2 -Wall -Wstrict-prototypes -I../include CFLAGS += -D_GNU_SOURCE -DSD_VERSION=\"$(VERSION)\" -LIBS += -lpthread -lcpg +LIBS += -lpthread -lcpg -lcfg PROGRAMS = collie COLLIE_OBJS = collie.o net.o vdi.o group.o store.o work.o ../lib/event.o ../lib/net.o ../lib/logger.o diff --git a/collie/group.c b/collie/group.c index 2067870..1f31289 100644 --- a/collie/group.c +++ b/collie/group.c @@ -12,8 +12,10 @@ #include <stdlib.h> #include <unistd.h> #include <netdb.h> +#include <arpa/inet.h> #include <sys/time.h> #include <corosync/cpg.h> +#include <corosync/cfg.h> #include "sheepdog_proto.h" #include "collie.h" @@ -981,12 +983,51 @@ int build_node_list(struct list_head *node_list, return nr; } +static void set_addr(unsigned int nodeid, void *buf, int buflen) +{ + int ret, nr; + corosync_cfg_handle_t handle; + corosync_cfg_node_address_t addr; + struct sockaddr_storage *ss = (struct sockaddr_storage *)addr.address; + struct sockaddr_in *sin = (struct sockaddr_in *)addr.address; + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr.address; + void *saddr; + + ret = corosync_cfg_initialize(&handle, NULL); + if (ret != CS_OK) { + vprintf(SDOG_ERR "failed to initiazize cfg %d\n", ret); + exit(1); + } + + ret = corosync_cfg_get_node_addrs(handle, nodeid, 1, &nr, &addr); + if (ret != CS_OK) { + vprintf(SDOG_ERR "failed to get addr %d\n", ret); + exit(1); + } + + if (!nr) { + vprintf(SDOG_ERR "we got no address\n"); + exit(1); + } + + if (ss->ss_family == AF_INET6) + saddr = &sin6->sin6_addr; + else if (ss->ss_family == AF_INET) + saddr = &sin->sin_addr; + else { + vprintf(SDOG_ERR "unknown protocol %d\n", ss->ss_family); + exit(1); + } + + inet_ntop(ss->ss_family, saddr, buf, buflen); + + vprintf(SDOG_INFO "addr = %s\n", (char *)buf); +} + int create_cluster(int port) { int fd, ret; cpg_handle_t cpg_handle; - struct addrinfo hints, *res, *res0; - char name[INET6_ADDRSTRLEN]; struct cpg_name group = { 8, "sheepdog" }; cpg_callbacks_t cb = { &sd_deliver, &sd_confch }; unsigned int nodeid = 0; @@ -1028,49 +1069,7 @@ join_retry: sys->this_nodeid = nodeid; sys->this_pid = getpid(); - 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(sys->this_node.addr, 0, 12); - memcpy(sys->this_node.addr + 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(sys->this_node.addr, &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); - + set_addr(nodeid, sys->this_node.addr, sizeof(sys->this_node.addr)); sys->this_node.port = port; hval = fnv_64a_buf(&sys->this_node.port, sizeof(sys->this_node.port), -- 1.7.0 |