]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd/sd-resolve/test-resolve.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2005-2008 Lennart Poettering
6 Copyright 2014 Daniel Buch
11 #include <netinet/in.h>
15 #include <sys/socket.h>
17 #include "sd-resolve.h"
19 #include "alloc-util.h"
21 #include "socket-util.h"
22 #include "string-util.h"
24 #define TEST_TIMEOUT_USEC (20*USEC_PER_SEC)
26 static int getaddrinfo_handler(sd_resolve_query
*q
, int ret
, const struct addrinfo
*ai
, void *userdata
) {
27 const struct addrinfo
*i
;
32 log_error("getaddrinfo error: %s %i", gai_strerror(ret
), ret
);
36 for (i
= ai
; i
; i
= i
->ai_next
) {
37 _cleanup_free_
char *addr
= NULL
;
39 assert_se(sockaddr_pretty(i
->ai_addr
, i
->ai_addrlen
, false, true, &addr
) == 0);
43 printf("canonical name: %s\n", strna(ai
->ai_canonname
));
48 static int getnameinfo_handler(sd_resolve_query
*q
, int ret
, const char *host
, const char *serv
, void *userdata
) {
52 log_error("getnameinfo error: %s %i", gai_strerror(ret
), ret
);
56 printf("Host: %s — Serv: %s\n", strna(host
), strna(serv
));
60 int main(int argc
, char *argv
[]) {
61 _cleanup_(sd_resolve_query_unrefp
) sd_resolve_query
*q1
= NULL
, *q2
= NULL
;
62 _cleanup_(sd_resolve_unrefp
) sd_resolve
*resolve
= NULL
;
65 struct addrinfo hints
= {
66 .ai_family
= PF_UNSPEC
,
67 .ai_socktype
= SOCK_STREAM
,
68 .ai_flags
= AI_CANONNAME
71 struct sockaddr_in sa
= {
72 .sin_family
= AF_INET
,
76 assert_se(sd_resolve_default(&resolve
) >= 0);
78 /* Test a floating resolver query */
79 r
= sd_resolve_getaddrinfo(resolve
, NULL
, "redhat.com", "http", NULL
, getaddrinfo_handler
, NULL
);
81 log_error_errno(r
, "sd_resolve_getaddrinfo(): %m");
83 /* Make a name -> address query */
84 r
= sd_resolve_getaddrinfo(resolve
, &q1
, argc
>= 2 ? argv
[1] : "www.heise.de", NULL
, &hints
, getaddrinfo_handler
, NULL
);
86 log_error_errno(r
, "sd_resolve_getaddrinfo(): %m");
88 /* Make an address -> name query */
89 sa
.sin_addr
.s_addr
= inet_addr(argc
>= 3 ? argv
[2] : "193.99.144.71");
90 r
= sd_resolve_getnameinfo(resolve
, &q2
, (struct sockaddr
*) &sa
, sizeof(sa
), 0, SD_RESOLVE_GET_BOTH
, getnameinfo_handler
, NULL
);
92 log_error_errno(r
, "sd_resolve_getnameinfo(): %m");
94 /* Wait until all queries are completed */
96 r
= sd_resolve_wait(resolve
, TEST_TIMEOUT_USEC
);
99 if (r
== -ETIMEDOUT
) {
100 /* Let's catch time-outs here, so that we can run safely in a CI that has no reliable DNS. Note
101 * that we invoke exit() directly here, as the stuck NSS call will not allow us to exit
104 log_notice_errno(r
, "sd_resolve_wait() timed out, but that's OK");
109 log_error_errno(r
, "sd_resolve_wait(): %m");
110 assert_not_reached("sd_resolve_wait() failed");