Deleted Added
full compact
nameser.h (23037) nameser.h (36888)
1/*
2 * Copyright (c) 1983, 1989, 1993
1/*
2 * Copyright (c) 1983, 1989, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34/*
35 * Copyright (c) 1996 by Internet Software Consortium.
32 *
36 *
33 * -
34 * Portions Copyright (c) 1993 by Digital Equipment Corporation.
35 *
36 * Permission to use, copy, modify, and distribute this software for any
37 * purpose with or without fee is hereby granted, provided that the above
37 * Permission to use, copy, modify, and distribute this software for any
38 * purpose with or without fee is hereby granted, provided that the above
38 * copyright notice and this permission notice appear in all copies, and that
39 * the name of Digital Equipment Corporation not be used in advertising or
40 * publicity pertaining to distribution of the document or software without
41 * specific, written prior permission.
39 * copyright notice and this permission notice appear in all copies.
42 *
40 *
43 * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
44 * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
45 * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
46 * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
41 * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
42 * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
43 * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
44 * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
47 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
48 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
49 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
50 * SOFTWARE.
45 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
46 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
47 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
48 * SOFTWARE.
51 * -
52 * Portions Copyright (c) 1995 by International Business Machines, Inc.
53 *
54 * International Business Machines, Inc. (hereinafter called IBM) grants
55 * permission under its copyrights to use, copy, modify, and distribute this
56 * Software with or without fee, provided that the above copyright notice and
57 * all paragraphs of this notice appear in all copies, and that the name of IBM
58 * not be used in connection with the marketing of any product incorporating
59 * the Software or modifications thereof, without specific, written prior
60 * permission.
61 *
62 * To the extent it has a right to do so, IBM grants an immunity from suit
63 * under its patents, if any, for the use, sale or manufacture of products to
64 * the extent that such products are used for performing Domain Name System
65 * dynamic updates in TCP/IP networks by means of the Software. No immunity is
66 * granted for any product per se or for any other function of any product.
67 * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
68 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
69 * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
70 * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
71 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
72 * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
73 *
74 * @(#)nameser.h 8.2 (Berkeley) 2/16/94
75 * From Id: nameser.h,v 8.11 1996/10/08 04:51:02 vixie Exp
49 */
50
51/*
52 * From: Id: nameser.h,v 8.16 1998/02/06 00:35:58 halley Exp
76 * $Id$
77 */
78
79#ifndef _ARPA_NAMESER_H_
53 * $Id$
54 */
55
56#ifndef _ARPA_NAMESER_H_
80#define _ARPA_NAMESER_H_
57#define _ARPA_NAMESER_H_
81
58
82#include <sys/param.h>
59#define BIND_4_COMPAT
60
83#include <sys/types.h>
84#include <sys/cdefs.h>
85
61#include <sys/types.h>
62#include <sys/cdefs.h>
63
86
87/*
88 * revision information. this is the release date in YYYYMMDD format.
89 * it can change every day so the right thing to do with it is use it
64/*
65 * revision information. this is the release date in YYYYMMDD format.
66 * it can change every day so the right thing to do with it is use it
90 * in preprocessor commands such as "#if (__BIND > 19931104)". do not
91 * compare for equality; rather, use it to determine whether your resolver
67 * in preprocessor commands such as "#if (__NAMESER > 19931104)". do not
68 * compare for equality; rather, use it to determine whether your libnameser.a
92 * is new enough to contain a certain feature.
93 */
94
69 * is new enough to contain a certain feature.
70 */
71
95#define __BIND 19960801 /* interface version stamp */
72/* XXXRTH I made this bigger than __BIND in 4.9.5 T6B */
73#define __NAMESER 19961001 /* New interface version stamp. */
96
97/*
74
75/*
98 * Define constants based on rfc883
76 * Define constants based on RFC 883, RFC 1034, RFC 1035
99 */
77 */
100#define PACKETSZ 512 /* maximum packet size */
101#define MAXDNAME 1025 /* maximum presentation domain name */
102#define MAXCDNAME 255 /* maximum compressed domain name */
103#define MAXLABEL 63 /* maximum length of domain label */
104#define HFIXEDSZ 12 /* #/bytes of fixed data in header */
105#define QFIXEDSZ 4 /* #/bytes of fixed data in query */
106#define RRFIXEDSZ 10 /* #/bytes of fixed data in r record */
107#define INT32SZ 4 /* for systems without 32-bit ints */
108#define INT16SZ 2 /* for systems without 16-bit ints */
109#define INADDRSZ 4 /* IPv4 T_A */
110#define IN6ADDRSZ 16 /* IPv6 T_AAAA */
78#define NS_PACKETSZ 512 /* maximum packet size */
79#define NS_MAXDNAME 1025 /* maximum domain name */
80#define NS_MAXCDNAME 255 /* maximum compressed domain name */
81#define NS_MAXLABEL 63 /* maximum length of domain label */
82#define NS_HFIXEDSZ 12 /* #/bytes of fixed data in header */
83#define NS_QFIXEDSZ 4 /* #/bytes of fixed data in query */
84#define NS_RRFIXEDSZ 10 /* #/bytes of fixed data in r record */
85#define NS_INT32SZ 4 /* #/bytes of data in a u_int32_t */
86#define NS_INT16SZ 2 /* #/bytes of data in a u_int16_t */
87#define NS_INT8SZ 1 /* #/bytes of data in a u_int8_t */
88#define NS_INADDRSZ 4 /* IPv4 T_A */
89#define NS_IN6ADDRSZ 16 /* IPv6 T_AAAA */
90#define NS_CMPRSFLGS 0xc0 /* Flag bits indicating name compression. */
91#define NS_DEFAULTPORT 53 /* For both TCP and UDP. */
111
112/*
92
93/*
113 * Internet nameserver port number
94 * These can be expanded with synonyms, just keep ns_parse.c:ns_parserecord()
95 * in synch with it.
114 */
96 */
115#define NAMESERVER_PORT 53
97typedef enum __ns_sect {
98 ns_s_qd = 0, /* Query: Question. */
99 ns_s_zn = 0, /* Update: Zone. */
100 ns_s_an = 1, /* Query: Answer. */
101 ns_s_pr = 1, /* Update: Prerequisites. */
102 ns_s_ns = 2, /* Query: Name servers. */
103 ns_s_ud = 2, /* Update: Update. */
104 ns_s_ar = 3, /* Query|Update: Additional records. */
105 ns_s_max = 4
106} ns_sect;
116
117/*
107
108/*
118 * Currently defined opcodes
109 * This is a message handle. It is caller allocated and has no dynamic data.
110 * This structure is intended to be opaque to all but ns_parse.c, thus the
111 * leading _'s on the member names. Use the accessor functions, not the _'s.
119 */
112 */
120#define QUERY 0x0 /* standard query */
121#define IQUERY 0x1 /* inverse query */
122#define STATUS 0x2 /* nameserver status query */
123/*#define xxx 0x3 */ /* 0x3 reserved */
124#define NS_NOTIFY_OP 0x4 /* notify secondary of SOA change */
113typedef struct __ns_msg {
114 const u_char *_msg, *_eom;
115 u_int16_t _id, _flags, _counts[ns_s_max];
116 const u_char *_sections[ns_s_max];
117 ns_sect _sect;
118 int _rrnum;
119 const u_char *_ptr;
120} ns_msg;
121
122/* Private data structure - do not use from outside library. */
123struct _ns_flagdata { int mask, shift; };
124extern struct _ns_flagdata _ns_flagdata[];
125
126/* Accessor macros - this is part of the public interface. */
127#define ns_msg_getflag(handle, flag) ( \
128 ((handle)._flags & _ns_flagdata[flag].mask) \
129 >> _ns_flagdata[flag].shift \
130 )
131#define ns_msg_id(handle) ((handle)._id + 0)
132#define ns_msg_base(handle) ((handle)._msg + 0)
133#define ns_msg_end(handle) ((handle)._eom + 0)
134#define ns_msg_size(handle) ((handle)._eom - (handle)._msg)
135#define ns_msg_count(handle, section) ((handle)._counts[section] + 0)
136
125/*
137/*
126 * Currently defined response codes
138 * This is a parsed record. It is caller allocated and has no dynamic data.
127 */
139 */
128#define NOERROR 0 /* no error */
129#define FORMERR 1 /* format error */
130#define SERVFAIL 2 /* server failure */
131#define NXDOMAIN 3 /* non existent domain */
132#define NOTIMP 4 /* not implemented */
133#define REFUSED 5 /* query refused */
140typedef struct __ns_rr {
141 char name[NS_MAXDNAME]; /* XXX need to malloc */
142 u_int16_t type;
143 u_int16_t class;
144 u_int32_t ttl;
145 u_int16_t rdlength;
146 const u_char *rdata;
147} ns_rr;
134
148
149/* Accessor macros - this is part of the public interface. */
150#define ns_rr_name(rr) (((rr).name[0] != '\0') ? (rr).name : ".")
151#define ns_rr_type(rr) ((rr).type + 0)
152#define ns_rr_class(rr) ((rr).class + 0)
153#define ns_rr_ttl(rr) ((rr).ttl + 0)
154#define ns_rr_rdlen(rr) ((rr).rdlength + 0)
155#define ns_rr_rdata(rr) ((rr).rdata + 0)
156
135/*
157/*
136 * Type values for resources and queries
158 * These don't have to be in the same order as in the packet flags word,
159 * and they can even overlap in some cases, but they will need to be kept
160 * in synch with ns_parse.c:ns_flagdata[].
137 */
161 */
138#define T_A 1 /* host address */
139#define T_NS 2 /* authoritative server */
140#define T_MD 3 /* mail destination */
141#define T_MF 4 /* mail forwarder */
142#define T_CNAME 5 /* canonical name */
143#define T_SOA 6 /* start of authority zone */
144#define T_MB 7 /* mailbox domain name */
145#define T_MG 8 /* mail group member */
146#define T_MR 9 /* mail rename name */
147#define T_NULL 10 /* null resource record */
148#define T_WKS 11 /* well known service */
149#define T_PTR 12 /* domain name pointer */
150#define T_HINFO 13 /* host information */
151#define T_MINFO 14 /* mailbox information */
152#define T_MX 15 /* mail routing information */
153#define T_TXT 16 /* text strings */
154#define T_RP 17 /* responsible person */
155#define T_AFSDB 18 /* AFS cell database */
156#define T_X25 19 /* X_25 calling address */
157#define T_ISDN 20 /* ISDN calling address */
158#define T_RT 21 /* router */
159#define T_NSAP 22 /* NSAP address */
160#define T_NSAP_PTR 23 /* reverse NSAP lookup (deprecated) */
161#define T_SIG 24 /* security signature */
162#define T_KEY 25 /* security key */
163#define T_PX 26 /* X.400 mail mapping */
164#define T_GPOS 27 /* geographical position (withdrawn) */
165#define T_AAAA 28 /* IP6 Address */
166#define T_LOC 29 /* Location Information */
167#define T_NXT 30 /* Next Valid Name in Zone */
168#define T_EID 31 /* Endpoint identifier */
169#define T_NIMLOC 32 /* Nimrod locator */
170#define T_SRV 33 /* Server selection */
171#define T_ATMA 34 /* ATM Address */
172#define T_NAPTR 35 /* Naming Authority PoinTeR */
173 /* non standard */
174#define T_UINFO 100 /* user (finger) information */
175#define T_UID 101 /* user ID */
176#define T_GID 102 /* group ID */
177#define T_UNSPEC 103 /* Unspecified format (binary data) */
178 /* Query type values which do not appear in resource records */
179#define T_IXFR 251 /* incremental zone transfer */
180#define T_AXFR 252 /* transfer zone of authority */
181#define T_MAILB 253 /* transfer mailbox records */
182#define T_MAILA 254 /* transfer mail agent records */
183#define T_ANY 255 /* wildcard match */
162typedef enum __ns_flag {
163 ns_f_qr, /* Question/Response. */
164 ns_f_opcode, /* Operation code. */
165 ns_f_aa, /* Authoritative Answer. */
166 ns_f_tc, /* Truncation occurred. */
167 ns_f_rd, /* Recursion Desired. */
168 ns_f_ra, /* Recursion Available. */
169 ns_f_z, /* MBZ. */
170 ns_f_ad, /* Authentic Data (DNSSEC). */
171 ns_f_cd, /* Checking Disabled (DNSSEC). */
172 ns_f_rcode, /* Response code. */
173 ns_f_max
174} ns_flag;
184
185/*
175
176/*
186 * Values for class field
177 * Currently defined opcodes.
187 */
178 */
179typedef enum __ns_opcode {
180 ns_o_query = 0, /* Standard query. */
181 ns_o_iquery = 1, /* Inverse query (deprecated/unsupported). */
182 ns_o_status = 2, /* Name server status query (unsupported). */
183 /* Opcode 3 is undefined/reserved. */
184 ns_o_notify = 4, /* Zone change notification. */
185 ns_o_update = 5, /* Zone update message. */
186 ns_o_max = 6
187} ns_opcode;
188
188
189#define C_IN 1 /* the arpa internet */
190#define C_CHAOS 3 /* for chaos net (MIT) */
191#define C_HS 4 /* for Hesiod name server (MIT) (XXX) */
189/*
190 * Currently defined response codes.
191 */
192typedef enum __ns_rcode {
193 ns_r_noerror = 0, /* No error occurred. */
194 ns_r_formerr = 1, /* Format error. */
195 ns_r_servfail = 2, /* Server failure. */
196 ns_r_nxdomain = 3, /* Name error. */
197 ns_r_notimpl = 4, /* Unimplemented. */
198 ns_r_refused = 5, /* Operation refused. */
199 /* these are for BIND_UPDATE */
200 ns_r_yxdomain = 6, /* Name exists */
201 ns_r_yxrrset = 7, /* RRset exists */
202 ns_r_nxrrset = 8, /* RRset does not exist */
203 ns_r_notauth = 9, /* Not authoritative for zone */
204 ns_r_notzone = 10, /* Zone of record different from zone section */
205 ns_r_max = 11
206} ns_rcode;
207
208/* BIND_UPDATE */
209typedef enum __ns_update_operation {
210 ns_uop_delete = 0,
211 ns_uop_add = 1,
212 ns_uop_max = 2
213} ns_update_operation;
214
215/*
216 * This RR-like structure is particular to UPDATE.
217 */
218struct ns_updrec {
219 struct ns_updrec *r_prev; /* prev record */
220 struct ns_updrec *r_next; /* next record */
221 u_int8_t r_section; /* ZONE/PREREQUISITE/UPDATE */
222 char * r_dname; /* owner of the RR */
223 u_int16_t r_class; /* class number */
224 u_int16_t r_type; /* type number */
225 u_int32_t r_ttl; /* time to live */
226 u_char * r_data; /* rdata fields as text string */
227 u_int16_t r_size; /* size of r_data field */
228 int r_opcode; /* type of operation */
229 /* following fields for private use by the resolver/server routines */
230 struct ns_updrec *r_grpnext; /* next record when grouped */
231 struct databuf *r_dp; /* databuf to process */
232 struct databuf *r_deldp; /* databuf's deleted/overwritten */
233 u_int16_t r_zone; /* zone number on server */
234};
235typedef struct ns_updrec ns_updrec;
236
237/*
238 * Currently defined type values for resources and queries.
239 */
240typedef enum __ns_type {
241 ns_t_a = 1, /* Host address. */
242 ns_t_ns = 2, /* Authoritative server. */
243 ns_t_md = 3, /* Mail destination. */
244 ns_t_mf = 4, /* Mail forwarder. */
245 ns_t_cname = 5, /* Canonical name. */
246 ns_t_soa = 6, /* Start of authority zone. */
247 ns_t_mb = 7, /* Mailbox domain name. */
248 ns_t_mg = 8, /* Mail group member. */
249 ns_t_mr = 9, /* Mail rename name. */
250 ns_t_null = 10, /* Null resource record. */
251 ns_t_wks = 11, /* Well known service. */
252 ns_t_ptr = 12, /* Domain name pointer. */
253 ns_t_hinfo = 13, /* Host information. */
254 ns_t_minfo = 14, /* Mailbox information. */
255 ns_t_mx = 15, /* Mail routing information. */
256 ns_t_txt = 16, /* Text strings. */
257 ns_t_rp = 17, /* Responsible person. */
258 ns_t_afsdb = 18, /* AFS cell database. */
259 ns_t_x25 = 19, /* X_25 calling address. */
260 ns_t_isdn = 20, /* ISDN calling address. */
261 ns_t_rt = 21, /* Router. */
262 ns_t_nsap = 22, /* NSAP address. */
263 ns_t_nsap_ptr = 23, /* Reverse NSAP lookup (deprecated). */
264 ns_t_sig = 24, /* Security signature. */
265 ns_t_key = 25, /* Security key. */
266 ns_t_px = 26, /* X.400 mail mapping. */
267 ns_t_gpos = 27, /* Geographical position (withdrawn). */
268 ns_t_aaaa = 28, /* Ip6 Address. */
269 ns_t_loc = 29, /* Location Information. */
270 ns_t_nxt = 30, /* Next domain (security). */
271 ns_t_eid = 31, /* Endpoint identifier. */
272 ns_t_nimloc = 32, /* Nimrod Locator. */
273 ns_t_srv = 33, /* Server Selection. */
274 ns_t_atma = 34, /* ATM Address */
275 ns_t_naptr = 35, /* Naming Authority PoinTeR */
276 /* Query type values which do not appear in resource records. */
277 ns_t_ixfr = 251, /* Incremental zone transfer. */
278 ns_t_axfr = 252, /* Transfer zone of authority. */
279 ns_t_mailb = 253, /* Transfer mailbox records. */
280 ns_t_maila = 254, /* Transfer mail agent records. */
281 ns_t_any = 255, /* Wildcard match. */
282 ns_t_max = 65536
283} ns_type;
284
285/*
286 * Values for class field
287 */
288typedef enum __ns_class {
289 ns_c_in = 1, /* Internet. */
290 /* Class 2 unallocated/unsupported. */
291 ns_c_chaos = 3, /* MIT Chaos-net. */
292 ns_c_hs = 4, /* MIT Hesiod. */
192 /* Query class values which do not appear in resource records */
293 /* Query class values which do not appear in resource records */
193#define C_ANY 255 /* wildcard match */
294 ns_c_none = 254, /* for prereq. sections in update requests */
295 ns_c_any = 255, /* Wildcard match. */
296 ns_c_max = 65536
297} ns_class;
194
195/*
196 * Flags field of the KEY RR rdata
197 */
298
299/*
300 * Flags field of the KEY RR rdata
301 */
198#define KEYFLAG_TYPEMASK 0xC000 /* Mask for "type" bits */
199#define KEYFLAG_TYPE_AUTH_CONF 0x0000 /* Key usable for both */
200#define KEYFLAG_TYPE_CONF_ONLY 0x8000 /* Key usable for confidentiality */
201#define KEYFLAG_TYPE_AUTH_ONLY 0x4000 /* Key usable for authentication */
202#define KEYFLAG_TYPE_NO_KEY 0xC000 /* No key usable for either; no key */
302#define NS_KEY_TYPEMASK 0xC000 /* Mask for "type" bits */
303#define NS_KEY_TYPE_AUTH_CONF 0x0000 /* Key usable for both */
304#define NS_KEY_TYPE_CONF_ONLY 0x8000 /* Key usable for confidentiality */
305#define NS_KEY_TYPE_AUTH_ONLY 0x4000 /* Key usable for authentication */
306#define NS_KEY_TYPE_NO_KEY 0xC000 /* No key usable for either; no key */
203/* The type bits can also be interpreted independently, as single bits: */
307/* The type bits can also be interpreted independently, as single bits: */
204#define KEYFLAG_NO_AUTH 0x8000 /* Key not usable for authentication */
205#define KEYFLAG_NO_CONF 0x4000 /* Key not usable for confidentiality */
308#define NS_KEY_NO_AUTH 0x8000 /* Key unusable for authentication */
309#define NS_KEY_NO_CONF 0x4000 /* Key unusable for confidentiality */
310#define NS_KEY_EXPERIMENTAL 0x2000 /* Security is *mandatory* if bit=0 */
311#define NS_KEY_RESERVED3 0x1000 /* reserved - must be zero */
312#define NS_KEY_RESERVED4 0x0800 /* reserved - must be zero */
313#define NS_KEY_USERACCOUNT 0x0400 /* key is assoc. with a user acct */
314#define NS_KEY_ENTITY 0x0200 /* key is assoc. with entity eg host */
315#define NS_KEY_ZONEKEY 0x0100 /* key is zone key */
316#define NS_KEY_IPSEC 0x0080 /* key is for IPSEC (host or user)*/
317#define NS_KEY_EMAIL 0x0040 /* key is for email (MIME security) */
318#define NS_KEY_RESERVED10 0x0020 /* reserved - must be zero */
319#define NS_KEY_RESERVED11 0x0010 /* reserved - must be zero */
320#define NS_KEY_SIGNATORYMASK 0x000F /* key can sign RR's of same name */
206
321
207#define KEYFLAG_EXPERIMENTAL 0x2000 /* Security is *mandatory* if bit=0 */
208#define KEYFLAG_RESERVED3 0x1000 /* reserved - must be zero */
209#define KEYFLAG_RESERVED4 0x0800 /* reserved - must be zero */
210#define KEYFLAG_USERACCOUNT 0x0400 /* key is assoc. with a user acct */
211#define KEYFLAG_ENTITY 0x0200 /* key is assoc. with entity eg host */
212#define KEYFLAG_ZONEKEY 0x0100 /* key is zone key for the zone named */
213#define KEYFLAG_IPSEC 0x0080 /* key is for IPSEC use (host or user)*/
214#define KEYFLAG_EMAIL 0x0040 /* key is for email (MIME security) */
215#define KEYFLAG_RESERVED10 0x0020 /* reserved - must be zero */
216#define KEYFLAG_RESERVED11 0x0010 /* reserved - must be zero */
217#define KEYFLAG_SIGNATORYMASK 0x000F /* key can sign DNS RR's of same name */
322#define NS_KEY_RESERVED_BITMASK ( NS_KEY_RESERVED3 | \
323 NS_KEY_RESERVED4 | \
324 NS_KEY_RESERVED10 | \
325 NS_KEY_RESERVED11 )
218
326
219#define KEYFLAG_RESERVED_BITMASK ( KEYFLAG_RESERVED3 | \
220 KEYFLAG_RESERVED4 | \
221 KEYFLAG_RESERVED10| KEYFLAG_RESERVED11)
222
223/* The Algorithm field of the KEY and SIG RR's is an integer, {1..254} */
327/* The Algorithm field of the KEY and SIG RR's is an integer, {1..254} */
224#define ALGORITHM_MD5RSA 1 /* MD5 with RSA */
225#define ALGORITHM_EXPIRE_ONLY 253 /* No alg, no security */
226#define ALGORITHM_PRIVATE_OID 254 /* Key begins with OID indicating alg */
328#define NS_ALG_MD5RSA 1 /* MD5 with RSA */
329#define NS_ALG_EXPIRE_ONLY 253 /* No alg, no security */
330#define NS_ALG_PRIVATE_OID 254 /* Key begins with OID giving alg */
227
228/* Signatures */
331
332/* Signatures */
229 /* Size of a mod or exp in bits */
230#define MIN_MD5RSA_KEY_PART_BITS 512
231#define MAX_MD5RSA_KEY_PART_BITS 2552
232 /* Total of binary mod and exp, bytes */
233#define MAX_MD5RSA_KEY_BYTES ((MAX_MD5RSA_KEY_PART_BITS+7/8)*2+3)
234 /* Max length of text sig block */
235#define MAX_KEY_BASE64 (((MAX_MD5RSA_KEY_BYTES+2)/3)*4)
333#define NS_MD5RSA_MIN_BITS 512 /* Size of a mod or exp in bits */
334#define NS_MD5RSA_MAX_BITS 2552
335 /* Total of binary mod and exp */
336#define NS_MD5RSA_MAX_BYTES ((NS_MD5RSA_MAX_BITS+7/8)*2+3)
337 /* Max length of text sig block */
338#define NS_MD5RSA_MAX_BASE64 (((NS_MD5RSA_MAX_BYTES+2)/3)*4)
236
339
237/*
238 * Status return codes for T_UNSPEC conversion routines
239 */
240#define CONV_SUCCESS 0
241#define CONV_OVERFLOW (-1)
242#define CONV_BADFMT (-2)
243#define CONV_BADCKSUM (-3)
244#define CONV_BADBUFLEN (-4)
340/* Offsets into SIG record rdata to find various values */
341#define NS_SIG_TYPE 0 /* Type flags */
342#define NS_SIG_ALG 2 /* Algorithm */
343#define NS_SIG_LABELS 3 /* How many labels in name */
344#define NS_SIG_OTTL 4 /* Original TTL */
345#define NS_SIG_EXPIR 8 /* Expiration time */
346#define NS_SIG_SIGNED 12 /* Signature time */
347#define NS_SIG_FOOT 16 /* Key footprint */
348#define NS_SIG_SIGNER 18 /* Domain name of who signed it */
245
349
246#include <machine/endian.h>
350/* How RR types are represented as bit-flags in NXT records */
351#define NS_NXT_BITS 8
352#define NS_NXT_BIT_SET( n,p) (p[(n)/NS_NXT_BITS] |= (0x80>>((n)%NS_NXT_BITS)))
353#define NS_NXT_BIT_CLEAR(n,p) (p[(n)/NS_NXT_BITS] &= ~(0x80>>((n)%NS_NXT_BITS)))
354#define NS_NXT_BIT_ISSET(n,p) (p[(n)/NS_NXT_BITS] & (0x80>>((n)%NS_NXT_BITS)))
247
355
248/*
249 * Structure for query header. The order of the fields is machine- and
250 * compiler-dependent, depending on the byte/bit order and the layout
251 * of bit fields. We use bit fields only in int variables, as this
252 * is all ANSI requires. This requires a somewhat confusing rearrangement.
253 */
254
356
255typedef struct {
256 unsigned id :16; /* query identification number */
257#if BYTE_ORDER == BIG_ENDIAN
258 /* fields in third byte */
259 unsigned qr: 1; /* response flag */
260 unsigned opcode: 4; /* purpose of message */
261 unsigned aa: 1; /* authoritative answer */
262 unsigned tc: 1; /* truncated message */
263 unsigned rd: 1; /* recursion desired */
264 /* fields in fourth byte */
265 unsigned ra: 1; /* recursion available */
266 unsigned unused :1; /* unused bits (MBZ as of 4.9.3a3) */
267 unsigned ad: 1; /* authentic data from named */
268 unsigned cd: 1; /* checking disabled by resolver */
269 unsigned rcode :4; /* response code */
270#endif
271#if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN
272 /* fields in third byte */
273 unsigned rd :1; /* recursion desired */
274 unsigned tc :1; /* truncated message */
275 unsigned aa :1; /* authoritative answer */
276 unsigned opcode :4; /* purpose of message */
277 unsigned qr :1; /* response flag */
278 /* fields in fourth byte */
279 unsigned rcode :4; /* response code */
280 unsigned cd: 1; /* checking disabled by resolver */
281 unsigned ad: 1; /* authentic data from named */
282 unsigned unused :1; /* unused bits (MBZ as of 4.9.3a3) */
283 unsigned ra :1; /* recursion available */
284#endif
285 /* remaining bytes */
286 unsigned qdcount :16; /* number of question entries */
287 unsigned ancount :16; /* number of answer entries */
288 unsigned nscount :16; /* number of authority entries */
289 unsigned arcount :16; /* number of resource entries */
290} HEADER;
291
292/*
357/*
293 * Defines for handling compressed domain names
294 */
295#define INDIR_MASK 0xc0
296
297extern u_int16_t _getshort __P((const u_char *));
298extern u_int32_t _getlong __P((const u_char *));
299
300/*
301 * Inline versions of get/put short/long. Pointer is advanced.
358 * Inline versions of get/put short/long. Pointer is advanced.
302 *
303 * These macros demonstrate the property of C whereby it can be
304 * portable or it can be elegant but rarely both.
305 */
359 */
306#define GETSHORT(s, cp) { \
360#define NS_GET16(s, cp) { \
307 register u_char *t_cp = (u_char *)(cp); \
308 (s) = ((u_int16_t)t_cp[0] << 8) \
309 | ((u_int16_t)t_cp[1]) \
310 ; \
361 register u_char *t_cp = (u_char *)(cp); \
362 (s) = ((u_int16_t)t_cp[0] << 8) \
363 | ((u_int16_t)t_cp[1]) \
364 ; \
311 (cp) += INT16SZ; \
365 (cp) += NS_INT16SZ; \
312}
313
366}
367
314#define GETLONG(l, cp) { \
368#define NS_GET32(l, cp) { \
315 register u_char *t_cp = (u_char *)(cp); \
316 (l) = ((u_int32_t)t_cp[0] << 24) \
317 | ((u_int32_t)t_cp[1] << 16) \
318 | ((u_int32_t)t_cp[2] << 8) \
319 | ((u_int32_t)t_cp[3]) \
320 ; \
369 register u_char *t_cp = (u_char *)(cp); \
370 (l) = ((u_int32_t)t_cp[0] << 24) \
371 | ((u_int32_t)t_cp[1] << 16) \
372 | ((u_int32_t)t_cp[2] << 8) \
373 | ((u_int32_t)t_cp[3]) \
374 ; \
321 (cp) += INT32SZ; \
375 (cp) += NS_INT32SZ; \
322}
323
376}
377
324#define PUTSHORT(s, cp) { \
378#define NS_PUT16(s, cp) { \
325 register u_int16_t t_s = (u_int16_t)(s); \
326 register u_char *t_cp = (u_char *)(cp); \
327 *t_cp++ = t_s >> 8; \
328 *t_cp = t_s; \
379 register u_int16_t t_s = (u_int16_t)(s); \
380 register u_char *t_cp = (u_char *)(cp); \
381 *t_cp++ = t_s >> 8; \
382 *t_cp = t_s; \
329 (cp) += INT16SZ; \
383 (cp) += NS_INT16SZ; \
330}
331
384}
385
332#define PUTLONG(l, cp) { \
386#define NS_PUT32(l, cp) { \
333 register u_int32_t t_l = (u_int32_t)(l); \
334 register u_char *t_cp = (u_char *)(cp); \
335 *t_cp++ = t_l >> 24; \
336 *t_cp++ = t_l >> 16; \
337 *t_cp++ = t_l >> 8; \
338 *t_cp = t_l; \
387 register u_int32_t t_l = (u_int32_t)(l); \
388 register u_char *t_cp = (u_char *)(cp); \
389 *t_cp++ = t_l >> 24; \
390 *t_cp++ = t_l >> 16; \
391 *t_cp++ = t_l >> 8; \
392 *t_cp = t_l; \
339 (cp) += INT32SZ; \
393 (cp) += NS_INT32SZ; \
340}
341
394}
395
396/*
397 * ANSI C identifier hiding.
398 */
399#define ns_get16 __ns_get16
400#define ns_get32 __ns_get32
401#define ns_put16 __ns_put16
402#define ns_put32 __ns_put32
403#define ns_initparse __ns_initparse
404#define ns_parserr __ns_parserr
405#define ns_sprintrr __ns_sprintrr
406#define ns_sprintrrf __ns_sprintrrf
407#define ns_format_ttl __ns_format_ttl
408#define ns_parse_ttl __ns_parse_ttl
409#define ns_name_ntop __ns_name_ntop
410#define ns_name_pton __ns_name_pton
411#define ns_name_unpack __ns_name_unpack
412#define ns_name_pack __ns_name_pack
413#define ns_name_compress __ns_name_compress
414#define ns_name_uncompress __ns_name_uncompress
415
416__BEGIN_DECLS
417u_int ns_get16 __P((const u_char *));
418u_long ns_get32 __P((const u_char *));
419void ns_put16 __P((u_int, u_char *));
420void ns_put32 __P((u_long, u_char *));
421int ns_initparse __P((const u_char *, int, ns_msg *));
422int ns_parserr __P((ns_msg *, ns_sect, int, ns_rr *));
423int ns_sprintrr __P((const ns_msg *, const ns_rr *,
424 const char *, const char *, char *, size_t));
425int ns_sprintrrf __P((const u_char *, size_t, const char *,
426 ns_class, ns_type, u_long, const u_char *,
427 size_t, const char *, const char *,
428 char *, size_t));
429int ns_format_ttl __P((u_long, char *, size_t));
430int ns_parse_ttl __P((const char *, u_long *));
431int ns_name_ntop __P((const u_char *, char *, size_t));
432int ns_name_pton __P((const char *, u_char *, size_t));
433int ns_name_unpack __P((const u_char *, const u_char *,
434 const u_char *, u_char *, size_t));
435int ns_name_pack __P((const u_char *, u_char *, int,
436 const u_char **, const u_char **));
437int ns_name_uncompress __P((const u_char *, const u_char *,
438 const u_char *, char *, size_t));
439int ns_name_compress __P((const char *, u_char *, size_t,
440 const u_char **, const u_char **));
441int ns_name_skip __P((const u_char **, const u_char *));
442__END_DECLS
443
444#ifdef BIND_4_COMPAT
445#include <arpa/nameser_compat.h>
446#endif
447
342#endif /* !_ARPA_NAMESER_H_ */
448#endif /* !_ARPA_NAMESER_H_ */