1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 #include "alloc-util.h"
4 #include "dns-domain.h"
5 #include "resolved-dns-search-domain.h"
6 #include "resolved-link.h"
7 #include "resolved-manager.h"
9 int dns_search_domain_new(
11 DnsSearchDomain
**ret
,
12 DnsSearchDomainType type
,
16 _cleanup_free_
char *normalized
= NULL
;
21 assert((type
== DNS_SEARCH_DOMAIN_LINK
) == !!l
);
24 r
= dns_name_normalize(name
, 0, &normalized
);
29 if (l
->n_search_domains
>= LINK_SEARCH_DOMAINS_MAX
)
32 if (m
->n_search_domains
>= MANAGER_SEARCH_DOMAINS_MAX
)
36 d
= new0(DnsSearchDomain
, 1);
43 d
->name
= TAKE_PTR(normalized
);
47 case DNS_SEARCH_DOMAIN_LINK
:
49 LIST_APPEND(domains
, l
->search_domains
, d
);
50 l
->n_search_domains
++;
53 case DNS_SERVER_SYSTEM
:
54 LIST_APPEND(domains
, m
->search_domains
, d
);
55 m
->n_search_domains
++;
59 assert_not_reached("Unknown search domain type");
70 static DnsSearchDomain
* dns_search_domain_free(DnsSearchDomain
*d
) {
77 DEFINE_TRIVIAL_REF_UNREF_FUNC(DnsSearchDomain
, dns_search_domain
, dns_search_domain_free
);
79 void dns_search_domain_unlink(DnsSearchDomain
*d
) {
88 case DNS_SEARCH_DOMAIN_LINK
:
90 assert(d
->link
->n_search_domains
> 0);
91 LIST_REMOVE(domains
, d
->link
->search_domains
, d
);
92 d
->link
->n_search_domains
--;
95 case DNS_SEARCH_DOMAIN_SYSTEM
:
96 assert(d
->manager
->n_search_domains
> 0);
97 LIST_REMOVE(domains
, d
->manager
->search_domains
, d
);
98 d
->manager
->n_search_domains
--;
104 dns_search_domain_unref(d
);
107 void dns_search_domain_move_back_and_unmark(DnsSearchDomain
*d
) {
108 DnsSearchDomain
*tail
;
117 if (!d
->linked
|| !d
->domains_next
)
122 case DNS_SEARCH_DOMAIN_LINK
:
124 LIST_FIND_TAIL(domains
, d
, tail
);
125 LIST_REMOVE(domains
, d
->link
->search_domains
, d
);
126 LIST_INSERT_AFTER(domains
, d
->link
->search_domains
, tail
, d
);
129 case DNS_SEARCH_DOMAIN_SYSTEM
:
130 LIST_FIND_TAIL(domains
, d
, tail
);
131 LIST_REMOVE(domains
, d
->manager
->search_domains
, d
);
132 LIST_INSERT_AFTER(domains
, d
->manager
->search_domains
, tail
, d
);
136 assert_not_reached("Unknown search domain type");
140 void dns_search_domain_unlink_all(DnsSearchDomain
*first
) {
141 DnsSearchDomain
*next
;
146 next
= first
->domains_next
;
147 dns_search_domain_unlink(first
);
149 dns_search_domain_unlink_all(next
);
152 void dns_search_domain_unlink_marked(DnsSearchDomain
*first
) {
153 DnsSearchDomain
*next
;
158 next
= first
->domains_next
;
161 dns_search_domain_unlink(first
);
163 dns_search_domain_unlink_marked(next
);
166 void dns_search_domain_mark_all(DnsSearchDomain
*first
) {
170 first
->marked
= true;
171 dns_search_domain_mark_all(first
->domains_next
);
174 int dns_search_domain_find(DnsSearchDomain
*first
, const char *name
, DnsSearchDomain
**ret
) {
181 LIST_FOREACH(domains
, d
, first
) {
183 r
= dns_name_equal(name
, d
->name
);