]>
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 "sd-resolve.h"
11 #include "alloc-util.h"
13 #include "socket-util.h"
14 #include "string-util.h"
15 #include "time-util.h"
17 #define TEST_TIMEOUT_USEC (20*USEC_PER_SEC)
19 static int getaddrinfo_handler(sd_resolve_query
*q
, int ret
, const struct addrinfo
*ai
, void *userdata
) {
20 const struct addrinfo
*i
;
25 log_error("getaddrinfo error: %s %i", gai_strerror(ret
), ret
);
29 for (i
= ai
; i
; i
= i
->ai_next
) {
30 _cleanup_free_
char *addr
= NULL
;
32 assert_se(sockaddr_pretty(i
->ai_addr
, i
->ai_addrlen
, false, true, &addr
) == 0);
36 printf("canonical name: %s\n", strna(ai
->ai_canonname
));
41 static int getnameinfo_handler(sd_resolve_query
*q
, int ret
, const char *host
, const char *serv
, void *userdata
) {
45 log_error("getnameinfo error: %s %i", gai_strerror(ret
), ret
);
49 printf("Host: %s — Serv: %s\n", strna(host
), strna(serv
));
53 int main(int argc
, char *argv
[]) {
54 _cleanup_(sd_resolve_query_unrefp
) sd_resolve_query
*q1
= NULL
, *q2
= NULL
;
55 _cleanup_(sd_resolve_unrefp
) sd_resolve
*resolve
= NULL
;
58 struct addrinfo hints
= {
59 .ai_family
= PF_UNSPEC
,
60 .ai_socktype
= SOCK_STREAM
,
61 .ai_flags
= AI_CANONNAME
64 struct sockaddr_in sa
= {
65 .sin_family
= AF_INET
,
69 assert_se(sd_resolve_default(&resolve
) >= 0);
71 /* Test a floating resolver query */
72 r
= sd_resolve_getaddrinfo(resolve
, NULL
, "redhat.com", "http", NULL
, getaddrinfo_handler
, NULL
);
74 log_error_errno(r
, "sd_resolve_getaddrinfo(): %m");
76 /* Make a name -> address query */
77 r
= sd_resolve_getaddrinfo(resolve
, &q1
, argc
>= 2 ? argv
[1] : "www.heise.de", NULL
, &hints
, getaddrinfo_handler
, NULL
);
79 log_error_errno(r
, "sd_resolve_getaddrinfo(): %m");
81 /* Make an address -> name query */
82 sa
.sin_addr
.s_addr
= inet_addr(argc
>= 3 ? argv
[2] : "193.99.144.71");
83 r
= sd_resolve_getnameinfo(resolve
, &q2
, (struct sockaddr
*) &sa
, sizeof(sa
), 0, SD_RESOLVE_GET_BOTH
, getnameinfo_handler
, NULL
);
85 log_error_errno(r
, "sd_resolve_getnameinfo(): %m");
87 /* Wait until all queries are completed */
89 r
= sd_resolve_wait(resolve
, TEST_TIMEOUT_USEC
);
92 if (r
== -ETIMEDOUT
) {
93 /* Let's catch timeouts here, so that we can run safely in a CI that has no reliable DNS. Note
94 * that we invoke exit() directly here, as the stuck NSS call will not allow us to exit
97 log_notice_errno(r
, "sd_resolve_wait() timed out, but that's OK");
101 log_error_errno(r
, "sd_resolve_wait(): %m");
102 assert_not_reached("sd_resolve_wait() failed");