]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: replace deprecated ares_gethostbyname
authorAndrew Cooks <acooks.at.bda@gmail.com>
Thu, 25 Apr 2024 07:18:39 +0000 (17:18 +1000)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Fri, 3 May 2024 12:42:10 +0000 (12:42 +0000)
c-ares has deprecated ares_gethostbyname() in version 1.28.0
Replace it with ares_getaddrinfo().

This fixes a build error on Fedora 40.

Signed-off-by: Andrew Cooks <acooks.at.bda@gmail.com>
(cherry picked from commit 89a2e4d8257a91d115fa29e02261c33312da5cba)

lib/resolver.c

index 29a0eb740e15067a29aa5a48be7ad8ec6e185648..901ccf8132e3ed3e800460259577d9d42da3f582 100644 (file)
@@ -179,7 +179,56 @@ static void ares_socket_cb(void *data, ares_socket_t fd, int readable,
        resolver_fd_drop_maybe(resfd);
 }
 
+#if (ARES_VERSION >= 0x011c00)
+static void ares_address_cb(void *arg, int status, int timeouts,
+                           struct ares_addrinfo *result)
+{
+       struct resolver_query *query = (struct resolver_query *)arg;
+       union sockunion addr[16];
+       void (*callback)(struct resolver_query *q, const char *err, int ret,
+                        union sockunion *s);
+       size_t i;
+       struct ares_addrinfo_node *node;
 
+       callback = query->callback;
+       query->callback = NULL;
+
+       if (status != ARES_SUCCESS) {
+               if (resolver_debug)
+                       zlog_debug("[%p] Resolving failed (%s)",
+                                  query, ares_strerror(status));
+
+               callback(query, ares_strerror(status), -1, NULL);
+               if (result)
+                       ares_freeaddrinfo(result);
+               return;
+       }
+
+
+       node = result->nodes;
+       for (i = 0; i < array_size(addr) && node; i++) {
+               memset(&addr[i], 0, sizeof(addr[i]));
+               addr[i].sa.sa_family = node->ai_family;
+               switch (node->ai_family) {
+               case AF_INET:
+                       memcpy(&addr[i].sin.sin_addr, node->ai_addr,
+                              node->ai_addrlen);
+                       break;
+               case AF_INET6:
+                       memcpy(&addr[i].sin6.sin6_addr, node->ai_addr,
+                              node->ai_addrlen);
+                       break;
+               }
+               node = node->ai_next;
+       }
+
+       if (resolver_debug)
+               zlog_debug("[%p] Resolved with %d results", query, (int)i);
+
+       callback(query, NULL, i, &addr[0]);
+       ares_freeaddrinfo(result);
+}
+#else
 static void ares_address_cb(void *arg, int status, int timeouts,
                            struct hostent *he)
 {
@@ -222,6 +271,8 @@ static void ares_address_cb(void *arg, int status, int timeouts,
        callback(query, NULL, i, &addr[0]);
 }
 
+#endif
+
 static void resolver_cb_literal(struct event *t)
 {
        struct resolver_query *query = EVENT_ARG(t);
@@ -240,6 +291,14 @@ void resolver_resolve(struct resolver_query *query, int af, vrf_id_t vrf_id,
                                       int, union sockunion *))
 {
        int ret;
+#if (ARES_VERSION >= 0x011c00)
+       struct ares_addrinfo_hints hints = {
+               .ai_flags = 0,
+               .ai_family = af,
+               .ai_socktype = 0, /* any of SOCK_STREAM or SOCK_DGRAM */
+               .ai_protocol = 0  /* any protocol */
+       };
+#endif
 
        if (hostname == NULL)
                return;
@@ -278,7 +337,13 @@ void resolver_resolve(struct resolver_query *query, int af, vrf_id_t vrf_id,
                             __func__, vrf_id, safe_strerror(errno));
                return;
        }
+
+#if (ARES_VERSION >= 0x011c00)
+       ares_getaddrinfo(state.channel, hostname, NULL, &hints, ares_address_cb,
+                        query);
+#else
        ares_gethostbyname(state.channel, hostname, af, ares_address_cb, query);
+#endif
        ret = vrf_switchback_to_initial();
        if (ret < 0)
                flog_err_sys(EC_LIB_SOCKET,