-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdenser.h
More file actions
343 lines (301 loc) · 11.1 KB
/
denser.h
File metadata and controls
343 lines (301 loc) · 11.1 KB
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
#ifndef DENSER_H
#define DENSER_H
#include <inttypes.h>
#include <netinet/in.h>
#include <sys/time.h>
/* Size limits ( rfc 1035 2.3.4 ) */
#define DNSR_MAX_FIELD 2 /* Field width in bytes */
#define DNSR_MAX_LABEL 63
#define DNSR_MAX_LINE 1024
#define DNSR_MAX_HOSTNAME 253 /* Max conventional ASCII representation */
#define DNSR_MAX_NAME 255
#define DNSR_MAX_STRING 256 /* rfc 1034 3.3 */
#define DNSR_MAX_UDP_BASIC 512
#define DNSR_MAX_UDP 1280 /* RFC 6891 6.2.3 */
#define DNSR_MAX_NS 4 /* Max number of name servers */
#define DNSR_MAX_RDATA (uint16_t)65535
#define DNSR_MAX_ERRNO 31 /* Highest valid error number */
#define DNSR_MAX_TYPE 255 /* Highest valid type */
#define DNSR_MAX_CLASS 4 /* Highest valid class */
/* RR types ( RFC 1035 3.2.2 ) */
#define DNSR_TYPE_A 1 /* Host address */
#define DNSR_TYPE_NS 2 /* Authoritative name server */
#define DNSR_TYPE_MD 3 /* Mail destination */
#define DNSR_TYPE_MF 4 /* Mail forwarder */
#define DNSR_TYPE_CNAME 5 /* Canonical name for an alias */
#define DNSR_TYPE_SOA 6 /* Start of a zone of authority */
#define DNSR_TYPE_MB 7 /* Mailbox domain */
#define DNSR_TYPE_MG 8 /* Mail group member */
#define DNSR_TYPE_MR 9 /* Mail rename domain name */
#define DNSR_TYPE_NULL 10 /* Null RR */
#define DNSR_TYPE_WKS 11 /* Well known service description */
#define DNSR_TYPE_PTR 12 /* Domain name pointer */
#define DNSR_TYPE_HINFO 13 /* Host information */
#define DNSR_TYPE_MINFO 14 /* Mailbox or mail list information */
#define DNSR_TYPE_MX 15 /* Mail exchange */
#define DNSR_TYPE_TXT 16 /* Text string */
#define DNSR_TYPE_AAAA 28 /* IPv6 AAAA type */
#define DNSR_TYPE_SRV 33 /* Service Record RFC 2728 */
#define DNSR_TYPE_OPT 41 /* EDNS0 OPT pseudo-RR, RFC 6891 */
#define DNSR_TYPE_ALL 255 /* All records */
/* RR query types ( rfc 1035 3.2.3 ) */
#define DNSR_TYPE_AXFR 252 /* Request transfer of an entire zone */
//#define DNSR_TYPE_MAILB 253 /* Request mail-box related records */
//#define DNSR_TYPE_MAILA 254 /* Request for mail agent records */
//#define DNSR_TYPE_ALL 255 /* Request all records */
/* RR class values ( RFC 6895 3.2 ) */
#define DNSR_CLASS_IN 1 /* Internet */
#define DNSR_CLASS_CH 3 /* CHAOS */
#define DNSR_CLASS_HS 4 /* HESIOD */
/* RR qclass values ( RFC 6895 3.2 ) */
#define DNSR_CLASS_NONE 254 /* RFC 2136 Dynamic Updates */
#define DNSR_CLASS_ALL 255 /* Any class */
/* DNSR flags */
#define DNSR_FLAG_ON 0 /* Turn flag on */
#define DNSR_FLAG_OFF 1 /* Turn flag off */
#define DNSR_FLAG_RECURSION 2 /* Recursion */
/* DNSR error codes */
#define DNSR_ERROR_NONE 0 /* No error condition */
#define DNSR_ERROR_FORMAT 1 /* Format error */
#define DNSR_ERROR_SERVER 2 /* Server failure */
#define DNSR_ERROR_NAME \
3 /* Name error - Meaningful only
* for responses from an
* authoritative name server,
* name does not exist */
#define DNSR_ERROR_NOT_IMPLEMENTED 4 /* Not implemented */
#define DNSR_ERROR_REFUSED 5 /* Operation refused */
/* 6 and 7 reserverd for future
* RC values */
#define DNSR_ERROR_CONFIG 8 /* Config file error */
#define DNSR_ERROR_NO_QUERY \
9 /* dnsr_rr called without
* query being sent */
#define DNSR_ERROR_TIMEOUT 10 /* Timeout */
#define DNSR_ERROR_ID_WRONG \
11 /* rr ID does not match
* query ID */
#define DNSR_ERROR_NOT_RESPONSE 12 /* NS did not return a resp */
#define DNSR_ERROR_NO_RECURSION \
13 /* NS does not offer
* recursion */
#define DNSR_ERROR_QUESTION_WRONG \
14 /* rr question does not
* match query question */
#define DNSR_ERROR_NO_ANSWER 15 /* No answer in rr */
#define DNSR_ERROR_TRUNCATION 16 /* Response truncated */
#define DNSR_ERROR_SYSTEM 17 /* System error. See errono. */
#define DNSR_ERROR_SIZELIMIT_EXCEEDED 18 /* Size limit exceeded */
#define DNSR_ERROR_NS_INVALID 19 /* Invalid NS */
#define DNSR_ERROR_NS_DEAD 20 /* NS dead */
#define DNSR_ERROR_TV 21 /* Time Vale negative */
#define DNSR_ERROR_FD_SET 22 /* Wrong FD selected */
#define DNSR_ERROR_PARSE 23 /* Parse error */
#define DNSR_ERROR_STATE 24 /* Unknown state */
#define DNSR_ERROR_TYPE 25 /* Unknown type */
#define DNSR_ERROR_RCODE 26 /* Unknown rcode */
#define DNSR_ERROR_TOGGLE 27 /* Unknown toggle */
#define DNSR_ERROR_FLAG 28 /* Unknown flag */
#define DNSR_ERROR_CLASS 29 /* Unknown class */
#define DNSR_ERROR_Z 30 /* Z code not zero */
#define DNSR_ERROR_CONNECTION_CLOSED 31 /* Z code not zero */
#define DNSR_ERROR_UNKNOWN 32 /* Unknown error */
struct dnsr_result {
struct dnsr_rr *r_answer;
struct dnsr_rr *r_ns;
struct dnsr_rr *r_additional;
unsigned int r_ancount;
unsigned int r_nscount;
unsigned int r_arcount;
uint16_t r_rcode;
};
typedef struct dnsr DNSR;
/*
* 3.3. Standard RRs
*
* The following RR definitions are expected to occur, at least
* potentially, in all classes. In particular, NS, SOA, CNAME, and PTR
* will be used in all classes, and have the same format in all classes.
* Because their RDATA format is known, all domain names in the RDATA
* section of these RRs may be compressed.
*
* <domain-name> is a domain name represented as a series of labels, and
* terminated by a label with zero length. <character-string> is a single
* length octet followed by that number of characters. <character-string>
* is treated as binary information, and can be up to 256 characters in
* length (including the length octet).
*/
/* Generic RR Domain */
struct rr_dn {
char dn_name[ DNSR_MAX_NAME + 1 ];
};
/* 3.3.1. CNAME RDATA format */
struct rr_cname {
char cn_name[ DNSR_MAX_NAME + 1 ];
};
/* 3.3.2. HINFO RDATA format */
struct rr_hinfo {
char hi_cpu[ DNSR_MAX_STRING + 1 ];
char hi_os[ DNSR_MAX_STRING + 1 ];
};
/* 3.3.3. MB RDATA format */
struct rr_mb {
char mb_name[ DNSR_MAX_NAME + 1 ];
};
/* 3.3.4. MD RDATA format */
struct rr_md {
char md_name[ DNSR_MAX_NAME + 1 ];
};
/* 3.3.5. MF RDATA format */
struct rr_mf {
char mf_name[ DNSR_MAX_NAME + 1 ];
};
/* 3.3.6. MG RDATA format */
struct rr_mg {
char mg_name[ DNSR_MAX_NAME + 1 ];
};
/* 3.3.7. MINFO RDATA format */
struct rr_minfo {
char mi_rmailbx[ DNSR_MAX_NAME + 1 ];
char mi_emailbx[ DNSR_MAX_NAME + 1 ];
};
/* 3.3.8. MR RDATA format */
struct rr_mr {
char mr_name[ DNSR_MAX_NAME + 1 ];
};
/* 3.3.9. MX RDATA format */
struct rr_mx {
uint16_t mx_preference;
char mx_exchange[ DNSR_MAX_NAME + 1 ];
};
/* 3.3.10. NULL RDATA format */
struct rr_null {
char null_name[ DNSR_MAX_RDATA ];
};
/* 3.3.11. NS RDATA format */
struct rr_ns {
char ns_name[ DNSR_MAX_NAME + 1 ];
};
/* 3.3.12. PTR RDATA format */
struct rr_ptr {
char ptr_name[ DNSR_MAX_NAME + 1 ];
};
/* 3.3.13 SOA RDATA format */
struct rr_soa {
char soa_mname[ DNSR_MAX_NAME + 1 ];
char soa_rname[ DNSR_MAX_NAME + 1 ];
int soa_serial;
int32_t soa_refresh;
int32_t soa_retry;
int32_t soa_expire;
int32_t soa_minimum;
};
/* 3.3.14. TXT RDATA format */
struct dnsr_string {
struct dnsr_string *s_next;
char s_string[ DNSR_MAX_STRING + 1 ];
};
struct rr_txt {
struct dnsr_string *txt_data;
};
/*
* 3.4. Internet specific RRs
*/
/* 3.4.1. A RDATA format */
struct rr_a {
struct in_addr a_address;
};
struct rr_aaaa {
struct in6_addr aaaa_address;
};
/* RFC 2782 SRV record */
struct rr_srv {
uint16_t srv_priority;
uint16_t srv_weight;
uint16_t srv_port;
char srv_target[ DNSR_MAX_NAME + 1 ];
};
/* RFC 6891 OPT record */
struct edns_opt {
struct edns_opt *opt_next;
uint8_t *opt_data;
uint16_t opt_code;
uint16_t opt_len;
};
struct rr_opt {
struct edns_opt *opt_opt;
uint8_t opt_rcode;
uint8_t opt_version;
uint16_t opt_flags;
uint16_t opt_udp;
};
struct ip_info {
struct ip_info *ip_next;
struct sockaddr_storage ip_sa;
};
struct dnsr_rr {
char rr_name[ DNSR_MAX_NAME + 1 ]; /* domain name */
struct ip_info *rr_ip; /* related IP */
uint16_t rr_type; /* RR type */
uint16_t rr_class; /* RR class */
uint32_t rr_ttl; /* RR ttl */
uint16_t rr_rdlength; /* length of RDATA field */
union {
struct rr_dn rd_dn;
#define rr_dn rr_u.rd_dn
struct rr_cname rd_cname;
#define rr_cname rr_u.rd_cname
struct rr_hinfo rd_hinfo;
#define rr_hinfo rr_u.rd_hinfo
struct rr_mb rd_mb;
#define rr_mb rr_u.rd_mb
struct rr_md rd_md;
#define rr_md rr_u.rd_md
struct rr_mf rd_mf;
#define rr_mf rr_u.rd_mf
struct rr_mg rd_mg;
#define rr_mg rr_u.rd_mg
struct rr_minfo rd_minfo;
#define rr_minfo rr_u.rd_minfo
struct rr_mr rd_mr;
#define rr_mr rr_u.rd_mr
struct rr_mx rd_mx;
#define rr_mx rr_u.rd_mx
struct rr_null rd_null;
#define rr_null rr_u.rd_null
struct rr_ns rd_ns;
#define rr_ns rr_u.rd_ns
struct rr_ptr rd_ptr;
#define rr_ptr rr_u.rd_ptr
struct rr_soa rd_soa;
#define rr_soa rr_u.rd_soa
struct rr_txt rd_txt;
#define rr_txt rr_u.rd_txt
struct rr_a rd_a;
#define rr_a rr_u.rd_a
struct rr_aaaa rd_aaaa;
#define rr_aaaa rr_u.rd_aaaa
struct rr_srv rd_srv;
#define rr_srv rr_u.rd_srv
struct rr_opt rd_opt;
#define rr_opt rr_u.rd_opt
} rr_u;
};
DNSR *dnsr_new(void);
int dnsr_nameserver(DNSR *dnsr, const char *server);
int dnsr_nameserver_port(DNSR *dnsr, const char *server, const char *port);
int dnsr_config(DNSR *dnsr, int flag, int toggle);
int dnsr_query(DNSR *dnsr, uint16_t qtype, uint16_t qclass, const char *dn);
struct dnsr_result *dnsr_result(DNSR *dnsr, struct timeval *timeout);
int dnsr_result_expired(DNSR *dnsr, struct dnsr_result *result);
char *dnsr_ntoptr(DNSR *, int, const void *, const char *);
char *dnsr_reverse_ip(DNSR *, const char *, const char *);
int dnsr_errno(DNSR *dnser);
void dnsr_errclear(DNSR *dnser);
char *dnsr_err2string(int dnsr_errno);
void dnsr_perror(DNSR *dnsr, const char *s);
void dnsr_free(DNSR *dnsr);
void dnsr_free_result(struct dnsr_result *result);
void dnsr_free_val(void *);
int dnsr_send_query(DNSR *dnsr, int ns);
#endif /* DENSER_H */