Branch data Line data Source code
1 : : /* SPDX-License-Identifier: LGPL-2.1+ */
2 : :
3 : : #include "alloc-util.h"
4 : : #include "dns-domain.h"
5 : : #include "resolved-dns-search-domain.h"
6 : :
7 : 0 : int dns_search_domain_new(
8 : : Manager *m,
9 : : DnsSearchDomain **ret,
10 : : DnsSearchDomainType type,
11 : : Link *l,
12 : : const char *name) {
13 : :
14 : 0 : _cleanup_free_ char *normalized = NULL;
15 : : DnsSearchDomain *d;
16 : : int r;
17 : :
18 [ # # ]: 0 : assert(m);
19 [ # # ]: 0 : assert((type == DNS_SEARCH_DOMAIN_LINK) == !!l);
20 [ # # ]: 0 : assert(name);
21 : :
22 : 0 : r = dns_name_normalize(name, 0, &normalized);
23 [ # # ]: 0 : if (r < 0)
24 : 0 : return r;
25 : :
26 [ # # ]: 0 : if (l) {
27 [ # # ]: 0 : if (l->n_search_domains >= LINK_SEARCH_DOMAINS_MAX)
28 : 0 : return -E2BIG;
29 : : } else {
30 [ # # ]: 0 : if (m->n_search_domains >= MANAGER_SEARCH_DOMAINS_MAX)
31 : 0 : return -E2BIG;
32 : : }
33 : :
34 : 0 : d = new0(DnsSearchDomain, 1);
35 [ # # ]: 0 : if (!d)
36 : 0 : return -ENOMEM;
37 : :
38 : 0 : d->n_ref = 1;
39 : 0 : d->manager = m;
40 : 0 : d->type = type;
41 : 0 : d->name = TAKE_PTR(normalized);
42 : :
43 [ # # # ]: 0 : switch (type) {
44 : :
45 : 0 : case DNS_SEARCH_DOMAIN_LINK:
46 : 0 : d->link = l;
47 [ # # # # : 0 : LIST_APPEND(domains, l->search_domains, d);
# # # # #
# # # ]
48 : 0 : l->n_search_domains++;
49 : 0 : break;
50 : :
51 : 0 : case DNS_SERVER_SYSTEM:
52 [ # # # # : 0 : LIST_APPEND(domains, m->search_domains, d);
# # # # #
# # # ]
53 : 0 : m->n_search_domains++;
54 : 0 : break;
55 : :
56 : 0 : default:
57 : 0 : assert_not_reached("Unknown search domain type");
58 : : }
59 : :
60 : 0 : d->linked = true;
61 : :
62 [ # # ]: 0 : if (ret)
63 : 0 : *ret = d;
64 : :
65 : 0 : return 0;
66 : : }
67 : :
68 : 0 : static DnsSearchDomain* dns_search_domain_free(DnsSearchDomain *d) {
69 [ # # ]: 0 : assert(d);
70 : :
71 : 0 : free(d->name);
72 : 0 : return mfree(d);
73 : : }
74 : :
75 [ # # # # : 0 : DEFINE_TRIVIAL_REF_UNREF_FUNC(DnsSearchDomain, dns_search_domain, dns_search_domain_free);
# # ]
76 : :
77 : 0 : void dns_search_domain_unlink(DnsSearchDomain *d) {
78 [ # # ]: 0 : assert(d);
79 [ # # ]: 0 : assert(d->manager);
80 : :
81 [ # # ]: 0 : if (!d->linked)
82 : 0 : return;
83 : :
84 [ # # # ]: 0 : switch (d->type) {
85 : :
86 : 0 : case DNS_SEARCH_DOMAIN_LINK:
87 [ # # ]: 0 : assert(d->link);
88 [ # # ]: 0 : assert(d->link->n_search_domains > 0);
89 [ # # # # : 0 : LIST_REMOVE(domains, d->link->search_domains, d);
# # # # ]
90 : 0 : d->link->n_search_domains--;
91 : 0 : break;
92 : :
93 : 0 : case DNS_SEARCH_DOMAIN_SYSTEM:
94 [ # # ]: 0 : assert(d->manager->n_search_domains > 0);
95 [ # # # # : 0 : LIST_REMOVE(domains, d->manager->search_domains, d);
# # # # ]
96 : 0 : d->manager->n_search_domains--;
97 : 0 : break;
98 : : }
99 : :
100 : 0 : d->linked = false;
101 : :
102 : 0 : dns_search_domain_unref(d);
103 : : }
104 : :
105 : 0 : void dns_search_domain_move_back_and_unmark(DnsSearchDomain *d) {
106 : : DnsSearchDomain *tail;
107 : :
108 [ # # ]: 0 : assert(d);
109 : :
110 [ # # ]: 0 : if (!d->marked)
111 : 0 : return;
112 : :
113 : 0 : d->marked = false;
114 : :
115 [ # # # # ]: 0 : if (!d->linked || !d->domains_next)
116 : 0 : return;
117 : :
118 [ # # # ]: 0 : switch (d->type) {
119 : :
120 : 0 : case DNS_SEARCH_DOMAIN_LINK:
121 [ # # ]: 0 : assert(d->link);
122 [ # # # # ]: 0 : LIST_FIND_TAIL(domains, d, tail);
123 [ # # # # : 0 : LIST_REMOVE(domains, d->link->search_domains, d);
# # # # ]
124 [ # # # # : 0 : LIST_INSERT_AFTER(domains, d->link->search_domains, tail, d);
# # # # ]
125 : 0 : break;
126 : :
127 : 0 : case DNS_SEARCH_DOMAIN_SYSTEM:
128 [ # # # # ]: 0 : LIST_FIND_TAIL(domains, d, tail);
129 [ # # # # : 0 : LIST_REMOVE(domains, d->manager->search_domains, d);
# # # # ]
130 [ # # # # : 0 : LIST_INSERT_AFTER(domains, d->manager->search_domains, tail, d);
# # # # ]
131 : 0 : break;
132 : :
133 : 0 : default:
134 : 0 : assert_not_reached("Unknown search domain type");
135 : : }
136 : : }
137 : :
138 : 0 : void dns_search_domain_unlink_all(DnsSearchDomain *first) {
139 : : DnsSearchDomain *next;
140 : :
141 [ # # ]: 0 : if (!first)
142 : 0 : return;
143 : :
144 : 0 : next = first->domains_next;
145 : 0 : dns_search_domain_unlink(first);
146 : :
147 : 0 : dns_search_domain_unlink_all(next);
148 : : }
149 : :
150 : 0 : void dns_search_domain_unlink_marked(DnsSearchDomain *first) {
151 : : DnsSearchDomain *next;
152 : :
153 [ # # ]: 0 : if (!first)
154 : 0 : return;
155 : :
156 : 0 : next = first->domains_next;
157 : :
158 [ # # ]: 0 : if (first->marked)
159 : 0 : dns_search_domain_unlink(first);
160 : :
161 : 0 : dns_search_domain_unlink_marked(next);
162 : : }
163 : :
164 : 0 : void dns_search_domain_mark_all(DnsSearchDomain *first) {
165 [ # # ]: 0 : if (!first)
166 : 0 : return;
167 : :
168 : 0 : first->marked = true;
169 : 0 : dns_search_domain_mark_all(first->domains_next);
170 : : }
171 : :
172 : 0 : int dns_search_domain_find(DnsSearchDomain *first, const char *name, DnsSearchDomain **ret) {
173 : : DnsSearchDomain *d;
174 : : int r;
175 : :
176 [ # # ]: 0 : assert(name);
177 [ # # ]: 0 : assert(ret);
178 : :
179 [ # # ]: 0 : LIST_FOREACH(domains, d, first) {
180 : :
181 : 0 : r = dns_name_equal(name, d->name);
182 [ # # ]: 0 : if (r < 0)
183 : 0 : return r;
184 [ # # ]: 0 : if (r > 0) {
185 : 0 : *ret = d;
186 : 0 : return 1;
187 : : }
188 : : }
189 : :
190 : 0 : *ret = NULL;
191 : 0 : return 0;
192 : : }
|