]>
Commit | Line | Data |
---|---|---|
db9ecf05 | 1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
faa133f3 LP |
2 | #pragma once |
3 | ||
faa133f3 | 4 | typedef struct DnsQuestion DnsQuestion; |
ab715ddb | 5 | typedef struct DnsQuestionItem DnsQuestionItem; |
faa133f3 | 6 | |
92aea95e | 7 | #include "macro.h" |
faa133f3 LP |
8 | #include "resolved-dns-rr.h" |
9 | ||
92aea95e | 10 | /* A simple array of resource keys */ |
faa133f3 | 11 | |
ab715ddb SB |
12 | typedef enum DnsQuestionFlags { |
13 | DNS_QUESTION_WANTS_UNICAST_REPLY = 1 << 0, /* For mDNS: sender is willing to accept unicast replies */ | |
14 | } DnsQuestionFlags; | |
15 | ||
16 | struct DnsQuestionItem { | |
17 | DnsResourceKey *key; | |
18 | DnsQuestionFlags flags; | |
19 | }; | |
20 | ||
faa133f3 LP |
21 | struct DnsQuestion { |
22 | unsigned n_ref; | |
da6053d0 | 23 | size_t n_keys, n_allocated; |
1af42763 | 24 | DnsQuestionItem items[]; |
faa133f3 LP |
25 | }; |
26 | ||
da6053d0 | 27 | DnsQuestion *dns_question_new(size_t n); |
faa133f3 LP |
28 | DnsQuestion *dns_question_ref(DnsQuestion *q); |
29 | DnsQuestion *dns_question_unref(DnsQuestion *q); | |
30 | ||
23b298bc | 31 | int dns_question_new_address(DnsQuestion **ret, int family, const char *name, bool convert_idna); |
45ec7efb | 32 | int dns_question_new_reverse(DnsQuestion **ret, int family, const union in_addr_union *a); |
23b298bc | 33 | int dns_question_new_service(DnsQuestion **ret, const char *service, const char *type, const char *domain, bool with_txt, bool convert_idna); |
45ec7efb | 34 | |
ab715ddb SB |
35 | int dns_question_add_raw(DnsQuestion *q, DnsResourceKey *key, DnsQuestionFlags flags); |
36 | int dns_question_add(DnsQuestion *q, DnsResourceKey *key, DnsQuestionFlags flags); | |
faa133f3 | 37 | |
801ad6a6 | 38 | int dns_question_matches_rr(DnsQuestion *q, DnsResourceRecord *rr, const char *search_domain); |
542e0c84 | 39 | int dns_question_matches_cname_or_dname(DnsQuestion *q, DnsResourceRecord *rr, const char* search_domain); |
703e4f5e | 40 | int dns_question_is_valid_for_query(DnsQuestion *q); |
ab715ddb | 41 | int dns_question_contains_key(DnsQuestion *q, const DnsResourceKey *k); |
1086182d | 42 | int dns_question_is_equal(DnsQuestion *a, DnsQuestion *b); |
faa133f3 | 43 | |
36d9205d | 44 | int dns_question_cname_redirect(DnsQuestion *q, const DnsResourceRecord *cname, DnsQuestion **ret); |
faa133f3 | 45 | |
1414b67e LP |
46 | void dns_question_dump(DnsQuestion *q, FILE *f); |
47 | ||
703e4f5e | 48 | const char *dns_question_first_name(DnsQuestion *q); |
45ec7efb | 49 | |
ab715ddb SB |
50 | static inline DnsResourceKey *dns_question_first_key(DnsQuestion *q) { |
51 | return (q && q->n_keys > 0) ? q->items[0].key : NULL; | |
52 | } | |
53 | ||
da6053d0 | 54 | static inline size_t dns_question_size(DnsQuestion *q) { |
23b298bc LP |
55 | return q ? q->n_keys : 0; |
56 | } | |
57 | ||
501e8eb0 LP |
58 | static inline bool dns_question_isempty(DnsQuestion *q) { |
59 | return dns_question_size(q) <= 0; | |
60 | } | |
61 | ||
4d593fb1 LP |
62 | int dns_question_merge(DnsQuestion *a, DnsQuestion *b, DnsQuestion **ret); |
63 | ||
faa133f3 | 64 | DEFINE_TRIVIAL_CLEANUP_FUNC(DnsQuestion*, dns_question_unref); |
801ad6a6 | 65 | |
ab715ddb SB |
66 | #define _DNS_QUESTION_FOREACH(u, k, q) \ |
67 | for (size_t UNIQ_T(i, u) = ({ \ | |
68 | (k) = ((q) && (q)->n_keys > 0) ? (q)->items[0].key : NULL; \ | |
69 | 0; \ | |
70 | }); \ | |
71 | (q) && (UNIQ_T(i, u) < (q)->n_keys); \ | |
72 | UNIQ_T(i, u)++, (k) = (UNIQ_T(i, u) < (q)->n_keys ? (q)->items[UNIQ_T(i, u)].key : NULL)) | |
92aea95e LP |
73 | |
74 | #define DNS_QUESTION_FOREACH(key, q) _DNS_QUESTION_FOREACH(UNIQ, key, q) | |
ab715ddb SB |
75 | |
76 | #define _DNS_QUESTION_FOREACH_ITEM(u, item, q) \ | |
77 | for (size_t UNIQ_T(i, u) = ({ \ | |
78 | (item) = dns_question_isempty(q) ? NULL : (q)->items; \ | |
79 | 0; \ | |
80 | }); \ | |
81 | UNIQ_T(i, u) < dns_question_size(q); \ | |
82 | UNIQ_T(i, u)++, (item) = (UNIQ_T(i, u) < dns_question_size(q) ? (q)->items + UNIQ_T(i, u) : NULL)) | |
83 | ||
84 | #define DNS_QUESTION_FOREACH_ITEM(item, q) _DNS_QUESTION_FOREACH_ITEM(UNIQ, item, q) |