1 | /* Extended resolver state separate from struct __res_state. |
2 | Copyright (C) 2017-2020 Free Software Foundation, Inc. |
3 | This file is part of the GNU C Library. |
4 | |
5 | The GNU C Library is free software; you can redistribute it and/or |
6 | modify it under the terms of the GNU Lesser General Public |
7 | License as published by the Free Software Foundation; either |
8 | version 2.1 of the License, or (at your option) any later version. |
9 | |
10 | The GNU C Library is distributed in the hope that it will be useful, |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | Lesser General Public License for more details. |
14 | |
15 | You should have received a copy of the GNU Lesser General Public |
16 | License along with the GNU C Library; if not, see |
17 | <https://www.gnu.org/licenses/>. */ |
18 | |
19 | #ifndef RESOLV_STATE_H |
20 | #define RESOLV_STATE_H |
21 | |
22 | #include <netinet/in.h> |
23 | #include <stdbool.h> |
24 | #include <stddef.h> |
25 | |
26 | /* This type corresponds to members of the _res.sort_list array. */ |
27 | struct resolv_sortlist_entry |
28 | { |
29 | struct in_addr addr; |
30 | uint32_t mask; |
31 | }; |
32 | |
33 | /* Extended resolver state associated with res_state objects. Client |
34 | code can reach this state through a struct resolv_context |
35 | object. */ |
36 | struct resolv_conf |
37 | { |
38 | /* Reference counter. The object is deallocated once it reaches |
39 | zero. For internal use within resolv_conf only. */ |
40 | size_t __refcount; |
41 | |
42 | /* List of IPv4 and IPv6 name server addresses. */ |
43 | const struct sockaddr **nameserver_list; |
44 | size_t nameserver_list_size; |
45 | |
46 | /* The domain names forming the search list. */ |
47 | const char *const *search_list; |
48 | size_t search_list_size; |
49 | |
50 | /* IPv4 address preference rules. */ |
51 | const struct resolv_sortlist_entry *sort_list; |
52 | size_t sort_list_size; |
53 | |
54 | /* _res.options has type unsigned long, but we can only use 32 bits |
55 | for portability across all architectures. */ |
56 | unsigned int options; |
57 | unsigned int retrans; /* Timeout. */ |
58 | unsigned int retry; /* Number of times to retry. */ |
59 | unsigned int ndots; /* Dots needed for initial non-search query. */ |
60 | }; |
61 | |
62 | /* The functions below are for use by the res_init resolv.conf parser |
63 | and the struct resolv_context facility. */ |
64 | |
65 | struct __res_state; |
66 | struct file_change_detection; |
67 | |
68 | /* Read /etc/resolv.conf and return a configuration object, or NULL if |
69 | /etc/resolv.conf cannot be read due to memory allocation errors. |
70 | If PREINIT is not NULL, some configuration values are taken from |
71 | the struct __res_state object. If CHANGE is not null, file change |
72 | detection data is written to *CHANGE, based on the state of the |
73 | file after reading it. */ |
74 | struct resolv_conf *__resolv_conf_load (struct __res_state *preinit, |
75 | struct file_change_detection *change) |
76 | attribute_hidden __attribute__ ((warn_unused_result)); |
77 | |
78 | /* Return a configuration object for the current /etc/resolv.conf |
79 | settings, or NULL on failure. The object is cached. */ |
80 | struct resolv_conf *__resolv_conf_get_current (void) |
81 | attribute_hidden __attribute__ ((warn_unused_result)); |
82 | |
83 | /* Return the extended resolver state for *RESP, or NULL if it cannot |
84 | be determined. A call to this function must be paired with a call |
85 | to __resolv_conf_put. */ |
86 | struct resolv_conf *__resolv_conf_get (struct __res_state *) attribute_hidden; |
87 | |
88 | /* Converse of __resolv_conf_get. */ |
89 | void __resolv_conf_put (struct resolv_conf *) attribute_hidden; |
90 | |
91 | /* Allocate a new struct resolv_conf object and copy the |
92 | pre-configured values from *INIT. Return NULL on allocation |
93 | failure. The object must be deallocated using |
94 | __resolv_conf_put. */ |
95 | struct resolv_conf *__resolv_conf_allocate (const struct resolv_conf *init) |
96 | attribute_hidden __attribute__ ((nonnull (1), warn_unused_result)); |
97 | |
98 | /* Associate an existing extended resolver state with *RESP. Return |
99 | false on allocation failure. In addition, update *RESP with the |
100 | overlapping non-extended resolver state. */ |
101 | bool __resolv_conf_attach (struct __res_state *, struct resolv_conf *) |
102 | attribute_hidden; |
103 | |
104 | /* Detach the extended resolver state from *RESP. */ |
105 | void __resolv_conf_detach (struct __res_state *resp) attribute_hidden; |
106 | |
107 | #endif /* RESOLV_STATE_H */ |
108 | |