1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
|
#ifndef DNSRESOLV_H
#define DNSRESOLV_H
/*
* Revision 20230613, Erwin Hoffmann
* - DNS_NXD (return code 0) for NXDOMAIN and NODATA added
* - DNS_SOFT as shortcut for DNS_ERR or DNS_COM
* - DNS_HARD indicates DNS loop problems
* Revision 20221101, Erwin Hoffmann
* - DNS_COM has now return code -3 (as documented; tx. Franz S.)
* Revision 20210922, Erwin Hoffmann
* - Added constants MAXMSGSIZE and MAXSEGMENT - not used yet
* Revision 20210401, Erwin Hoffmann
* - removed obsolete dns_sortip(); not going to work with GCC-10 anyway
* Revision 20200719, Erwin Hoffmann
* - added dns_qualify_localhost function including fqdn retrun
* Revision 20190730, Erwin Hoffmann
* - revised DNS_* return codes to make them compliant with ucspi-*
* Revision 20190430, Erwin Hoffmann
* - added DNS_SOFT/HARD/MEM complient to s/qmail
* - code changes in all decendent modules
* Revision 20180222, Erwin Hoffmann
* - we consider in total 32 NS IPs (IPv4 + IPv6)
* - added dns_transmit_start6
* - added uint32 scope_ids[32],
* the initial NS scopes read from /etc/resolv.conf et al.
* Revision 20180118, Erwin Hoffmann
* - included MSGSIZE for DNS messages (instead of MTUSIZE)
* Revision 20171231, Erwin Hoffmann
* - renamed to dnsresolv.h and removed *qmail declarations
* Revision 20170902, Erwin Hoffmann
* - added old definitions from *qmail for (temp) backwards compatibility
* - added more DNS RR definitions
*/
#include "iopause.h"
#include "stralloc.h"
#include "taia.h"
/* Note: The conventions are subject of change in forthcoming versions */
#define DNS_NXD 0 /* NXDOMAIN, NODATA */
#define DNS_MEM -1 /* out of memory; fatal */
#define DNS_ERR -2 /* parsing errors and others */
#define DNS_COM -3 /* (socket) communication errors: SERVFAIL */
#define DNS_INT -4 /* internal errors */
#define DNS_SOFT -5 /* DNS_ERR or DNS_COM */
#define DNS_HARD -6 /* DNS loop problem */
#define MSGSIZE MTUSIZE /* todays default */
// #define MSGSIZE 512 /* RFC 1035 */
#define MAXMSGSIZE 4096 /* 4069 seen with EDNS0 */
#define MAXSEGMENT 65535 /* Max TCP buffer size */
#define QUERY_MAXNS 32 /* 16 IPv4 + 16 IPv6 NS */
#define QUERY_MAXIPLEN 512 /* QUERY_MAXNS * 16 */
/* Note: These following definitions are subject of change */
#define DNS_C_IN "\0\1"
#define DNS_C_ANY "\0\377"
#define DNS_T_A "\0\1"
#define DNS_T_NS "\0\2"
#define DNS_T_CNAME "\0\5"
#define DNS_T_SOA "\0\6"
#define DNS_T_PTR "\0\14"
#define DNS_T_HINFO "\0\15"
#define DNS_T_MX "\0\17"
#define DNS_T_TXT "\0\20"
#define DNS_T_RP "\0\21"
#define DNS_T_SIG "\0\30"
#define DNS_T_KEY "\0\31"
#define DNS_T_AAAA "\0\34"
#define DNS_T_SRV "\0\41"
#define DNS_T_NAPTR "\0\43"
#define DNS_T_CERT "\0\45"
#define DNS_T_OPT "\0\51"
#define DNS_T_DS "\0\53"
#define DNS_T_SSHFP "\0\54"
#define DNS_T_IPSECKEY "\0\55"
#define DNS_T_RRSIG "\0\56"
#define DNS_T_NSEC "\0\57"
#define DNS_T_DNSKEY "\0\60"
#define DNS_T_NSEC3 "\0\62"
#define DNS_T_NSEC3PARAM "\0\63"
#define DNS_T_TLSA "\0\64"
#define DNS_T_HIP "\0\67"
#define DNS_T_OPENPGPKEY "\0\75"
#define DNS_T_SPF "\0\143"
#define DNS_T_AXFR "\0\374"
#define DNS_T_ANY "\0\377"
#define DNS_T_CAA "\1\1"
#define LOCALHOST "localhost" /* no clear distinction IPv4/IPv6 */
#define IP4_LOOPBACK "ip4-loopback"
#define IP6_LOOPBACK "ip6-loopback"
struct dns_transmit {
char *query; /* 0, or dynamically allocated */
unsigned int querylen;
char *packet; /* 0, or dynamically allocated */
unsigned int packetlen;
int s1; /* 0, or 1 + an open file descriptor */
int tcpstate;
unsigned int udploop;
unsigned int curserver;
struct taia deadline;
unsigned int pos;
const char *servers;
uint32 scope_id;
char localip[16];
char qtype[2];
};
/* General */
extern void dns_random_init(const char *);
extern unsigned int dns_random(unsigned int);
extern void dns_domain_free(char **);
extern int dns_domain_copy(char **, const char *);
extern unsigned int dns_domain_length(const char *);
extern int dns_domain_equal(const char *, const char *);
extern int dns_domain_suffix(const char *, const char *);
extern unsigned int dns_domain_suffixpos(const char *, const char *);
extern int dns_domain_fromdot(char **, const char *, unsigned int);
extern int dns_domain_todot_cat(stralloc *, const char *);
extern int dns_ip_qualify(stralloc *, stralloc *, const stralloc *);
extern int dns_ip_qualify_rules(stralloc *, stralloc *, const stralloc *, const stralloc *);
extern int dns_ip_qualify_localhost(stralloc *, stralloc *, const stralloc *);
extern unsigned int dns_packet_copy(const char *, unsigned int, unsigned int, char *, unsigned int);
extern unsigned int dns_packet_getname(const char *, unsigned int, unsigned int, char **);
extern unsigned int dns_packet_skipname(const char *, unsigned int, unsigned int);
extern struct dns_transmit dns_resolve_tx;
extern int dns_transmit_start(
struct dns_transmit *, const char *, int, const char *, const char *, const char *);
extern void dns_transmit_free(struct dns_transmit *);
extern void dns_transmit_io(struct dns_transmit *, iopause_fd *, struct taia *);
extern int dns_transmit_get(struct dns_transmit *, const iopause_fd *, const struct taia *);
/* Common IPv4 + IPv6 */
extern int dns_resolvconfip(char *, uint32 *);
extern int dns_resolvconfrewrite(stralloc *);
extern int dns_resolve(const char *, const char *);
extern int dns_name(stralloc *, const char *);
extern int dns_name_packet(stralloc *, const char *, unsigned int);
extern int dns_txt_packet(stralloc *, const char *, unsigned int);
extern int dns_txt(stralloc *, const stralloc *);
extern int dns_mx_packet(stralloc *, const char *, unsigned int);
extern int dns_mx(stralloc *, const stralloc *);
/* IPv4 specific */
extern int dns_ip4_packet(stralloc *, const char *, unsigned int);
extern int dns_ip4(stralloc *, stralloc *);
extern void dns_sortip4(char *, unsigned int);
extern int dns_ip4_qualify_rules(stralloc *, stralloc *, const stralloc *, const stralloc *);
extern int dns_ip4_qualify(stralloc *, stralloc *, const stralloc *);
#define DNS_NAME4_DOMAIN 31
extern int dns_name4_domain(char *, const char *);
extern int dns_name4(stralloc *, const char *);
extern int randombind4(struct dns_transmit *);
/* IPv6 specific */
extern int dns_ip6_packet(stralloc *, const char *, unsigned int);
extern int dns_ip6(stralloc *, stralloc *);
extern void dns_sortip6(char *, unsigned int);
extern int dns_ip6_qualify_rules(stralloc *, stralloc *, const stralloc *, const stralloc *);
extern int dns_ip6_qualify(stralloc *, stralloc *, const stralloc *);
#define DNS_NAME6_DOMAIN (4 * 16 + 11)
extern int dns_name6_domain(char *, const char *);
extern int dns_name6(stralloc *, const char *);
extern int dns_cname_packet(stralloc *, const char *, unsigned int);
extern int dns_cname(stralloc *, stralloc *);
extern int dns_transmit_start6(
struct dns_transmit *, const char *, int, const char *, const char *, const char *, const uint32 *);
extern int randombind6(struct dns_transmit *);
/* General */
extern void socketfree(struct dns_transmit *);
extern void queryfree(struct dns_transmit *);
extern void packetfree(struct dns_transmit *);
extern int serverwantstcp(const char *, unsigned int);
extern int serverfailed(const char *, unsigned int);
extern int getscopeid(const struct dns_transmit *, const char *);
extern int firstudp(struct dns_transmit *);
extern int nextudp(struct dns_transmit *);
extern int firsttcp(struct dns_transmit *);
extern int nexttcp(struct dns_transmit *);
#endif
|