[Sheepdog] [PATCH] get ip address from corosync

FUJITA Tomonori fujita.tomonori at lab.ntt.co.jp
Sun Mar 28 14:14:35 CEST 2010


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




More information about the sheepdog mailing list