Check for a local ip from within a list of addresses.
Signed-off-by: Sage Weil <sage@newdream.net>
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;
+}
*/
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
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;