Merge pull request #11167 from yuwata/sd-resolve-typesafe
sd-resolve: introduce typesafe macros
This commit is contained in:
commit
500c65ad69
|
@ -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',
|
||||
'.')
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
39
src/libsystemd/sd-resolve/resolve-private.h
Normal file
39
src/libsystemd/sd-resolve/resolve-private.h
Normal file
|
@ -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); \
|
||||
})
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
Loading…
Reference in a new issue