]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
pick_address: implement have_local_addr()
authorSage Weil <sage@newdream.net>
Mon, 28 Nov 2011 00:07:20 +0000 (16:07 -0800)
committerSage Weil <sage@newdream.net>
Mon, 28 Nov 2011 00:11:28 +0000 (16:11 -0800)
Check for a local ip from within a list of addresses.

Signed-off-by: Sage Weil <sage@newdream.net>
src/common/pick_address.cc
src/common/pick_address.h
src/msg/msg_types.h

index ab1c0330fe9630b1dce3e2dc94afdd6069666b87..730fa5e1d59000ae4652cada48d5bb916c1aa38b 100644 (file)
@@ -82,3 +82,30 @@ void pick_addresses(CephContext *cct)
 
   freeifaddrs(ifa);
 }
+
+bool have_local_addr(CephContext *cct, const list<entity_addr_t>& 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<entity_addr_t>::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;
+}
index aaa77f0d3154c6af93b878b2987701e542f90ab9..e0b9bf9f6783c862404947f3ebef9474a2e4c442 100644 (file)
@@ -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<entity_addr_t>& ls, entity_addr_t *match);
+
 #endif
index f5f114af8be5bac754c7afe26a7aefc2b18dfaf7..b727d268ad9f02fcce38ffd831ba2a39919ec971 100644 (file)
@@ -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;