]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/resolve/resolved-dns-query.h
resolved: rework what ResolveHostname() with family == AF_UNSPEC means
[thirdparty/systemd.git] / src / resolve / resolved-dns-query.h
CommitLineData
74b2466e
LP
1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3#pragma once
4
5/***
6 This file is part of systemd.
7
8 Copyright 2014 Lennart Poettering
9
10 systemd is free software; you can redistribute it and/or modify it
11 under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation; either version 2.1 of the License, or
13 (at your option) any later version.
14
15 systemd is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 Lesser General Public License for more details.
19
20 You should have received a copy of the GNU Lesser General Public License
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22***/
23
74b2466e
LP
24
25#include "sd-bus.h"
71d35b6b 26
faa133f3 27#include "set.h"
74b2466e 28
801ad6a6 29typedef struct DnsQueryCandidate DnsQueryCandidate;
74b2466e 30typedef struct DnsQuery DnsQuery;
74b2466e 31
faa133f3 32#include "resolved-dns-answer.h"
71d35b6b 33#include "resolved-dns-question.h"
623a4c97 34#include "resolved-dns-stream.h"
801ad6a6
LP
35#include "resolved-dns-search-domain.h"
36
37struct DnsQueryCandidate {
38 DnsQuery *query;
39 DnsScope *scope;
40
41 DnsSearchDomain *search_domain;
42
43 int error_code;
44 Set *transactions;
45
46 LIST_FIELDS(DnsQueryCandidate, candidates_by_query);
47 LIST_FIELDS(DnsQueryCandidate, candidates_by_scope);
48};
74b2466e
LP
49
50struct DnsQuery {
51 Manager *manager;
45ec7efb
LP
52
53 /* When resolving a service, we first create a TXT+SRV query,
54 * and then for the hostnames we discover auxiliary A+AAAA
55 * queries. This pointer always points from the auxiliary
56 * queries back to the TXT+SRV query. */
57 DnsQuery *auxiliary_for;
58 LIST_HEAD(DnsQuery, auxiliary_queries);
59 unsigned n_auxiliary_queries;
60 int auxiliary_result;
61
23b298bc
LP
62 /* The question, formatted in IDNA for use on classic DNS, and as UTF8 for use in LLMNR or mDNS. Note that even
63 * on classic DNS some labels might use UTF8 encoding. Specifically, DNS-SD service names (in contrast to their
64 * domain suffixes) use UTF-8 encoding even on DNS. Thus, the difference between these two fields is mostly
65 * relevant only for explicit *hostname* lookups as well as the domain suffixes of service lookups. */
66 DnsQuestion *question_idna;
67 DnsQuestion *question_utf8;
68
51323288
LP
69 uint64_t flags;
70 int ifindex;
71
011696f7
LP
72 /* If true, A or AAAA RR lookups will be suppressed on links with no routable address of the matching address
73 * family */
74 bool suppress_unroutable_family;
75
ec2c5e43 76 DnsTransactionState state;
faa133f3 77 unsigned n_cname_redirects;
74b2466e 78
801ad6a6 79 LIST_HEAD(DnsQueryCandidate, candidates);
74b2466e
LP
80 sd_event_source *timeout_event_source;
81
322345fd 82 /* Discovered data */
faa133f3 83 DnsAnswer *answer;
faa133f3 84 int answer_rcode;
019036a4
LP
85 DnssecResult answer_dnssec_result;
86 bool answer_authenticated;
ae6a4bbf
LP
87 DnsProtocol answer_protocol;
88 int answer_family;
801ad6a6 89 DnsSearchDomain *answer_search_domain;
7cc6ed7b 90 int answer_errno; /* if state is DNS_TRANSACTION_ERRNO */
74b2466e 91
8ba9fd9c 92 /* Bus client information */
74b2466e 93 sd_bus_message *request;
0dd25fb9 94 int request_family;
45ec7efb 95 bool request_address_valid;
74b2466e 96 union in_addr_union request_address;
45ec7efb 97 unsigned block_all_complete;
23b298bc 98 char *request_address_string;
74b2466e 99
322345fd 100 /* Completion callback */
74b2466e 101 void (*complete)(DnsQuery* q);
faa133f3
LP
102 unsigned block_ready;
103
82bd6ddd
LP
104 sd_bus_track *bus_track;
105
74b2466e 106 LIST_FIELDS(DnsQuery, queries);
45ec7efb 107 LIST_FIELDS(DnsQuery, auxiliary_queries);
74b2466e
LP
108};
109
7588460a
TG
110enum {
111 DNS_QUERY_MATCH,
112 DNS_QUERY_NOMATCH,
113 DNS_QUERY_RESTARTED,
114};
115
801ad6a6 116DnsQueryCandidate* dns_query_candidate_free(DnsQueryCandidate *c);
547973de 117void dns_query_candidate_notify(DnsQueryCandidate *c);
801ad6a6 118
23b298bc 119int dns_query_new(Manager *m, DnsQuery **q, DnsQuestion *question_utf8, DnsQuestion *question_idna, int family, uint64_t flags);
74b2466e 120DnsQuery *dns_query_free(DnsQuery *q);
322345fd 121
45ec7efb
LP
122int dns_query_make_auxiliary(DnsQuery *q, DnsQuery *auxiliary_for);
123
322345fd 124int dns_query_go(DnsQuery *q);
faa133f3 125void dns_query_ready(DnsQuery *q);
74b2466e 126
45ec7efb 127int dns_query_process_cname(DnsQuery *q);
74b2466e 128
966c66e3 129int dns_query_bus_track(DnsQuery *q, sd_bus_message *m);
82bd6ddd 130
23b298bc
LP
131DnsQuestion* dns_query_question_for_protocol(DnsQuery *q, DnsProtocol protocol);
132
133const char *dns_query_string(DnsQuery *q);
134
74b2466e 135DEFINE_TRIVIAL_CLEANUP_FUNC(DnsQuery*, dns_query_free);