]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/resolve/resolved-dns-question.h
resolved: automatically forget all learnt DNS server information when the network...
[thirdparty/systemd.git] / src / resolve / resolved-dns-question.h
1 #pragma once
2
3 /***
4 This file is part of systemd.
5
6 Copyright 2014 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 typedef struct DnsQuestion DnsQuestion;
23
24 #include "macro.h"
25 #include "resolved-dns-rr.h"
26
27 /* A simple array of resource keys */
28
29 struct DnsQuestion {
30 unsigned n_ref;
31 unsigned n_keys, n_allocated;
32 DnsResourceKey* keys[0];
33 };
34
35 DnsQuestion *dns_question_new(unsigned n);
36 DnsQuestion *dns_question_ref(DnsQuestion *q);
37 DnsQuestion *dns_question_unref(DnsQuestion *q);
38
39 int dns_question_new_address(DnsQuestion **ret, int family, const char *name, bool convert_idna);
40 int dns_question_new_reverse(DnsQuestion **ret, int family, const union in_addr_union *a);
41 int dns_question_new_service(DnsQuestion **ret, const char *service, const char *type, const char *domain, bool with_txt, bool convert_idna);
42
43 int dns_question_add(DnsQuestion *q, DnsResourceKey *key);
44
45 int dns_question_matches_rr(DnsQuestion *q, DnsResourceRecord *rr, const char *search_domain);
46 int dns_question_matches_cname_or_dname(DnsQuestion *q, DnsResourceRecord *rr, const char* search_domain);
47 int dns_question_is_valid_for_query(DnsQuestion *q);
48 int dns_question_contains(DnsQuestion *a, const DnsResourceKey *k);
49 int dns_question_is_equal(DnsQuestion *a, DnsQuestion *b);
50
51 int dns_question_cname_redirect(DnsQuestion *q, const DnsResourceRecord *cname, DnsQuestion **ret);
52
53 const char *dns_question_first_name(DnsQuestion *q);
54
55 static inline unsigned dns_question_size(DnsQuestion *q) {
56 return q ? q->n_keys : 0;
57 }
58
59 static inline bool dns_question_isempty(DnsQuestion *q) {
60 return dns_question_size(q) <= 0;
61 }
62
63 DEFINE_TRIVIAL_CLEANUP_FUNC(DnsQuestion*, dns_question_unref);
64
65 #define _DNS_QUESTION_FOREACH(u, key, q) \
66 for (unsigned UNIQ_T(i, u) = ({ \
67 (key) = ((q) && (q)->n_keys > 0) ? (q)->keys[0] : NULL; \
68 0; \
69 }); \
70 (q) && (UNIQ_T(i, u) < (q)->n_keys); \
71 UNIQ_T(i, u)++, (key) = (UNIQ_T(i, u) < (q)->n_keys ? (q)->keys[UNIQ_T(i, u)] : NULL))
72
73 #define DNS_QUESTION_FOREACH(key, q) _DNS_QUESTION_FOREACH(UNIQ, key, q)