]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd/sd-resolve/test-resolve.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 Copyright 2014 Daniel Buch
8 #include <netinet/in.h>
12 #include <sys/socket.h>
14 #include "sd-resolve.h"
16 #include "alloc-util.h"
18 #include "socket-util.h"
19 #include "string-util.h"
21 #define TEST_TIMEOUT_USEC (20*USEC_PER_SEC)
23 static int getaddrinfo_handler(sd_resolve_query
*q
, int ret
, const struct addrinfo
*ai
, void *userdata
) {
24 const struct addrinfo
*i
;
29 log_error("getaddrinfo error: %s %i", gai_strerror(ret
), ret
);
33 for (i
= ai
; i
; i
= i
->ai_next
) {
34 _cleanup_free_
char *addr
= NULL
;
36 assert_se(sockaddr_pretty(i
->ai_addr
, i
->ai_addrlen
, false, true, &addr
) == 0);
40 printf("canonical name: %s\n", strna(ai
->ai_canonname
));
45 static int getnameinfo_handler(sd_resolve_query
*q
, int ret
, const char *host
, const char *serv
, void *userdata
) {
49 log_error("getnameinfo error: %s %i", gai_strerror(ret
), ret
);
53 printf("Host: %s — Serv: %s\n", strna(host
), strna(serv
));
57 int main(int argc
, char *argv
[]) {
58 _cleanup_(sd_resolve_query_unrefp
) sd_resolve_query
*q1
= NULL
, *q2
= NULL
;
59 _cleanup_(sd_resolve_unrefp
) sd_resolve
*resolve
= NULL
;
62 struct addrinfo hints
= {
63 .ai_family
= PF_UNSPEC
,
64 .ai_socktype
= SOCK_STREAM
,
65 .ai_flags
= AI_CANONNAME
68 struct sockaddr_in sa
= {
69 .sin_family
= AF_INET
,
73 assert_se(sd_resolve_default(&resolve
) >= 0);
75 /* Test a floating resolver query */
76 r
= sd_resolve_getaddrinfo(resolve
, NULL
, "redhat.com", "http", NULL
, getaddrinfo_handler
, NULL
);
78 log_error_errno(r
, "sd_resolve_getaddrinfo(): %m");
80 /* Make a name -> address query */
81 r
= sd_resolve_getaddrinfo(resolve
, &q1
, argc
>= 2 ? argv
[1] : "www.heise.de", NULL
, &hints
, getaddrinfo_handler
, NULL
);
83 log_error_errno(r
, "sd_resolve_getaddrinfo(): %m");
85 /* Make an address -> name query */
86 sa
.sin_addr
.s_addr
= inet_addr(argc
>= 3 ? argv
[2] : "193.99.144.71");
87 r
= sd_resolve_getnameinfo(resolve
, &q2
, (struct sockaddr
*) &sa
, sizeof(sa
), 0, SD_RESOLVE_GET_BOTH
, getnameinfo_handler
, NULL
);
89 log_error_errno(r
, "sd_resolve_getnameinfo(): %m");
91 /* Wait until all queries are completed */
93 r
= sd_resolve_wait(resolve
, TEST_TIMEOUT_USEC
);
96 if (r
== -ETIMEDOUT
) {
97 /* Let's catch time-outs here, so that we can run safely in a CI that has no reliable DNS. Note
98 * that we invoke exit() directly here, as the stuck NSS call will not allow us to exit
101 log_notice_errno(r
, "sd_resolve_wait() timed out, but that's OK");
105 log_error_errno(r
, "sd_resolve_wait(): %m");
106 assert_not_reached("sd_resolve_wait() failed");