(i[34]86sol2): New abbrev for i[34]86-unknown-solaris2.
[kopensolaris-gnu/glibc.git] / resolv / arpa / nameser.h
1 /*
2  * Copyright (c) 1983, 1989 Regents of the University of California.
3  * 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:
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.
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.
32  *
33  *      @(#)nameser.h   5.25 (Berkeley) 4/3/91
34  */
35
36 #ifndef _NAMESER_H_
37 #define _NAMESER_H_
38
39 /*
40  * Define constants based on rfc883
41  */
42 #define PACKETSZ        512             /* maximum packet size */
43 #define MAXDNAME        256             /* maximum domain name */
44 #define MAXCDNAME       255             /* maximum compressed domain name */
45 #define MAXLABEL        63              /* maximum length of domain label */
46         /* Number of bytes of fixed size data in query structure */
47 #define QFIXEDSZ        4
48         /* number of bytes of fixed size data in resource record */
49 #define RRFIXEDSZ       10
50
51 /*
52  * Internet nameserver port number
53  */
54 #define NAMESERVER_PORT 53
55
56 /*
57  * Currently defined opcodes
58  */
59 #define QUERY           0x0             /* standard query */
60 #define IQUERY          0x1             /* inverse query */
61 #define STATUS          0x2             /* nameserver status query */
62 /*#define xxx           0x3             /* 0x3 reserved */
63         /* non standard */
64 #define UPDATEA         0x9             /* add resource record */
65 #define UPDATED         0xa             /* delete a specific resource record */
66 #define UPDATEDA        0xb             /* delete all nemed resource record */
67 #define UPDATEM         0xc             /* modify a specific resource record */
68 #define UPDATEMA        0xd             /* modify all named resource record */
69
70 #define ZONEINIT        0xe             /* initial zone transfer */
71 #define ZONEREF         0xf             /* incremental zone referesh */
72
73 /*
74  * Currently defined response codes
75  */
76 #define NOERROR         0               /* no error */
77 #define FORMERR         1               /* format error */
78 #define SERVFAIL        2               /* server failure */
79 #define NXDOMAIN        3               /* non existent domain */
80 #define NOTIMP          4               /* not implemented */
81 #define REFUSED         5               /* query refused */
82         /* non standard */
83 #define NOCHANGE        0xf             /* update failed to change db */
84
85 /*
86  * Type values for resources and queries
87  */
88 #define T_A             1               /* host address */
89 #define T_NS            2               /* authoritative server */
90 #define T_MD            3               /* mail destination */
91 #define T_MF            4               /* mail forwarder */
92 #define T_CNAME         5               /* connonical name */
93 #define T_SOA           6               /* start of authority zone */
94 #define T_MB            7               /* mailbox domain name */
95 #define T_MG            8               /* mail group member */
96 #define T_MR            9               /* mail rename name */
97 #define T_NULL          10              /* null resource record */
98 #define T_WKS           11              /* well known service */
99 #define T_PTR           12              /* domain name pointer */
100 #define T_HINFO         13              /* host information */
101 #define T_MINFO         14              /* mailbox information */
102 #define T_MX            15              /* mail routing information */
103 #define T_TXT           16              /* text strings */
104         /* non standard */
105 #define T_UINFO         100             /* user (finger) information */
106 #define T_UID           101             /* user ID */
107 #define T_GID           102             /* group ID */
108 #define T_UNSPEC        103             /* Unspecified format (binary data) */
109         /* Query type values which do not appear in resource records */
110 #define T_AXFR          252             /* transfer zone of authority */
111 #define T_MAILB         253             /* transfer mailbox records */
112 #define T_MAILA         254             /* transfer mail agent records */
113 #define T_ANY           255             /* wildcard match */
114
115 /*
116  * Values for class field
117  */
118
119 #define C_IN            1               /* the arpa internet */
120 #define C_CHAOS         3               /* for chaos net at MIT */
121 #define C_HS            4               /* for Hesiod name server at MIT */
122         /* Query class values which do not appear in resource records */
123 #define C_ANY           255             /* wildcard match */
124
125 /*
126  * Status return codes for T_UNSPEC conversion routines
127  */
128 #define CONV_SUCCESS 0
129 #define CONV_OVERFLOW -1
130 #define CONV_BADFMT -2
131 #define CONV_BADCKSUM -3
132 #define CONV_BADBUFLEN -4
133
134 /* Hacked for GNU: The BSD code has #ifdef's here to set BYTE_ORDER.  */
135 #include <endian.h>
136
137 /*
138  * Structure for query header, the order of the fields is machine and
139  * compiler dependent, in our case, the bits within a byte are assignd 
140  * least significant first, while the order of transmition is most 
141  * significant first.  This requires a somewhat confusing rearrangement.
142  */
143
144 typedef struct {
145         u_short id;             /* query identification number */
146 #if BYTE_ORDER == BIG_ENDIAN
147                         /* fields in third byte */
148         u_char  qr:1;           /* response flag */
149         u_char  opcode:4;       /* purpose of message */
150         u_char  aa:1;           /* authoritive answer */
151         u_char  tc:1;           /* truncated message */
152         u_char  rd:1;           /* recursion desired */
153                         /* fields in fourth byte */
154         u_char  ra:1;           /* recursion available */
155         u_char  pr:1;           /* primary server required (non standard) */
156         u_char  unused:2;       /* unused bits */
157         u_char  rcode:4;        /* response code */
158 #endif
159 #if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN
160                         /* fields in third byte */
161         u_char  rd:1;           /* recursion desired */
162         u_char  tc:1;           /* truncated message */
163         u_char  aa:1;           /* authoritive answer */
164         u_char  opcode:4;       /* purpose of message */
165         u_char  qr:1;           /* response flag */
166                         /* fields in fourth byte */
167         u_char  rcode:4;        /* response code */
168         u_char  unused:2;       /* unused bits */
169         u_char  pr:1;           /* primary server required (non standard) */
170         u_char  ra:1;           /* recursion available */
171 #endif
172                         /* remaining bytes */
173         u_short qdcount;        /* number of question entries */
174         u_short ancount;        /* number of answer entries */
175         u_short nscount;        /* number of authority entries */
176         u_short arcount;        /* number of resource entries */
177 } HEADER;
178
179 /*
180  * Defines for handling compressed domain names
181  */
182 #define INDIR_MASK      0xc0
183
184 /*
185  * Structure for passing resource records around.
186  */
187 struct rrec {
188         short   r_zone;                 /* zone number */
189         short   r_class;                /* class number */
190         short   r_type;                 /* type number */
191         u_long  r_ttl;                  /* time to live */
192         int     r_size;                 /* size of data area */
193         char    *r_data;                /* pointer to data */
194 };
195
196 extern  u_short _getshort();
197 extern  u_long  _getlong();
198
199 /*
200  * Inline versions of get/put short/long.
201  * Pointer is advanced; we assume that both arguments
202  * are lvalues and will already be in registers.
203  * cp MUST be u_char *.
204  */
205 #define GETSHORT(s, cp) { \
206         (s) = *(cp)++ << 8; \
207         (s) |= *(cp)++; \
208 }
209
210 #define GETLONG(l, cp) { \
211         (l) = *(cp)++ << 8; \
212         (l) |= *(cp)++; (l) <<= 8; \
213         (l) |= *(cp)++; (l) <<= 8; \
214         (l) |= *(cp)++; \
215 }
216
217
218 #define PUTSHORT(s, cp) { \
219         *(cp)++ = (s) >> 8; \
220         *(cp)++ = (s); \
221 }
222
223 /*
224  * Warning: PUTLONG destroys its first argument.
225  */
226 #define PUTLONG(l, cp) { \
227         (cp)[3] = l; \
228         (cp)[2] = (l >>= 8); \
229         (cp)[1] = (l >>= 8); \
230         (cp)[0] = l >> 8; \
231         (cp) += sizeof(u_long); \
232 }
233
234 #endif /* !_NAMESER_H_ */