1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 #include "alloc-util.h"
4 #include "dns-domain.h"
5 #include "resolved-dns-search-domain.h"
7 int dns_search_domain_new(
10 DnsSearchDomainType type
,
14 _cleanup_free_
char *normalized
= NULL
;
19 assert((type
== DNS_SEARCH_DOMAIN_LINK
) == !!l
);
22 r
= dns_name_normalize(name
, &normalized
);
27 if (l
->n_search_domains
>= LINK_SEARCH_DOMAINS_MAX
)
30 if (m
->n_search_domains
>= MANAGER_SEARCH_DOMAINS_MAX
)
34 d
= new0(DnsSearchDomain
, 1);
41 d
->name
= TAKE_PTR(normalized
);
45 case DNS_SEARCH_DOMAIN_LINK
:
47 LIST_APPEND(domains
, l
->search_domains
, d
);
48 l
->n_search_domains
++;
51 case DNS_SERVER_SYSTEM
:
52 LIST_APPEND(domains
, m
->search_domains
, d
);
53 m
->n_search_domains
++;
57 assert_not_reached("Unknown search domain type");
68 static DnsSearchDomain
* dns_search_domain_free(DnsSearchDomain
*d
) {
75 DEFINE_TRIVIAL_REF_UNREF_FUNC(DnsSearchDomain
, dns_search_domain
, dns_search_domain_free
);
77 void dns_search_domain_unlink(DnsSearchDomain
*d
) {
86 case DNS_SEARCH_DOMAIN_LINK
:
88 assert(d
->link
->n_search_domains
> 0);
89 LIST_REMOVE(domains
, d
->link
->search_domains
, d
);
90 d
->link
->n_search_domains
--;
93 case DNS_SEARCH_DOMAIN_SYSTEM
:
94 assert(d
->manager
->n_search_domains
> 0);
95 LIST_REMOVE(domains
, d
->manager
->search_domains
, d
);
96 d
->manager
->n_search_domains
--;
102 dns_search_domain_unref(d
);
105 void dns_search_domain_move_back_and_unmark(DnsSearchDomain
*d
) {
106 DnsSearchDomain
*tail
;
115 if (!d
->linked
|| !d
->domains_next
)
120 case DNS_SEARCH_DOMAIN_LINK
:
122 LIST_FIND_TAIL(domains
, d
, tail
);
123 LIST_REMOVE(domains
, d
->link
->search_domains
, d
);
124 LIST_INSERT_AFTER(domains
, d
->link
->search_domains
, tail
, d
);
127 case DNS_SEARCH_DOMAIN_SYSTEM
:
128 LIST_FIND_TAIL(domains
, d
, tail
);
129 LIST_REMOVE(domains
, d
->manager
->search_domains
, d
);
130 LIST_INSERT_AFTER(domains
, d
->manager
->search_domains
, tail
, d
);
134 assert_not_reached("Unknown search domain type");
138 void dns_search_domain_unlink_all(DnsSearchDomain
*first
) {
139 DnsSearchDomain
*next
;
144 next
= first
->domains_next
;
145 dns_search_domain_unlink(first
);
147 dns_search_domain_unlink_all(next
);
150 void dns_search_domain_unlink_marked(DnsSearchDomain
*first
) {
151 DnsSearchDomain
*next
;
156 next
= first
->domains_next
;
159 dns_search_domain_unlink(first
);
161 dns_search_domain_unlink_marked(next
);
164 void dns_search_domain_mark_all(DnsSearchDomain
*first
) {
168 first
->marked
= true;
169 dns_search_domain_mark_all(first
->domains_next
);
172 int dns_search_domain_find(DnsSearchDomain
*first
, const char *name
, DnsSearchDomain
**ret
) {
179 LIST_FOREACH(domains
, d
, first
) {
181 r
= dns_name_equal(name
, d
->name
);