1 /* Extended resolver state separate from struct __res_state.
2    Copyright (C) 2017-2022 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