]> granicus.if.org Git - libevent/commitdiff
Split evutil_found_ifaddr() into helpers (evutil_v{4,6}addr_is_local())
authorAzat Khuzhin <a3at.mail@gmail.com>
Wed, 24 Oct 2018 21:01:59 +0000 (00:01 +0300)
committerAzat Khuzhin <a3at.mail@gmail.com>
Wed, 24 Oct 2018 21:49:45 +0000 (00:49 +0300)
evutil.c
util-internal.h

index 0b950cf755cb5cd42aecd6f21c085b4e3eac3610..d93eff5fe3c0744f6b3247df3b2f27f1191c99f4 100644 (file)
--- a/evutil.c
+++ b/evutil.c
@@ -609,36 +609,42 @@ static inline int evutil_v4addr_is_linklocal(ev_uint32_t addr)
 static inline int evutil_v4addr_is_classd(ev_uint32_t addr)
 { return ((addr>>24) & 0xf0) == 0xe0; }
 
+int
+evutil_v4addr_is_local_(const struct in_addr *in)
+{
+       const ev_uint32_t addr = ntohl(in->s_addr);
+       return addr == INADDR_ANY ||
+               evutil_v4addr_is_localhost(addr) ||
+               evutil_v4addr_is_linklocal(addr) ||
+               evutil_v4addr_is_classd(addr);
+}
+int
+evutil_v6addr_is_local_(const struct in6_addr *in)
+{
+       static const char ZEROES[] =
+               "\x00\x00\x00\x00\x00\x00\x00\x00"
+               "\x00\x00\x00\x00\x00\x00\x00\x00";
+
+       const unsigned char *addr = (const unsigned char *)in->s6_addr;
+       return !memcmp(addr, ZEROES, 8) ||
+               ((addr[0] & 0xfe) == 0xfc) ||
+               (addr[0] == 0xfe && (addr[1] & 0xc0) == 0x80) ||
+               (addr[0] == 0xfe && (addr[1] & 0xc0) == 0xc0) ||
+               (addr[0] == 0xff);
+}
+
 static void
 evutil_found_ifaddr(const struct sockaddr *sa)
 {
-       const char ZEROES[] = "\x00\x00\x00\x00\x00\x00\x00\x00"
-           "\x00\x00\x00\x00\x00\x00\x00\x00";
-
        if (sa->sa_family == AF_INET) {
                const struct sockaddr_in *sin = (struct sockaddr_in *)sa;
-               ev_uint32_t addr = ntohl(sin->sin_addr.s_addr);
-               if (addr == INADDR_ANY ||
-                   evutil_v4addr_is_localhost(addr) ||
-                   evutil_v4addr_is_linklocal(addr) ||
-                   evutil_v4addr_is_classd(addr)) {
-                       /* Not actually a usable external address. */
-               } else {
+               if (!evutil_v4addr_is_local_(&sin->sin_addr)) {
                        event_debug(("Detected an IPv4 interface"));
                        had_ipv4_address = 1;
                }
        } else if (sa->sa_family == AF_INET6) {
                const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
-               const unsigned char *addr =
-                   (unsigned char*)sin6->sin6_addr.s6_addr;
-               if (!memcmp(addr, ZEROES, 8) ||
-                   ((addr[0] & 0xfe) == 0xfc) ||
-                   (addr[0] == 0xfe && (addr[1] & 0xc0) == 0x80) ||
-                   (addr[0] == 0xfe && (addr[1] & 0xc0) == 0xc0) ||
-                   (addr[0] == 0xff)) {
-                       /* This is a reserved, ipv4compat, ipv4map, loopback,
-                        * link-local, multicast, or unspecified address. */
-               } else {
+               if (!evutil_v6addr_is_local_(&sin6->sin6_addr)) {
                        event_debug(("Detected an IPv6 interface"));
                        had_ipv6_address = 1;
                }
index fe416409f06e897e958bd3e0e7a39d61f1511cde..b727bf1fd7e9701b0be348dc69c8c1391e2ae195 100644 (file)
@@ -527,6 +527,17 @@ evutil_socket_t evutil_eventfd_(unsigned initval, int flags);
 
 void evutil_memclear_(void *mem, size_t len);
 
+struct in_addr;
+struct in6_addr;
+
+/* This is a any, loopback, link-local, multicast */
+EVENT2_EXPORT_SYMBOL
+int evutil_v4addr_is_local_(const struct in_addr *in);
+/* This is a reserved, ipv4compat, ipv4map, loopback,
+ * link-local, multicast, or unspecified address. */
+EVENT2_EXPORT_SYMBOL
+int evutil_v6addr_is_local_(const struct in6_addr *in);
+
 #ifdef __cplusplus
 }
 #endif