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