simplify some logic in scanf and remove redundant invalid-format check
[musl] / include / arpa / nameser.h
1 #ifndef _ARPA_NAMESER_H
2 #define _ARPA_NAMESER_H
3
4 #include <stdint.h>
5
6 #define __NAMESER       19991006
7 #define NS_PACKETSZ     512
8 #define NS_MAXDNAME     1025
9 #define NS_MAXMSG       65535
10 #define NS_MAXCDNAME    255
11 #define NS_MAXLABEL     63
12 #define NS_HFIXEDSZ     12
13 #define NS_QFIXEDSZ     4
14 #define NS_RRFIXEDSZ    10
15 #define NS_INT32SZ      4
16 #define NS_INT16SZ      2
17 #define NS_INT8SZ       1
18 #define NS_INADDRSZ     4
19 #define NS_IN6ADDRSZ    16
20 #define NS_CMPRSFLGS    0xc0
21 #define NS_DEFAULTPORT  53
22
23 typedef enum __ns_sect {
24         ns_s_qd = 0,
25         ns_s_zn = 0,
26         ns_s_an = 1,
27         ns_s_pr = 1,
28         ns_s_ns = 2,
29         ns_s_ud = 2,
30         ns_s_ar = 3,
31         ns_s_max = 4
32 } ns_sect;
33
34 typedef struct __ns_msg {
35         const unsigned char *_msg, *_eom;
36         uint16_t _id, _flags, _counts[ns_s_max];
37         const unsigned char *_sections[ns_s_max];
38         ns_sect _sect;
39         int _rrnum;
40         const unsigned char *_msg_ptr;
41 } ns_msg;
42
43 struct _ns_flagdata {  int mask, shift;  };
44 extern const struct _ns_flagdata _ns_flagdata[];
45
46 #define ns_msg_id(handle) ((handle)._id + 0)
47 #define ns_msg_base(handle) ((handle)._msg + 0)
48 #define ns_msg_end(handle) ((handle)._eom + 0)
49 #define ns_msg_size(handle) ((handle)._eom - (handle)._msg)
50 #define ns_msg_count(handle, section) ((handle)._counts[section] + 0)
51
52 typedef struct __ns_rr {
53         char            name[NS_MAXDNAME];
54         uint16_t        type;
55         uint16_t        rr_class;
56         uint32_t        ttl;
57         uint16_t        rdlength;
58         const unsigned char *rdata;
59 } ns_rr;
60
61 #define ns_rr_name(rr)  (((rr).name[0] != '\0') ? (rr).name : ".")
62 #define ns_rr_type(rr)  ((ns_type)((rr).type + 0))
63 #define ns_rr_class(rr) ((ns_class)((rr).rr_class + 0))
64 #define ns_rr_ttl(rr)   ((rr).ttl + 0)
65 #define ns_rr_rdlen(rr) ((rr).rdlength + 0)
66 #define ns_rr_rdata(rr) ((rr).rdata + 0)
67
68 typedef enum __ns_flag {
69         ns_f_qr,
70         ns_f_opcode,
71         ns_f_aa,
72         ns_f_tc,
73         ns_f_rd,
74         ns_f_ra,
75         ns_f_z,
76         ns_f_ad,
77         ns_f_cd,
78         ns_f_rcode,
79         ns_f_max
80 } ns_flag;
81
82 typedef enum __ns_opcode {
83         ns_o_query = 0,
84         ns_o_iquery = 1,
85         ns_o_status = 2,
86         ns_o_notify = 4,
87         ns_o_update = 5,
88         ns_o_max = 6
89 } ns_opcode;
90
91 typedef enum __ns_rcode {
92         ns_r_noerror = 0,
93         ns_r_formerr = 1,
94         ns_r_servfail = 2,
95         ns_r_nxdomain = 3,
96         ns_r_notimpl = 4,
97         ns_r_refused = 5,
98         ns_r_yxdomain = 6,
99         ns_r_yxrrset = 7,
100         ns_r_nxrrset = 8,
101         ns_r_notauth = 9,
102         ns_r_notzone = 10,
103         ns_r_max = 11,
104         ns_r_badvers = 16,
105         ns_r_badsig = 16,
106         ns_r_badkey = 17,
107         ns_r_badtime = 18
108 } ns_rcode;
109
110 typedef enum __ns_update_operation {
111         ns_uop_delete = 0,
112         ns_uop_add = 1,
113         ns_uop_max = 2
114 } ns_update_operation;
115
116 struct ns_tsig_key {
117         char name[NS_MAXDNAME], alg[NS_MAXDNAME];
118         unsigned char *data;
119         int len;
120 };
121 typedef struct ns_tsig_key ns_tsig_key;
122
123 struct ns_tcp_tsig_state {
124         int counter;
125         struct dst_key *key;
126         void *ctx;
127         unsigned char sig[NS_PACKETSZ];
128         int siglen;
129 };
130 typedef struct ns_tcp_tsig_state ns_tcp_tsig_state;
131
132 #define NS_TSIG_FUDGE 300
133 #define NS_TSIG_TCP_COUNT 100
134 #define NS_TSIG_ALG_HMAC_MD5 "HMAC-MD5.SIG-ALG.REG.INT"
135
136 #define NS_TSIG_ERROR_NO_TSIG -10
137 #define NS_TSIG_ERROR_NO_SPACE -11
138 #define NS_TSIG_ERROR_FORMERR -12
139
140 typedef enum __ns_type {
141         ns_t_invalid = 0,
142         ns_t_a = 1,
143         ns_t_ns = 2,
144         ns_t_md = 3,
145         ns_t_mf = 4,
146         ns_t_cname = 5,
147         ns_t_soa = 6,
148         ns_t_mb = 7,
149         ns_t_mg = 8,
150         ns_t_mr = 9,
151         ns_t_null = 10,
152         ns_t_wks = 11,
153         ns_t_ptr = 12,
154         ns_t_hinfo = 13,
155         ns_t_minfo = 14,
156         ns_t_mx = 15,
157         ns_t_txt = 16,
158         ns_t_rp = 17,
159         ns_t_afsdb = 18,
160         ns_t_x25 = 19,
161         ns_t_isdn = 20,
162         ns_t_rt = 21,
163         ns_t_nsap = 22,
164         ns_t_nsap_ptr = 23,
165         ns_t_sig = 24,
166         ns_t_key = 25,
167         ns_t_px = 26,
168         ns_t_gpos = 27,
169         ns_t_aaaa = 28,
170         ns_t_loc = 29,
171         ns_t_nxt = 30,
172         ns_t_eid = 31,
173         ns_t_nimloc = 32,
174         ns_t_srv = 33,
175         ns_t_atma = 34,
176         ns_t_naptr = 35,
177         ns_t_kx = 36,
178         ns_t_cert = 37,
179         ns_t_a6 = 38,
180         ns_t_dname = 39,
181         ns_t_sink = 40,
182         ns_t_opt = 41,
183         ns_t_apl = 42,
184         ns_t_tkey = 249,
185         ns_t_tsig = 250,
186         ns_t_ixfr = 251,
187         ns_t_axfr = 252,
188         ns_t_mailb = 253,
189         ns_t_maila = 254,
190         ns_t_any = 255,
191         ns_t_zxfr = 256,
192         ns_t_max = 65536
193 } ns_type;
194
195 #define ns_t_qt_p(t) (ns_t_xfr_p(t) || (t) == ns_t_any || \
196                       (t) == ns_t_mailb || (t) == ns_t_maila)
197 #define ns_t_mrr_p(t) ((t) == ns_t_tsig || (t) == ns_t_opt)
198 #define ns_t_rr_p(t) (!ns_t_qt_p(t) && !ns_t_mrr_p(t))
199 #define ns_t_udp_p(t) ((t) != ns_t_axfr && (t) != ns_t_zxfr)
200 #define ns_t_xfr_p(t) ((t) == ns_t_axfr || (t) == ns_t_ixfr || \
201                        (t) == ns_t_zxfr)
202
203 typedef enum __ns_class {
204         ns_c_invalid = 0,
205         ns_c_in = 1,
206         ns_c_2 = 2,
207         ns_c_chaos = 3,
208         ns_c_hs = 4,
209         ns_c_none = 254,
210         ns_c_any = 255,
211         ns_c_max = 65536
212 } ns_class;
213
214 typedef enum __ns_key_types {
215         ns_kt_rsa = 1,
216         ns_kt_dh  = 2,
217         ns_kt_dsa = 3,
218         ns_kt_private = 254
219 } ns_key_types;
220
221 typedef enum __ns_cert_types {
222         cert_t_pkix = 1,
223         cert_t_spki = 2,
224         cert_t_pgp  = 3,
225         cert_t_url  = 253,
226         cert_t_oid  = 254
227 } ns_cert_types;
228
229 #define NS_KEY_TYPEMASK         0xC000
230 #define NS_KEY_TYPE_AUTH_CONF   0x0000
231 #define NS_KEY_TYPE_CONF_ONLY   0x8000
232 #define NS_KEY_TYPE_AUTH_ONLY   0x4000
233 #define NS_KEY_TYPE_NO_KEY      0xC000
234 #define NS_KEY_NO_AUTH          0x8000
235 #define NS_KEY_NO_CONF          0x4000
236 #define NS_KEY_RESERVED2        0x2000
237 #define NS_KEY_EXTENDED_FLAGS   0x1000
238 #define NS_KEY_RESERVED4        0x0800
239 #define NS_KEY_RESERVED5        0x0400
240 #define NS_KEY_NAME_TYPE        0x0300
241 #define NS_KEY_NAME_USER        0x0000
242 #define NS_KEY_NAME_ENTITY      0x0200
243 #define NS_KEY_NAME_ZONE        0x0100
244 #define NS_KEY_NAME_RESERVED    0x0300
245 #define NS_KEY_RESERVED8        0x0080
246 #define NS_KEY_RESERVED9        0x0040
247 #define NS_KEY_RESERVED10       0x0020
248 #define NS_KEY_RESERVED11       0x0010
249 #define NS_KEY_SIGNATORYMASK    0x000F
250 #define NS_KEY_RESERVED_BITMASK ( NS_KEY_RESERVED2 | \
251                                   NS_KEY_RESERVED4 | \
252                                   NS_KEY_RESERVED5 | \
253                                   NS_KEY_RESERVED8 | \
254                                   NS_KEY_RESERVED9 | \
255                                   NS_KEY_RESERVED10 | \
256                                   NS_KEY_RESERVED11 )
257 #define NS_KEY_RESERVED_BITMASK2 0xFFFF
258 #define NS_ALG_MD5RSA           1
259 #define NS_ALG_DH               2
260 #define NS_ALG_DSA              3
261 #define NS_ALG_DSS              NS_ALG_DSA
262 #define NS_ALG_EXPIRE_ONLY      253
263 #define NS_ALG_PRIVATE_OID      254
264
265 #define NS_KEY_PROT_TLS         1
266 #define NS_KEY_PROT_EMAIL       2
267 #define NS_KEY_PROT_DNSSEC      3
268 #define NS_KEY_PROT_IPSEC       4
269 #define NS_KEY_PROT_ANY         255
270
271 #define NS_MD5RSA_MIN_BITS       512
272 #define NS_MD5RSA_MAX_BITS      4096
273 #define NS_MD5RSA_MAX_BYTES     ((NS_MD5RSA_MAX_BITS+7/8)*2+3)
274 #define NS_MD5RSA_MAX_BASE64    (((NS_MD5RSA_MAX_BYTES+2)/3)*4)
275 #define NS_MD5RSA_MIN_SIZE      ((NS_MD5RSA_MIN_BITS+7)/8)
276 #define NS_MD5RSA_MAX_SIZE      ((NS_MD5RSA_MAX_BITS+7)/8)
277
278 #define NS_DSA_SIG_SIZE         41
279 #define NS_DSA_MIN_SIZE         213
280 #define NS_DSA_MAX_BYTES        405
281
282 #define NS_SIG_TYPE     0
283 #define NS_SIG_ALG      2
284 #define NS_SIG_LABELS   3
285 #define NS_SIG_OTTL     4
286 #define NS_SIG_EXPIR    8
287 #define NS_SIG_SIGNED   12
288 #define NS_SIG_FOOT     16
289 #define NS_SIG_SIGNER   18
290 #define NS_NXT_BITS 8
291 #define NS_NXT_BIT_SET(  n,p) (p[(n)/NS_NXT_BITS] |=  (0x80>>((n)%NS_NXT_BITS)))
292 #define NS_NXT_BIT_CLEAR(n,p) (p[(n)/NS_NXT_BITS] &= ~(0x80>>((n)%NS_NXT_BITS)))
293 #define NS_NXT_BIT_ISSET(n,p) (p[(n)/NS_NXT_BITS] &   (0x80>>((n)%NS_NXT_BITS)))
294 #define NS_NXT_MAX 127
295
296 #define NS_OPT_DNSSEC_OK        0x8000U
297 #define NS_OPT_NSID             3
298
299 #define NS_GET16(s, cp) do { \
300         register const unsigned char *t_cp = (const unsigned char *)(cp); \
301         (s) = ((uint16_t)t_cp[0] << 8) \
302             | ((uint16_t)t_cp[1]) \
303             ; \
304         (cp) += NS_INT16SZ; \
305 } while (0)
306
307 #define NS_GET32(l, cp) do { \
308         register const unsigned char *t_cp = (const unsigned char *)(cp); \
309         (l) = ((uint32_t)t_cp[0] << 24) \
310             | ((uint32_t)t_cp[1] << 16) \
311             | ((uint32_t)t_cp[2] << 8) \
312             | ((uint32_t)t_cp[3]) \
313             ; \
314         (cp) += NS_INT32SZ; \
315 } while (0)
316
317 #define NS_PUT16(s, cp) do { \
318         register uint16_t t_s = (uint16_t)(s); \
319         register unsigned char *t_cp = (unsigned char *)(cp); \
320         *t_cp++ = t_s >> 8; \
321         *t_cp   = t_s; \
322         (cp) += NS_INT16SZ; \
323 } while (0)
324
325 #define NS_PUT32(l, cp) do { \
326         register uint32_t t_l = (uint32_t)(l); \
327         register unsigned char *t_cp = (unsigned char *)(cp); \
328         *t_cp++ = t_l >> 24; \
329         *t_cp++ = t_l >> 16; \
330         *t_cp++ = t_l >> 8; \
331         *t_cp   = t_l; \
332         (cp) += NS_INT32SZ; \
333 } while (0)
334
335
336
337
338 #define __BIND          19950621
339
340 typedef struct {
341         unsigned        id :16;
342 #if __BYTE_ORDER == __BIG_ENDIAN
343         unsigned        qr: 1;
344         unsigned        opcode: 4;
345         unsigned        aa: 1;
346         unsigned        tc: 1;
347         unsigned        rd: 1;
348         unsigned        ra: 1;
349         unsigned        unused :1;
350         unsigned        ad: 1;
351         unsigned        cd: 1;
352         unsigned        rcode :4;
353 #else
354         unsigned        rd :1;
355         unsigned        tc :1;
356         unsigned        aa :1;
357         unsigned        opcode :4;
358         unsigned        qr :1;
359         unsigned        rcode :4;
360         unsigned        cd: 1;
361         unsigned        ad: 1;
362         unsigned        unused :1;
363         unsigned        ra :1;
364 #endif
365         unsigned        qdcount :16;
366         unsigned        ancount :16;
367         unsigned        nscount :16;
368         unsigned        arcount :16;
369 } HEADER;
370
371 #define PACKETSZ        NS_PACKETSZ
372 #define MAXDNAME        NS_MAXDNAME
373 #define MAXCDNAME       NS_MAXCDNAME
374 #define MAXLABEL        NS_MAXLABEL
375 #define HFIXEDSZ        NS_HFIXEDSZ
376 #define QFIXEDSZ        NS_QFIXEDSZ
377 #define RRFIXEDSZ       NS_RRFIXEDSZ
378 #define INT32SZ         NS_INT32SZ
379 #define INT16SZ         NS_INT16SZ
380 #define INT8SZ          NS_INT8SZ
381 #define INADDRSZ        NS_INADDRSZ
382 #define IN6ADDRSZ       NS_IN6ADDRSZ
383 #define INDIR_MASK      NS_CMPRSFLGS
384 #define NAMESERVER_PORT NS_DEFAULTPORT
385
386 #define S_ZONE          ns_s_zn
387 #define S_PREREQ        ns_s_pr
388 #define S_UPDATE        ns_s_ud
389 #define S_ADDT          ns_s_ar
390
391 #define QUERY           ns_o_query
392 #define IQUERY          ns_o_iquery
393 #define STATUS          ns_o_status
394 #define NS_NOTIFY_OP    ns_o_notify
395 #define NS_UPDATE_OP    ns_o_update
396
397 #define NOERROR         ns_r_noerror
398 #define FORMERR         ns_r_formerr
399 #define SERVFAIL        ns_r_servfail
400 #define NXDOMAIN        ns_r_nxdomain
401 #define NOTIMP          ns_r_notimpl
402 #define REFUSED         ns_r_refused
403 #define YXDOMAIN        ns_r_yxdomain
404 #define YXRRSET         ns_r_yxrrset
405 #define NXRRSET         ns_r_nxrrset
406 #define NOTAUTH         ns_r_notauth
407 #define NOTZONE         ns_r_notzone
408
409 #define DELETE          ns_uop_delete
410 #define ADD             ns_uop_add
411
412 #define T_A             ns_t_a
413 #define T_NS            ns_t_ns
414 #define T_MD            ns_t_md
415 #define T_MF            ns_t_mf
416 #define T_CNAME         ns_t_cname
417 #define T_SOA           ns_t_soa
418 #define T_MB            ns_t_mb
419 #define T_MG            ns_t_mg
420 #define T_MR            ns_t_mr
421 #define T_NULL          ns_t_null
422 #define T_WKS           ns_t_wks
423 #define T_PTR           ns_t_ptr
424 #define T_HINFO         ns_t_hinfo
425 #define T_MINFO         ns_t_minfo
426 #define T_MX            ns_t_mx
427 #define T_TXT           ns_t_txt
428 #define T_RP            ns_t_rp
429 #define T_AFSDB         ns_t_afsdb
430 #define T_X25           ns_t_x25
431 #define T_ISDN          ns_t_isdn
432 #define T_RT            ns_t_rt
433 #define T_NSAP          ns_t_nsap
434 #define T_NSAP_PTR      ns_t_nsap_ptr
435 #define T_SIG           ns_t_sig
436 #define T_KEY           ns_t_key
437 #define T_PX            ns_t_px
438 #define T_GPOS          ns_t_gpos
439 #define T_AAAA          ns_t_aaaa
440 #define T_LOC           ns_t_loc
441 #define T_NXT           ns_t_nxt
442 #define T_EID           ns_t_eid
443 #define T_NIMLOC        ns_t_nimloc
444 #define T_SRV           ns_t_srv
445 #define T_ATMA          ns_t_atma
446 #define T_NAPTR         ns_t_naptr
447 #define T_A6            ns_t_a6
448 #define T_DNAME         ns_t_dname
449 #define T_TSIG          ns_t_tsig
450 #define T_IXFR          ns_t_ixfr
451 #define T_AXFR          ns_t_axfr
452 #define T_MAILB         ns_t_mailb
453 #define T_MAILA         ns_t_maila
454 #define T_ANY           ns_t_any
455
456 #define C_IN            ns_c_in
457 #define C_CHAOS         ns_c_chaos
458 #define C_HS            ns_c_hs
459 #define C_NONE          ns_c_none
460 #define C_ANY           ns_c_any
461
462 #define GETSHORT                NS_GET16
463 #define GETLONG                 NS_GET32
464 #define PUTSHORT                NS_PUT16
465 #define PUTLONG                 NS_PUT32
466
467 #endif