1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2 #ifndef foosdresolvehfoo
3 #define foosdresolvehfoo
4 
5 /***
6   systemd is free software; you can redistribute it and/or modify it
7   under the terms of the GNU Lesser General Public License as published by
8   the Free Software Foundation; either version 2.1 of the License, or
9   (at your option) any later version.
10 
11   systemd is distributed in the hope that it will be useful, but
12   WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14   Lesser General Public License for more details.
15 
16   You should have received a copy of the GNU Lesser General Public License
17   along with systemd; If not, see <http://www.gnu.org/licenses/>.
18 ***/
19 
20 /* 'struct addrinfo' needs _GNU_SOURCE */
21 #ifndef _GNU_SOURCE
22 #define _GNU_SOURCE 1
23 #endif
24 
25 #include <inttypes.h>
26 #include <netdb.h>
27 #include <sys/socket.h>
28 #include <sys/types.h>
29 
30 #include "sd-event.h"
31 
32 #include "_sd-common.h"
33 
34 _SD_BEGIN_DECLARATIONS;
35 
36 /* An opaque sd-resolve session structure */
37 typedef struct sd_resolve sd_resolve;
38 
39 /* An opaque sd-resolve query structure */
40 typedef struct sd_resolve_query sd_resolve_query;
41 
42 /* A callback on completion */
43 typedef int (*sd_resolve_getaddrinfo_handler_t)(sd_resolve_query *q, int ret, const struct addrinfo *ai, void *userdata);
44 typedef int (*sd_resolve_getnameinfo_handler_t)(sd_resolve_query *q, int ret, const char *host, const char *serv, void *userdata);
45 typedef _sd_destroy_t sd_resolve_destroy_t;
46 
47 enum {
48         SD_RESOLVE_GET_HOST    = 1 << 0,
49         SD_RESOLVE_GET_SERVICE = 1 << 1,
50         SD_RESOLVE_GET_BOTH = SD_RESOLVE_GET_HOST | SD_RESOLVE_GET_SERVICE,
51 };
52 
53 int sd_resolve_default(sd_resolve **ret);
54 
55 /* Allocate a new sd-resolve session. */
56 int sd_resolve_new(sd_resolve **ret);
57 
58 /* Free a sd-resolve session. This destroys all attached
59  * sd_resolve_query objects automatically. */
60 sd_resolve* sd_resolve_unref(sd_resolve *resolve);
61 sd_resolve* sd_resolve_ref(sd_resolve *resolve);
62 
63 /* Return the UNIX file descriptor to poll() for events on. Use this
64  * function to integrate sd-resolve with your custom main loop. */
65 int sd_resolve_get_fd(sd_resolve *resolve);
66 
67 /* Return the poll() events (a combination of flags like POLLIN,
68  * POLLOUT, ...) to check for. */
69 int sd_resolve_get_events(sd_resolve *resolve);
70 
71 /* Return the poll() timeout to pass. Returns UINT64_MAX as
72  * timeout if no timeout is needed. */
73 int sd_resolve_get_timeout(sd_resolve *resolve, uint64_t *timeout_usec);
74 
75 /* Process pending responses. After this function is called, you can
76  * get the next completed query object(s) using
77  * sd_resolve_get_next(). */
78 int sd_resolve_process(sd_resolve *resolve);
79 
80 /* Wait for a resolve event to complete. */
81 int sd_resolve_wait(sd_resolve *resolve, uint64_t timeout_usec);
82 
83 int sd_resolve_get_tid(sd_resolve *resolve, pid_t *tid);
84 
85 int sd_resolve_attach_event(sd_resolve *resolve, sd_event *e, int64_t priority);
86 int sd_resolve_detach_event(sd_resolve *resolve);
87 sd_event *sd_resolve_get_event(sd_resolve *resolve);
88 
89 /* Issue a name-to-address query on the specified session. The
90  * arguments are compatible with those of libc's
91  * getaddrinfo(3). The function returns a new query object. When the
92  * query is completed, you may retrieve the results using
93  * sd_resolve_getaddrinfo_done(). */
94 int sd_resolve_getaddrinfo(sd_resolve *resolve, sd_resolve_query **q, const char *node, const char *service, const struct addrinfo *hints, sd_resolve_getaddrinfo_handler_t callback, void *userdata);
95 
96 /* Issue an address-to-name query on the specified session. The
97  * arguments are compatible with those of libc's
98  * getnameinfo(3). The function returns a new query object. When the
99  * query is completed, you may retrieve the results using
100  * sd_resolve_getnameinfo_done(). Set gethost (resp. getserv) to non-zero
101  * if you want to query the hostname (resp. the service name). */
102 int sd_resolve_getnameinfo(sd_resolve *resolve, sd_resolve_query **q, const struct sockaddr *sa, socklen_t salen, int flags, uint64_t get, sd_resolve_getnameinfo_handler_t callback, void *userdata);
103 
104 sd_resolve_query *sd_resolve_query_ref(sd_resolve_query *q);
105 sd_resolve_query *sd_resolve_query_unref(sd_resolve_query *q);
106 
107 /* Returns non-zero when the query operation specified by q has been completed. */
108 int sd_resolve_query_is_done(sd_resolve_query *q);
109 
110 void *sd_resolve_query_get_userdata(sd_resolve_query *q);
111 void *sd_resolve_query_set_userdata(sd_resolve_query *q, void *userdata);
112 int sd_resolve_query_get_destroy_callback(sd_resolve_query *q, sd_resolve_destroy_t *destroy_callback);
113 int sd_resolve_query_set_destroy_callback(sd_resolve_query *q, sd_resolve_destroy_t destroy_callback);
114 int sd_resolve_query_get_floating(sd_resolve_query *q);
115 int sd_resolve_query_set_floating(sd_resolve_query *q, int b);
116 
117 sd_resolve *sd_resolve_query_get_resolve(sd_resolve_query *q);
118 
119 _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_resolve, sd_resolve_unref);
120 _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_resolve_query, sd_resolve_query_unref);
121 
122 _SD_END_DECLARATIONS;
123 
124 #endif
125