1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
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
= new(DnsSearchDomain
, 1);
40 *d
= (DnsSearchDomain
) {
44 .name
= TAKE_PTR(normalized
),
49 case DNS_SEARCH_DOMAIN_LINK
:
51 LIST_APPEND(domains
, l
->search_domains
, d
);
52 l
->n_search_domains
++;
55 case DNS_SEARCH_DOMAIN_SYSTEM
:
56 LIST_APPEND(domains
, m
->search_domains
, d
);
57 m
->n_search_domains
++;
72 static DnsSearchDomain
* dns_search_domain_free(DnsSearchDomain
*d
) {
79 DEFINE_TRIVIAL_REF_UNREF_FUNC(DnsSearchDomain
, dns_search_domain
, dns_search_domain_free
);
81 void dns_search_domain_unlink(DnsSearchDomain
*d
) {
90 case DNS_SEARCH_DOMAIN_LINK
:
92 assert(d
->link
->n_search_domains
> 0);
93 LIST_REMOVE(domains
, d
->link
->search_domains
, d
);
94 d
->link
->n_search_domains
--;
97 case DNS_SEARCH_DOMAIN_SYSTEM
:
98 assert(d
->manager
->n_search_domains
> 0);
99 LIST_REMOVE(domains
, d
->manager
->search_domains
, d
);
100 d
->manager
->n_search_domains
--;
106 dns_search_domain_unref(d
);
109 void dns_search_domain_move_back_and_unmark(DnsSearchDomain
*d
) {
110 DnsSearchDomain
*tail
;
119 if (!d
->linked
|| !d
->domains_next
)
124 case DNS_SEARCH_DOMAIN_LINK
:
126 tail
= LIST_FIND_TAIL(domains
, d
);
127 LIST_REMOVE(domains
, d
->link
->search_domains
, d
);
128 LIST_INSERT_AFTER(domains
, d
->link
->search_domains
, tail
, d
);
131 case DNS_SEARCH_DOMAIN_SYSTEM
:
132 tail
= LIST_FIND_TAIL(domains
, d
);
133 LIST_REMOVE(domains
, d
->manager
->search_domains
, d
);
134 LIST_INSERT_AFTER(domains
, d
->manager
->search_domains
, tail
, d
);
138 assert_not_reached();
142 void dns_search_domain_unlink_all(DnsSearchDomain
*first
) {
143 DnsSearchDomain
*next
;
148 next
= first
->domains_next
;
149 dns_search_domain_unlink(first
);
151 dns_search_domain_unlink_all(next
);
154 bool dns_search_domain_unlink_marked(DnsSearchDomain
*first
) {
155 DnsSearchDomain
*next
;
161 next
= first
->domains_next
;
164 dns_search_domain_unlink(first
);
169 return dns_search_domain_unlink_marked(next
) || changed
;
172 void dns_search_domain_mark_all(DnsSearchDomain
*first
) {
176 first
->marked
= true;
177 dns_search_domain_mark_all(first
->domains_next
);
180 int dns_search_domain_find(DnsSearchDomain
*first
, const char *name
, DnsSearchDomain
**ret
) {
186 LIST_FOREACH(domains
, d
, first
) {
188 r
= dns_name_equal(name
, d
->name
);