Remove advertising clause of copyright.
[kopensolaris-gnu/glibc.git] / resolv / arpa / nameser.h
1 /*
2  * ++Copyright++ 1983, 1989, 1993
3  * -
4  * Copyright (c) 1983, 1989, 1993
5  *    The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *      This product includes software developed by the University of
18  *      California, Berkeley and its contributors.
19  * 4. Neither the name of the University nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  * -
35  * Portions Copyright (c) 1993 by Digital Equipment Corporation.
36  *
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
39  * copyright notice and this permission notice appear in all copies, and that
40  * the name of Digital Equipment Corporation not be used in advertising or
41  * publicity pertaining to distribution of the document or software without
42  * specific, written prior permission.
43  *
44  * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
45  * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
46  * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
47  * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
48  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
49  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
50  * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
51  * SOFTWARE.
52  * -
53  * Portions Copyright (c) 1995 by International Business Machines, Inc.
54  *
55  * International Business Machines, Inc. (hereinafter called IBM) grants
56  * permission under its copyrights to use, copy, modify, and distribute this
57  * Software with or without fee, provided that the above copyright notice and
58  * all paragraphs of this notice appear in all copies, and that the name of IBM
59  * not be used in connection with the marketing of any product incorporating
60  * the Software or modifications thereof, without specific, written prior
61  * permission.
62  *
63  * To the extent it has a right to do so, IBM grants an immunity from suit
64  * under its patents, if any, for the use, sale or manufacture of products to
65  * the extent that such products are used for performing Domain Name System
66  * dynamic updates in TCP/IP networks by means of the Software.  No immunity is
67  * granted for any product per se or for any other function of any product.
68  *
69  * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
70  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
71  * PARTICULAR PURPOSE.  IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
72  * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
73  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
74  * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
75  * --Copyright--
76  */
77
78 /*
79  *      @(#)nameser.h   8.1 (Berkeley) 6/2/93
80  *      $Id$
81  */
82
83 #ifndef _ARPA_NAMESER_H
84 #define _ARPA_NAMESER_H 1
85
86 #include <features.h>
87 #include <sys/param.h>
88 #include <sys/types.h>
89
90 /*
91  * revision information.  this is the release date in YYYYMMDD format.
92  * it can change every day so the right thing to do with it is use it
93  * in preprocessor commands such as "#if (__BIND > 19931104)".  do not
94  * compare for equality; rather, use it to determine whether your resolver
95  * is new enough to contain a certain feature.
96  */
97
98 #define __BIND          19960801        /* interface version stamp */
99
100 /*
101  * Define constants based on rfc883
102  */
103 #define PACKETSZ        512             /* maximum packet size */
104 #define MAXDNAME        1025            /* maximum domain name */
105 #define MAXCDNAME       255             /* maximum compressed domain name */
106 #define MAXLABEL        63              /* maximum length of domain label */
107 #define HFIXEDSZ        12              /* #/bytes of fixed data in header */
108 #define QFIXEDSZ        4               /* #/bytes of fixed data in query */
109 #define RRFIXEDSZ       10              /* #/bytes of fixed data in r record */
110 #define INT32SZ         4               /* for systems without 32-bit ints */
111 #define INT16SZ         2               /* for systems without 16-bit ints */
112 #define INADDRSZ        4               /* IPv4 T_A */
113 #define IN6ADDRSZ       16              /* IPv6 T_AAAA */
114
115 /*
116  * Internet nameserver port number
117  */
118 #define NAMESERVER_PORT 53
119
120 /*
121  * Currently defined opcodes
122  */
123 #define QUERY           0x0             /* standard query */
124 #define IQUERY          0x1             /* inverse query */
125 #define STATUS          0x2             /* nameserver status query */
126 /*#define xxx           0x3*/           /* 0x3 reserved */
127 #define NS_NOTIFY_OP    0x4             /* notify secondary of SOA change */
128 /*
129  * Currently defined response codes
130  */
131 #define NOERROR         0               /* no error */
132 #define FORMERR         1               /* format error */
133 #define SERVFAIL        2               /* server failure */
134 #define NXDOMAIN        3               /* non existent domain */
135 #define NOTIMP          4               /* not implemented */
136 #define REFUSED         5               /* query refused */
137
138 /*
139  * Type values for resources and queries
140  */
141 #define T_A             1               /* host address */
142 #define T_NS            2               /* authoritative server */
143 #define T_MD            3               /* mail destination */
144 #define T_MF            4               /* mail forwarder */
145 #define T_CNAME         5               /* canonical name */
146 #define T_SOA           6               /* start of authority zone */
147 #define T_MB            7               /* mailbox domain name */
148 #define T_MG            8               /* mail group member */
149 #define T_MR            9               /* mail rename name */
150 #define T_NULL          10              /* null resource record */
151 #define T_WKS           11              /* well known service */
152 #define T_PTR           12              /* domain name pointer */
153 #define T_HINFO         13              /* host information */
154 #define T_MINFO         14              /* mailbox information */
155 #define T_MX            15              /* mail routing information */
156 #define T_TXT           16              /* text strings */
157 #define T_RP            17              /* responsible person */
158 #define T_AFSDB         18              /* AFS cell database */
159 #define T_X25           19              /* X_25 calling address */
160 #define T_ISDN          20              /* ISDN calling address */
161 #define T_RT            21              /* router */
162 #define T_NSAP          22              /* NSAP address */
163 #define T_NSAP_PTR      23              /* reverse NSAP lookup (deprecated) */
164 #define T_SIG           24              /* security signature */
165 #define T_KEY           25              /* security key */
166 #define T_PX            26              /* X.400 mail mapping */
167 #define T_GPOS          27              /* geographical position (withdrawn) */
168 #define T_AAAA          28              /* IP6 Address */
169 #define T_LOC           29              /* Location Information */
170 #define T_NXT           30              /* Next Valid Name in Zone */
171 #define T_EID           31              /* Endpoint identifier */
172 #define T_NIMLOC        32              /* Nimrod locator */
173 #define T_SRV           33              /* Server selection */
174 #define T_ATMA          34              /* ATM Address */
175 #define T_NAPTR         35              /* Naming Authority PoinTeR */
176         /* non standard */
177 #define T_UINFO         100             /* user (finger) information */
178 #define T_UID           101             /* user ID */
179 #define T_GID           102             /* group ID */
180 #define T_UNSPEC        103             /* Unspecified format (binary data) */
181         /* Query type values which do not appear in resource records */
182 #define T_IXFR          251             /* incremental zone transfer */
183 #define T_AXFR          252             /* transfer zone of authority */
184 #define T_MAILB         253             /* transfer mailbox records */
185 #define T_MAILA         254             /* transfer mail agent records */
186 #define T_ANY           255             /* wildcard match */
187
188 /*
189  * Values for class field
190  */
191
192 #define C_IN            1               /* the arpa internet */
193 #define C_CHAOS         3               /* for chaos net (MIT) */
194 #define C_HS            4               /* for Hesiod name server (MIT) (XXX) */
195         /* Query class values which do not appear in resource records */
196 #define C_ANY           255             /* wildcard match */
197
198 /*
199  * Flags field of the KEY RR rdata
200  */
201 #define KEYFLAG_TYPEMASK        0xC000  /* Mask for "type" bits */
202 #define KEYFLAG_TYPE_AUTH_CONF  0x0000  /* Key usable for both */
203 #define KEYFLAG_TYPE_CONF_ONLY  0x8000  /* Key usable for confidentiality */
204 #define KEYFLAG_TYPE_AUTH_ONLY  0x4000  /* Key usable for authentication */
205 #define KEYFLAG_TYPE_NO_KEY     0xC000  /* No key usable for either; no key */
206 /* The type bits can also be interpreted independently, as single bits: */
207 #define KEYFLAG_NO_AUTH         0x8000  /* Key not usable for authentication */
208 #define KEYFLAG_NO_CONF         0x4000  /* Key not usable for confidentiality */
209
210 #define KEYFLAG_EXPERIMENTAL    0x2000  /* Security is *mandatory* if bit=0 */
211 #define KEYFLAG_RESERVED3       0x1000  /* reserved - must be zero */
212 #define KEYFLAG_RESERVED4       0x0800  /* reserved - must be zero */
213 #define KEYFLAG_USERACCOUNT     0x0400  /* key is assoc. with a user acct */
214 #define KEYFLAG_ENTITY          0x0200  /* key is assoc. with entity eg host */
215 #define KEYFLAG_ZONEKEY         0x0100  /* key is zone key for the zone named */
216 #define KEYFLAG_IPSEC           0x0080  /* key is for IPSEC use (host or user)*/
217 #define KEYFLAG_EMAIL           0x0040  /* key is for email (MIME security) */
218 #define KEYFLAG_RESERVED10      0x0020  /* reserved - must be zero */
219 #define KEYFLAG_RESERVED11      0x0010  /* reserved - must be zero */
220 #define KEYFLAG_SIGNATORYMASK   0x000F  /* key can sign DNS RR's of same name */
221
222 #define  KEYFLAG_RESERVED_BITMASK ( KEYFLAG_RESERVED3 | \
223                                     KEYFLAG_RESERVED4 | \
224                                     KEYFLAG_RESERVED10| KEYFLAG_RESERVED11)
225
226 /* The Algorithm field of the KEY and SIG RR's is an integer, {1..254} */
227 #define ALGORITHM_MD5RSA        1       /* MD5 with RSA */
228 #define ALGORITHM_EXPIRE_ONLY   253     /* No alg, no security */
229 #define ALGORITHM_PRIVATE_OID   254     /* Key begins with OID indicating alg */
230
231 /* Signatures */
232                                         /* Size of a mod or exp in bits */
233 #define MIN_MD5RSA_KEY_PART_BITS         512
234 #define MAX_MD5RSA_KEY_PART_BITS        2552
235                                         /* Total of binary mod and exp, bytes */
236 #define MAX_MD5RSA_KEY_BYTES            ((MAX_MD5RSA_KEY_PART_BITS+7/8)*2+3)
237                                         /* Max length of text sig block */
238 #define MAX_KEY_BASE64                  (((MAX_MD5RSA_KEY_BYTES+2)/3)*4)
239
240 /*
241  * Status return codes for T_UNSPEC conversion routines
242  */
243 #define CONV_SUCCESS    0
244 #define CONV_OVERFLOW   (-1)
245 #define CONV_BADFMT     (-2)
246 #define CONV_BADCKSUM   (-3)
247 #define CONV_BADBUFLEN  (-4)
248
249 /* glibc always has byte order info in <endian.h> */
250 #include <endian.h>
251
252 __BEGIN_DECLS
253
254 /*
255  * Structure for query header.  The order of the fields is machine- and
256  * compiler-dependent, depending on the byte/bit order and the layout
257  * of bit fields.  We use bit fields only in int variables, as this
258  * is all ANSI requires.  This requires a somewhat confusing rearrangement.
259  */
260
261 typedef struct {
262         unsigned        id :16;         /* query identification number */
263 #if BYTE_ORDER == BIG_ENDIAN
264                         /* fields in third byte */
265         unsigned        qr: 1;          /* response flag */
266         unsigned        opcode: 4;      /* purpose of message */
267         unsigned        aa: 1;          /* authoritative answer */
268         unsigned        tc: 1;          /* truncated message */
269         unsigned        rd: 1;          /* recursion desired */
270                         /* fields in fourth byte */
271         unsigned        ra: 1;          /* recursion available */
272         unsigned        unused :1;      /* unused bits (MBZ as of 4.9.3a3) */
273         unsigned        ad: 1;          /* authentic data from named */
274         unsigned        cd: 1;          /* checking disabled by resolver */
275         unsigned        rcode :4;       /* response code */
276 #endif
277 #if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN
278                         /* fields in third byte */
279         unsigned        rd :1;          /* recursion desired */
280         unsigned        tc :1;          /* truncated message */
281         unsigned        aa :1;          /* authoritative answer */
282         unsigned        opcode :4;      /* purpose of message */
283         unsigned        qr :1;          /* response flag */
284                         /* fields in fourth byte */
285         unsigned        rcode :4;       /* response code */
286         unsigned        cd: 1;          /* checking disabled by resolver */
287         unsigned        ad: 1;          /* authentic data from named */
288         unsigned        unused :1;      /* unused bits (MBZ as of 4.9.3a3) */
289         unsigned        ra :1;          /* recursion available */
290 #endif
291                         /* remaining bytes */
292         unsigned        qdcount :16;    /* number of question entries */
293         unsigned        ancount :16;    /* number of answer entries */
294         unsigned        nscount :16;    /* number of authority entries */
295         unsigned        arcount :16;    /* number of resource entries */
296 } HEADER;
297
298 /*
299  * Defines for handling compressed domain names
300  */
301 #define INDIR_MASK      0xc0
302
303 extern  u_int16_t       _getshort __P((const u_char *));
304 extern  u_int32_t       _getlong __P((const u_char *));
305
306 /*
307  * Inline versions of get/put short/long.  Pointer is advanced.
308  *
309  * These macros demonstrate the property of C whereby it can be
310  * portable or it can be elegant but rarely both.
311  */
312 #define GETSHORT(s, cp) { \
313         register u_char *t_cp = (u_char *)(cp); \
314         (s) = ((u_int16_t)t_cp[0] << 8) \
315             | ((u_int16_t)t_cp[1]) \
316             ; \
317         (cp) += INT16SZ; \
318 }
319
320 #define GETLONG(l, cp) { \
321         register u_char *t_cp = (u_char *)(cp); \
322         (l) = ((u_int32_t)t_cp[0] << 24) \
323             | ((u_int32_t)t_cp[1] << 16) \
324             | ((u_int32_t)t_cp[2] << 8) \
325             | ((u_int32_t)t_cp[3]) \
326             ; \
327         (cp) += INT32SZ; \
328 }
329
330 #define PUTSHORT(s, cp) { \
331         register u_int16_t t_s = (u_int16_t)(s); \
332         register u_char *t_cp = (u_char *)(cp); \
333         *t_cp++ = t_s >> 8; \
334         *t_cp   = t_s; \
335         (cp) += INT16SZ; \
336 }
337
338 #define PUTLONG(l, cp) { \
339         register u_int32_t t_l = (u_int32_t)(l); \
340         register u_char *t_cp = (u_char *)(cp); \
341         *t_cp++ = t_l >> 24; \
342         *t_cp++ = t_l >> 16; \
343         *t_cp++ = t_l >> 8; \
344         *t_cp   = t_l; \
345         (cp) += INT32SZ; \
346 }
347
348 __END_DECLS
349
350 #endif /* arpa/nameser.h */