1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2015 Lennart Poettering
8 #include "alloc-util.h"
9 #include "dns-domain.h"
10 #include "resolved-dns-search-domain.h"
12 int dns_search_domain_new(
14 DnsSearchDomain
**ret
,
15 DnsSearchDomainType type
,
19 _cleanup_free_
char *normalized
= NULL
;
24 assert((type
== DNS_SEARCH_DOMAIN_LINK
) == !!l
);
27 r
= dns_name_normalize(name
, &normalized
);
32 if (l
->n_search_domains
>= LINK_SEARCH_DOMAINS_MAX
)
35 if (m
->n_search_domains
>= MANAGER_SEARCH_DOMAINS_MAX
)
39 d
= new0(DnsSearchDomain
, 1);
46 d
->name
= TAKE_PTR(normalized
);
50 case DNS_SEARCH_DOMAIN_LINK
:
52 LIST_APPEND(domains
, l
->search_domains
, d
);
53 l
->n_search_domains
++;
56 case DNS_SERVER_SYSTEM
:
57 LIST_APPEND(domains
, m
->search_domains
, d
);
58 m
->n_search_domains
++;
62 assert_not_reached("Unknown search domain type");
73 DnsSearchDomain
* dns_search_domain_ref(DnsSearchDomain
*d
) {
83 DnsSearchDomain
* dns_search_domain_unref(DnsSearchDomain
*d
) {
97 void dns_search_domain_unlink(DnsSearchDomain
*d
) {
106 case DNS_SEARCH_DOMAIN_LINK
:
108 assert(d
->link
->n_search_domains
> 0);
109 LIST_REMOVE(domains
, d
->link
->search_domains
, d
);
110 d
->link
->n_search_domains
--;
113 case DNS_SEARCH_DOMAIN_SYSTEM
:
114 assert(d
->manager
->n_search_domains
> 0);
115 LIST_REMOVE(domains
, d
->manager
->search_domains
, d
);
116 d
->manager
->n_search_domains
--;
122 dns_search_domain_unref(d
);
125 void dns_search_domain_move_back_and_unmark(DnsSearchDomain
*d
) {
126 DnsSearchDomain
*tail
;
135 if (!d
->linked
|| !d
->domains_next
)
140 case DNS_SEARCH_DOMAIN_LINK
:
142 LIST_FIND_TAIL(domains
, d
, tail
);
143 LIST_REMOVE(domains
, d
->link
->search_domains
, d
);
144 LIST_INSERT_AFTER(domains
, d
->link
->search_domains
, tail
, d
);
147 case DNS_SEARCH_DOMAIN_SYSTEM
:
148 LIST_FIND_TAIL(domains
, d
, tail
);
149 LIST_REMOVE(domains
, d
->manager
->search_domains
, d
);
150 LIST_INSERT_AFTER(domains
, d
->manager
->search_domains
, tail
, d
);
154 assert_not_reached("Unknown search domain type");
158 void dns_search_domain_unlink_all(DnsSearchDomain
*first
) {
159 DnsSearchDomain
*next
;
164 next
= first
->domains_next
;
165 dns_search_domain_unlink(first
);
167 dns_search_domain_unlink_all(next
);
170 void dns_search_domain_unlink_marked(DnsSearchDomain
*first
) {
171 DnsSearchDomain
*next
;
176 next
= first
->domains_next
;
179 dns_search_domain_unlink(first
);
181 dns_search_domain_unlink_marked(next
);
184 void dns_search_domain_mark_all(DnsSearchDomain
*first
) {
188 first
->marked
= true;
189 dns_search_domain_mark_all(first
->domains_next
);
192 int dns_search_domain_find(DnsSearchDomain
*first
, const char *name
, DnsSearchDomain
**ret
) {
199 LIST_FOREACH(domains
, d
, first
) {
201 r
= dns_name_equal(name
, d
->name
);