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