Skip to content

Commit ceb26cd

Browse files
committed
sd-resolve: add sd_resolve_get{addr,info}_with_destroy_callback() and typesafe macros
1 parent bd1c836 commit ceb26cd

File tree

4 files changed

+86
-13
lines changed

4 files changed

+86
-13
lines changed

meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1437,6 +1437,7 @@ includes = include_directories('src/basic',
14371437
'src/libsystemd/sd-id128',
14381438
'src/libsystemd/sd-netlink',
14391439
'src/libsystemd/sd-network',
1440+
'src/libsystemd/sd-resolve',
14401441
'src/libsystemd-network',
14411442
'.')
14421443

src/libsystemd/meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ libsystemd_sources = files('''
8888
sd-network/network-util.h
8989
sd-network/sd-network.c
9090
sd-path/sd-path.c
91+
sd-resolve/resolve-private.h
9192
sd-resolve/sd-resolve.c
9293
sd-utf8/sd-utf8.c
9394
'''.split()) + id128_sources + sd_daemon_c + sd_event_sources + sd_login_c
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/* SPDX-License-Identifier: LGPL-2.1+ */
2+
#pragma once
3+
4+
#include "sd-resolve.h"
5+
6+
int resolve_getaddrinfo_with_destroy_callback(
7+
sd_resolve *resolve, sd_resolve_query **q,
8+
const char *node, const char *service, const struct addrinfo *hints,
9+
sd_resolve_getaddrinfo_handler_t callback,
10+
sd_resolve_destroy_t destroy_callback, void *userdata);
11+
int resolve_getnameinfo_with_destroy_callback(
12+
sd_resolve *resolve, sd_resolve_query **q,
13+
const struct sockaddr *sa, socklen_t salen, int flags, uint64_t get,
14+
sd_resolve_getnameinfo_handler_t callback,
15+
sd_resolve_destroy_t destroy_callback, void *userdata);
16+
17+
#define resolve_getaddrinfo(resolve, ret_query, node, service, hints, callback, destroy_callback, userdata) \
18+
({ \
19+
int (*_callback_)(sd_resolve_query*, int, const struct addrinfo*, typeof(userdata)) = callback; \
20+
void (*_destroy_)(typeof(userdata)) = destroy_callback; \
21+
resolve_getaddrinfo_with_destroy_callback( \
22+
resolve, ret_query, \
23+
node, service, hints, \
24+
(sd_resolve_getaddrinfo_handler_t) _callback_, \
25+
(sd_resolve_destroy_t) _destroy_, \
26+
userdata); \
27+
})
28+
29+
#define resolve_getnameinfo(resolve, ret_query, sa, salen, flags, get, callback, destroy_callback, userdata) \
30+
({ \
31+
int (*_callback_)(sd_resolve_query*, int, const char*, const char*, typeof(userdata)) = callback; \
32+
void (*_destroy_)(typeof(userdata)) = destroy_callback; \
33+
resolve_getaddrinfo_with_destroy_callback( \
34+
resolve, ret_query, \
35+
sa, salen, flags, get, \
36+
(sd_resolve_getnameinfo_handler_t) _callback_, \
37+
(sd_resolve_destroy_t) _destroy_, \
38+
userdata); \
39+
})

src/libsystemd/sd-resolve/sd-resolve.c

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "io-util.h"
2121
#include "list.h"
2222
#include "missing.h"
23+
#include "resolve-private.h"
2324
#include "socket-util.h"
2425
#include "util.h"
2526
#include "process-util.h"
@@ -912,26 +913,29 @@ static int alloc_query(sd_resolve *resolve, bool floating, sd_resolve_query **_q
912913
return 0;
913914
}
914915

915-
_public_ int sd_resolve_getaddrinfo(
916+
917+
int resolve_getaddrinfo_with_destroy_callback(
916918
sd_resolve *resolve,
917-
sd_resolve_query **_q,
919+
sd_resolve_query **ret_query,
918920
const char *node, const char *service,
919921
const struct addrinfo *hints,
920-
sd_resolve_getaddrinfo_handler_t callback, void *userdata) {
922+
sd_resolve_getaddrinfo_handler_t callback,
923+
sd_resolve_destroy_t destroy_callback,
924+
void *userdata) {
921925

922926
_cleanup_(sd_resolve_query_unrefp) sd_resolve_query *q = NULL;
927+
size_t node_len, service_len;
923928
AddrInfoRequest req = {};
924929
struct iovec iov[3];
925930
struct msghdr mh = {};
926931
int r;
927-
size_t node_len, service_len;
928932

929933
assert_return(resolve, -EINVAL);
930934
assert_return(node || service, -EINVAL);
931935
assert_return(callback, -EINVAL);
932936
assert_return(!resolve_pid_changed(resolve), -ECHILD);
933937

934-
r = alloc_query(resolve, !_q, &q);
938+
r = alloc_query(resolve, !ret_query, &q);
935939
if (r < 0)
936940
return r;
937941

@@ -968,14 +972,27 @@ _public_ int sd_resolve_getaddrinfo(
968972
return -errno;
969973

970974
resolve->n_outstanding++;
975+
q->destroy_callback = destroy_callback;
976+
977+
if (ret_query)
978+
*ret_query = q;
971979

972-
if (_q)
973-
*_q = q;
974980
TAKE_PTR(q);
975981

976982
return 0;
977983
}
978984

985+
_public_ int sd_resolve_getaddrinfo(
986+
sd_resolve *resolve,
987+
sd_resolve_query **ret_query,
988+
const char *node, const char *service,
989+
const struct addrinfo *hints,
990+
sd_resolve_getaddrinfo_handler_t callback,
991+
void *userdata) {
992+
993+
return resolve_getaddrinfo_with_destroy_callback(resolve, ret_query, node, service, hints, callback, NULL, userdata);
994+
}
995+
979996
static int getaddrinfo_done(sd_resolve_query* q) {
980997
assert(q);
981998
assert(q->done);
@@ -987,13 +1004,14 @@ static int getaddrinfo_done(sd_resolve_query* q) {
9871004
return q->getaddrinfo_handler(q, q->ret, q->addrinfo, q->userdata);
9881005
}
9891006

990-
_public_ int sd_resolve_getnameinfo(
1007+
int resolve_getnameinfo_with_destroy_callback(
9911008
sd_resolve *resolve,
992-
sd_resolve_query**_q,
1009+
sd_resolve_query **ret_query,
9931010
const struct sockaddr *sa, socklen_t salen,
9941011
int flags,
9951012
uint64_t get,
9961013
sd_resolve_getnameinfo_handler_t callback,
1014+
sd_resolve_destroy_t destroy_callback,
9971015
void *userdata) {
9981016

9991017
_cleanup_(sd_resolve_query_unrefp) sd_resolve_query *q = NULL;
@@ -1010,7 +1028,7 @@ _public_ int sd_resolve_getnameinfo(
10101028
assert_return(callback, -EINVAL);
10111029
assert_return(!resolve_pid_changed(resolve), -ECHILD);
10121030

1013-
r = alloc_query(resolve, !_q, &q);
1031+
r = alloc_query(resolve, !ret_query, &q);
10141032
if (r < 0)
10151033
return r;
10161034

@@ -1040,15 +1058,29 @@ _public_ int sd_resolve_getnameinfo(
10401058
if (sendmsg(resolve->fds[REQUEST_SEND_FD], &mh, MSG_NOSIGNAL) < 0)
10411059
return -errno;
10421060

1043-
if (_q)
1044-
*_q = q;
1045-
10461061
resolve->n_outstanding++;
1062+
q->destroy_callback = destroy_callback;
1063+
1064+
if (ret_query)
1065+
*ret_query = q;
1066+
10471067
TAKE_PTR(q);
10481068

10491069
return 0;
10501070
}
10511071

1072+
_public_ int sd_resolve_getnameinfo(
1073+
sd_resolve *resolve,
1074+
sd_resolve_query **ret_query,
1075+
const struct sockaddr *sa, socklen_t salen,
1076+
int flags,
1077+
uint64_t get,
1078+
sd_resolve_getnameinfo_handler_t callback,
1079+
void *userdata) {
1080+
1081+
return resolve_getnameinfo_with_destroy_callback(resolve, ret_query, sa, salen, flags, get, callback, NULL, userdata);
1082+
}
1083+
10521084
static int getnameinfo_done(sd_resolve_query *q) {
10531085

10541086
assert(q);

0 commit comments

Comments
 (0)