diff --git a/meson.build b/meson.build index d8e35e618d..b9b26cec24 100644 --- a/meson.build +++ b/meson.build @@ -1437,6 +1437,7 @@ includes = include_directories('src/basic', 'src/libsystemd/sd-id128', 'src/libsystemd/sd-netlink', 'src/libsystemd/sd-network', + 'src/libsystemd/sd-resolve', 'src/libsystemd-network', '.') diff --git a/src/libsystemd/meson.build b/src/libsystemd/meson.build index f441bb6972..2576fe7322 100644 --- a/src/libsystemd/meson.build +++ b/src/libsystemd/meson.build @@ -88,6 +88,7 @@ libsystemd_sources = files(''' sd-network/network-util.h sd-network/sd-network.c sd-path/sd-path.c + sd-resolve/resolve-private.h sd-resolve/sd-resolve.c sd-utf8/sd-utf8.c '''.split()) + id128_sources + sd_daemon_c + sd_event_sources + sd_login_c diff --git a/src/libsystemd/sd-resolve/resolve-private.h b/src/libsystemd/sd-resolve/resolve-private.h new file mode 100644 index 0000000000..a0feb36f7c --- /dev/null +++ b/src/libsystemd/sd-resolve/resolve-private.h @@ -0,0 +1,39 @@ +/* SPDX-License-Identifier: LGPL-2.1+ */ +#pragma once + +#include "sd-resolve.h" + +int resolve_getaddrinfo_with_destroy_callback( + sd_resolve *resolve, sd_resolve_query **q, + const char *node, const char *service, const struct addrinfo *hints, + sd_resolve_getaddrinfo_handler_t callback, + sd_resolve_destroy_t destroy_callback, void *userdata); +int resolve_getnameinfo_with_destroy_callback( + sd_resolve *resolve, sd_resolve_query **q, + const struct sockaddr *sa, socklen_t salen, int flags, uint64_t get, + sd_resolve_getnameinfo_handler_t callback, + sd_resolve_destroy_t destroy_callback, void *userdata); + +#define resolve_getaddrinfo(resolve, ret_query, node, service, hints, callback, destroy_callback, userdata) \ + ({ \ + int (*_callback_)(sd_resolve_query*, int, const struct addrinfo*, typeof(userdata)) = callback; \ + void (*_destroy_)(typeof(userdata)) = destroy_callback; \ + resolve_getaddrinfo_with_destroy_callback( \ + resolve, ret_query, \ + node, service, hints, \ + (sd_resolve_getaddrinfo_handler_t) _callback_, \ + (sd_resolve_destroy_t) _destroy_, \ + userdata); \ + }) + +#define resolve_getnameinfo(resolve, ret_query, sa, salen, flags, get, callback, destroy_callback, userdata) \ + ({ \ + int (*_callback_)(sd_resolve_query*, int, const char*, const char*, typeof(userdata)) = callback; \ + void (*_destroy_)(typeof(userdata)) = destroy_callback; \ + resolve_getaddrinfo_with_destroy_callback( \ + resolve, ret_query, \ + sa, salen, flags, get, \ + (sd_resolve_getnameinfo_handler_t) _callback_, \ + (sd_resolve_destroy_t) _destroy_, \ + userdata); \ + }) diff --git a/src/libsystemd/sd-resolve/sd-resolve.c b/src/libsystemd/sd-resolve/sd-resolve.c index e31b808c66..47986a4a63 100644 --- a/src/libsystemd/sd-resolve/sd-resolve.c +++ b/src/libsystemd/sd-resolve/sd-resolve.c @@ -20,6 +20,7 @@ #include "io-util.h" #include "list.h" #include "missing.h" +#include "resolve-private.h" #include "socket-util.h" #include "util.h" #include "process-util.h" @@ -912,26 +913,29 @@ static int alloc_query(sd_resolve *resolve, bool floating, sd_resolve_query **_q return 0; } -_public_ int sd_resolve_getaddrinfo( + +int resolve_getaddrinfo_with_destroy_callback( sd_resolve *resolve, - sd_resolve_query **_q, + sd_resolve_query **ret_query, const char *node, const char *service, const struct addrinfo *hints, - sd_resolve_getaddrinfo_handler_t callback, void *userdata) { + sd_resolve_getaddrinfo_handler_t callback, + sd_resolve_destroy_t destroy_callback, + void *userdata) { _cleanup_(sd_resolve_query_unrefp) sd_resolve_query *q = NULL; + size_t node_len, service_len; AddrInfoRequest req = {}; struct iovec iov[3]; struct msghdr mh = {}; int r; - size_t node_len, service_len; assert_return(resolve, -EINVAL); assert_return(node || service, -EINVAL); assert_return(callback, -EINVAL); assert_return(!resolve_pid_changed(resolve), -ECHILD); - r = alloc_query(resolve, !_q, &q); + r = alloc_query(resolve, !ret_query, &q); if (r < 0) return r; @@ -968,14 +972,27 @@ _public_ int sd_resolve_getaddrinfo( return -errno; resolve->n_outstanding++; + q->destroy_callback = destroy_callback; + + if (ret_query) + *ret_query = q; - if (_q) - *_q = q; TAKE_PTR(q); return 0; } +_public_ int sd_resolve_getaddrinfo( + sd_resolve *resolve, + sd_resolve_query **ret_query, + const char *node, const char *service, + const struct addrinfo *hints, + sd_resolve_getaddrinfo_handler_t callback, + void *userdata) { + + return resolve_getaddrinfo_with_destroy_callback(resolve, ret_query, node, service, hints, callback, NULL, userdata); +} + static int getaddrinfo_done(sd_resolve_query* q) { assert(q); assert(q->done); @@ -987,13 +1004,14 @@ static int getaddrinfo_done(sd_resolve_query* q) { return q->getaddrinfo_handler(q, q->ret, q->addrinfo, q->userdata); } -_public_ int sd_resolve_getnameinfo( +int resolve_getnameinfo_with_destroy_callback( sd_resolve *resolve, - sd_resolve_query**_q, + sd_resolve_query **ret_query, const struct sockaddr *sa, socklen_t salen, int flags, uint64_t get, sd_resolve_getnameinfo_handler_t callback, + sd_resolve_destroy_t destroy_callback, void *userdata) { _cleanup_(sd_resolve_query_unrefp) sd_resolve_query *q = NULL; @@ -1010,7 +1028,7 @@ _public_ int sd_resolve_getnameinfo( assert_return(callback, -EINVAL); assert_return(!resolve_pid_changed(resolve), -ECHILD); - r = alloc_query(resolve, !_q, &q); + r = alloc_query(resolve, !ret_query, &q); if (r < 0) return r; @@ -1040,15 +1058,29 @@ _public_ int sd_resolve_getnameinfo( if (sendmsg(resolve->fds[REQUEST_SEND_FD], &mh, MSG_NOSIGNAL) < 0) return -errno; - if (_q) - *_q = q; - resolve->n_outstanding++; + q->destroy_callback = destroy_callback; + + if (ret_query) + *ret_query = q; + TAKE_PTR(q); return 0; } +_public_ int sd_resolve_getnameinfo( + sd_resolve *resolve, + sd_resolve_query **ret_query, + const struct sockaddr *sa, socklen_t salen, + int flags, + uint64_t get, + sd_resolve_getnameinfo_handler_t callback, + void *userdata) { + + return resolve_getnameinfo_with_destroy_callback(resolve, ret_query, sa, salen, flags, get, callback, NULL, userdata); +} + static int getnameinfo_done(sd_resolve_query *q) { assert(q); diff --git a/src/network/netdev/wireguard.c b/src/network/netdev/wireguard.c index 7fefef3004..167cf65046 100644 --- a/src/network/netdev/wireguard.c +++ b/src/network/netdev/wireguard.c @@ -9,15 +9,16 @@ #include "sd-resolve.h" #include "alloc-util.h" -#include "parse-util.h" #include "fd-util.h" -#include "strv.h" #include "hexdecoct.h" -#include "string-util.h" -#include "wireguard.h" #include "networkd-link.h" -#include "networkd-util.h" #include "networkd-manager.h" +#include "networkd-util.h" +#include "parse-util.h" +#include "resolve-private.h" +#include "string-util.h" +#include "strv.h" +#include "wireguard.h" #include "wireguard-netlink.h" static void resolve_endpoints(NetDev *netdev); @@ -205,9 +206,7 @@ static WireguardEndpoint* wireguard_endpoint_free(WireguardEndpoint *e) { return mfree(e); } -static void wireguard_endpoint_destroy_callback(void *userdata) { - WireguardEndpoint *e = userdata; - +static void wireguard_endpoint_destroy_callback(WireguardEndpoint *e) { assert(e); assert(e->netdev); @@ -248,18 +247,16 @@ static int exponential_backoff_milliseconds(unsigned n_retries) { static int wireguard_resolve_handler(sd_resolve_query *q, int ret, const struct addrinfo *ai, - void *userdata) { + WireguardEndpoint *e) { _cleanup_(netdev_unrefp) NetDev *netdev_will_unrefed = NULL; - NetDev *netdev = NULL; - WireguardEndpoint *e; + NetDev *netdev; Wireguard *w; int r; - assert(userdata); - e = userdata; - netdev = e->netdev; + assert(e); + assert(e->netdev); - assert(netdev); + netdev = e->netdev; w = WIREGUARD(netdev); assert(w); @@ -328,15 +325,14 @@ static void resolve_endpoints(NetDev *netdev) { assert(w); LIST_FOREACH(endpoints, endpoint, w->unresolved_endpoints) { - _cleanup_(sd_resolve_query_unrefp) sd_resolve_query *q = NULL; - - r = sd_resolve_getaddrinfo(netdev->manager->resolve, - &q, - endpoint->host, - endpoint->port, - &hints, - wireguard_resolve_handler, - endpoint); + r = resolve_getaddrinfo(netdev->manager->resolve, + NULL, + endpoint->host, + endpoint->port, + &hints, + wireguard_resolve_handler, + wireguard_endpoint_destroy_callback, + endpoint); if (r == -ENOBUFS) break; @@ -345,14 +341,6 @@ static void resolve_endpoints(NetDev *netdev) { continue; } - r = sd_resolve_query_set_destroy_callback(q, wireguard_endpoint_destroy_callback); - if (r < 0) { - log_netdev_error_errno(netdev, r, "Failed to set destroy callback to resolving query: %m"); - continue; - } - - (void) sd_resolve_query_set_floating(q, true); - /* Avoid freeing netdev. It will be unrefed by the destroy callback. */ netdev_ref(netdev); diff --git a/src/socket-proxy/socket-proxyd.c b/src/socket-proxy/socket-proxyd.c index 47a2156aa2..f882a665a8 100644 --- a/src/socket-proxy/socket-proxyd.c +++ b/src/socket-proxy/socket-proxyd.c @@ -22,6 +22,7 @@ #include "parse-util.h" #include "path-util.h" #include "pretty-print.h" +#include "resolve-private.h" #include "set.h" #include "socket-util.h" #include "string-util.h" @@ -347,9 +348,7 @@ fail: return 0; /* ignore errors, continue serving */ } -static int resolve_cb(sd_resolve_query *q, int ret, const struct addrinfo *ai, void *userdata) { - Connection *c = userdata; - +static int resolve_handler(sd_resolve_query *q, int ret, const struct addrinfo *ai, Connection *c) { assert(q); assert(c); @@ -401,7 +400,7 @@ static int resolve_remote(Connection *c) { } log_debug("Looking up address info for %s:%s", node, service); - r = sd_resolve_getaddrinfo(c->context->resolve, &c->resolve_query, node, service, &hints, resolve_cb, c); + r = resolve_getaddrinfo(c->context->resolve, &c->resolve_query, node, service, &hints, resolve_handler, NULL, c); if (r < 0) { log_error_errno(r, "Failed to resolve remote host: %m"); goto fail; diff --git a/src/timesync/timesyncd-manager.c b/src/timesync/timesyncd-manager.c index 2bee31c603..4b0696f3a3 100644 --- a/src/timesync/timesyncd-manager.c +++ b/src/timesync/timesyncd-manager.c @@ -23,6 +23,7 @@ #include "missing.h" #include "network-util.h" #include "ratelimit.h" +#include "resolve-private.h" #include "socket-util.h" #include "string-util.h" #include "strv.h" @@ -724,8 +725,7 @@ void manager_set_server_address(Manager *m, ServerAddress *a) { } } -static int manager_resolve_handler(sd_resolve_query *q, int ret, const struct addrinfo *ai, void *userdata) { - Manager *m = userdata; +static int manager_resolve_handler(sd_resolve_query *q, int ret, const struct addrinfo *ai, Manager *m) { int r; assert(q); @@ -873,7 +873,7 @@ int manager_connect(Manager *m) { log_debug("Resolving %s...", m->current_server_name->string); - r = sd_resolve_getaddrinfo(m->resolve, &m->resolve_query, m->current_server_name->string, "123", &hints, manager_resolve_handler, m); + r = resolve_getaddrinfo(m->resolve, &m->resolve_query, m->current_server_name->string, "123", &hints, manager_resolve_handler, NULL, m); if (r < 0) return log_error_errno(r, "Failed to create resolver: %m");