]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd/sd-resolve/test-resolve.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
5 #include <netinet/in.h>
9 #include <sys/socket.h>
11 #include "sd-resolve.h"
13 #include "alloc-util.h"
15 #include "socket-util.h"
16 #include "string-util.h"
18 #define TEST_TIMEOUT_USEC (20*USEC_PER_SEC)
20 static int getaddrinfo_handler(sd_resolve_query
*q
, int ret
, const struct addrinfo
*ai
, void *userdata
) {
21 const struct addrinfo
*i
;
26 log_error("getaddrinfo error: %s %i", gai_strerror(ret
), ret
);
30 for (i
= ai
; i
; i
= i
->ai_next
) {
31 _cleanup_free_
char *addr
= NULL
;
33 assert_se(sockaddr_pretty(i
->ai_addr
, i
->ai_addrlen
, false, true, &addr
) == 0);
37 printf("canonical name: %s\n", strna(ai
->ai_canonname
));
42 static int getnameinfo_handler(sd_resolve_query
*q
, int ret
, const char *host
, const char *serv
, void *userdata
) {
46 log_error("getnameinfo error: %s %i", gai_strerror(ret
), ret
);
50 printf("Host: %s — Serv: %s\n", strna(host
), strna(serv
));
54 int main(int argc
, char *argv
[]) {
55 _cleanup_(sd_resolve_query_unrefp
) sd_resolve_query
*q1
= NULL
, *q2
= NULL
;
56 _cleanup_(sd_resolve_unrefp
) sd_resolve
*resolve
= NULL
;
59 struct addrinfo hints
= {
60 .ai_family
= PF_UNSPEC
,
61 .ai_socktype
= SOCK_STREAM
,
62 .ai_flags
= AI_CANONNAME
65 struct sockaddr_in sa
= {
66 .sin_family
= AF_INET
,
70 assert_se(sd_resolve_default(&resolve
) >= 0);
72 /* Test a floating resolver query */
73 r
= sd_resolve_getaddrinfo(resolve
, NULL
, "redhat.com", "http", NULL
, getaddrinfo_handler
, NULL
);
75 log_error_errno(r
, "sd_resolve_getaddrinfo(): %m");
77 /* Make a name -> address query */
78 r
= sd_resolve_getaddrinfo(resolve
, &q1
, argc
>= 2 ? argv
[1] : "www.heise.de", NULL
, &hints
, getaddrinfo_handler
, NULL
);
80 log_error_errno(r
, "sd_resolve_getaddrinfo(): %m");
82 /* Make an address -> name query */
83 sa
.sin_addr
.s_addr
= inet_addr(argc
>= 3 ? argv
[2] : "193.99.144.71");
84 r
= sd_resolve_getnameinfo(resolve
, &q2
, (struct sockaddr
*) &sa
, sizeof(sa
), 0, SD_RESOLVE_GET_BOTH
, getnameinfo_handler
, NULL
);
86 log_error_errno(r
, "sd_resolve_getnameinfo(): %m");
88 /* Wait until all queries are completed */
90 r
= sd_resolve_wait(resolve
, TEST_TIMEOUT_USEC
);
93 if (r
== -ETIMEDOUT
) {
94 /* Let's catch time-outs here, so that we can run safely in a CI that has no reliable DNS. Note
95 * that we invoke exit() directly here, as the stuck NSS call will not allow us to exit
98 log_notice_errno(r
, "sd_resolve_wait() timed out, but that's OK");
102 log_error_errno(r
, "sd_resolve_wait(): %m");
103 assert_not_reached("sd_resolve_wait() failed");