From: Sage Weil Date: Mon, 28 Nov 2011 00:07:20 +0000 (-0800) Subject: pick_address: implement have_local_addr() X-Git-Tag: v0.39~11 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=61b9db3a8eb013d4f06493abd375630e27362017;p=ceph.git pick_address: implement have_local_addr() Check for a local ip from within a list of addresses. Signed-off-by: Sage Weil --- diff --git a/src/common/pick_address.cc b/src/common/pick_address.cc index ab1c0330fe96..730fa5e1d590 100644 --- a/src/common/pick_address.cc +++ b/src/common/pick_address.cc @@ -82,3 +82,30 @@ void pick_addresses(CephContext *cct) freeifaddrs(ifa); } + +bool have_local_addr(CephContext *cct, const list& ls, entity_addr_t *match) +{ + struct ifaddrs *ifa; + int r = getifaddrs(&ifa); + if (r < 0) { + lderr(cct) << "unable to fetch interfaces and addresses: " << cpp_strerror(errno) << dendl; + exit(1); + } + + bool found = false; + for (struct ifaddrs *addrs = ifa; addrs != NULL; addrs = addrs->ifa_next) { + entity_addr_t a; + a.set_sockaddr(addrs->ifa_addr); + for (list::const_iterator p = ls.begin(); p != ls.end(); ++p) { + if (a.is_same_host(*p)) { + *match = *p; + found = true; + goto out; + } + } + } + + out: + freeifaddrs(ifa); + return found; +} diff --git a/src/common/pick_address.h b/src/common/pick_address.h index aaa77f0d3154..e0b9bf9f6783 100644 --- a/src/common/pick_address.h +++ b/src/common/pick_address.h @@ -26,4 +26,15 @@ class CephContext; */ void pick_addresses(CephContext *cct); +/** + * check for a locally configured address + * + * check if any of the listed addresses is configured on the local host. + * + * @cct context + * @ls list of addresses + * @match [out] pointer to match, if an item in @ls is found configured locally. + */ +bool have_local_addr(CephContext *cct, const list& ls, entity_addr_t *match); + #endif diff --git a/src/msg/msg_types.h b/src/msg/msg_types.h index f5f114af8be5..b727d268ad9f 100644 --- a/src/msg/msg_types.h +++ b/src/msg/msg_types.h @@ -211,6 +211,21 @@ struct entity_addr_t { return addr6; } + bool set_sockaddr(struct sockaddr *sa) + { + switch (sa->sa_family) { + case AF_INET: + memcpy(&addr4, sa, sizeof(sockaddr_in)); + break; + case AF_INET6: + memcpy(&addr6, sa, sizeof(sockaddr_in6)); + break; + default: + return false; + } + return true; + } + void set_in4_quad(int pos, int val) { addr4.sin_family = AF_INET; unsigned char *ipq = (unsigned char*)&addr4.sin_addr.s_addr;