xref: /minix3/external/bsd/tcpdump/dist/nameser.h (revision b636d99d91c3d54204248f643c14627405d4afd1)
1*b636d99dSDavid van Moolenbroek /*
2*b636d99dSDavid van Moolenbroek  * Copyright (c) 1983, 1989, 1993
3*b636d99dSDavid van Moolenbroek  *	The Regents of the University of California.  All rights reserved.
4*b636d99dSDavid van Moolenbroek  *
5*b636d99dSDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
6*b636d99dSDavid van Moolenbroek  * modification, are permitted provided that the following conditions
7*b636d99dSDavid van Moolenbroek  * are met:
8*b636d99dSDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
9*b636d99dSDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
10*b636d99dSDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
11*b636d99dSDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
12*b636d99dSDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
13*b636d99dSDavid van Moolenbroek  * 3. Neither the name of the University nor the names of its contributors
14*b636d99dSDavid van Moolenbroek  *    may be used to endorse or promote products derived from this software
15*b636d99dSDavid van Moolenbroek  *    without specific prior written permission.
16*b636d99dSDavid van Moolenbroek  *
17*b636d99dSDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18*b636d99dSDavid van Moolenbroek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19*b636d99dSDavid van Moolenbroek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20*b636d99dSDavid van Moolenbroek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21*b636d99dSDavid van Moolenbroek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*b636d99dSDavid van Moolenbroek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23*b636d99dSDavid van Moolenbroek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24*b636d99dSDavid van Moolenbroek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25*b636d99dSDavid van Moolenbroek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26*b636d99dSDavid van Moolenbroek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27*b636d99dSDavid van Moolenbroek  * SUCH DAMAGE.
28*b636d99dSDavid van Moolenbroek  *
29*b636d99dSDavid van Moolenbroek  *      @(#)nameser.h	8.2 (Berkeley) 2/16/94
30*b636d99dSDavid van Moolenbroek  * -
31*b636d99dSDavid van Moolenbroek  * Portions Copyright (c) 1993 by Digital Equipment Corporation.
32*b636d99dSDavid van Moolenbroek  *
33*b636d99dSDavid van Moolenbroek  * Permission to use, copy, modify, and distribute this software for any
34*b636d99dSDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
35*b636d99dSDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies, and that
36*b636d99dSDavid van Moolenbroek  * the name of Digital Equipment Corporation not be used in advertising or
37*b636d99dSDavid van Moolenbroek  * publicity pertaining to distribution of the document or software without
38*b636d99dSDavid van Moolenbroek  * specific, written prior permission.
39*b636d99dSDavid van Moolenbroek  *
40*b636d99dSDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
41*b636d99dSDavid van Moolenbroek  * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
42*b636d99dSDavid van Moolenbroek  * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
43*b636d99dSDavid van Moolenbroek  * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
44*b636d99dSDavid van Moolenbroek  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
45*b636d99dSDavid van Moolenbroek  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
46*b636d99dSDavid van Moolenbroek  * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
47*b636d99dSDavid van Moolenbroek  * SOFTWARE.
48*b636d99dSDavid van Moolenbroek  * -
49*b636d99dSDavid van Moolenbroek  * --Copyright--
50*b636d99dSDavid van Moolenbroek  */
51*b636d99dSDavid van Moolenbroek 
52*b636d99dSDavid van Moolenbroek #ifndef _NAMESER_H_
53*b636d99dSDavid van Moolenbroek #define	_NAMESER_H_
54*b636d99dSDavid van Moolenbroek 
55*b636d99dSDavid van Moolenbroek #include <sys/types.h>
56*b636d99dSDavid van Moolenbroek 
57*b636d99dSDavid van Moolenbroek /*
58*b636d99dSDavid van Moolenbroek  * Define constants based on rfc883
59*b636d99dSDavid van Moolenbroek  */
60*b636d99dSDavid van Moolenbroek #define PACKETSZ	512		/* maximum packet size */
61*b636d99dSDavid van Moolenbroek #define MAXDNAME	256		/* maximum domain name */
62*b636d99dSDavid van Moolenbroek #define MAXCDNAME	255		/* maximum compressed domain name */
63*b636d99dSDavid van Moolenbroek #define MAXLABEL	63		/* maximum length of domain label */
64*b636d99dSDavid van Moolenbroek 	/* Number of bytes of fixed size data in query structure */
65*b636d99dSDavid van Moolenbroek #define QFIXEDSZ	4
66*b636d99dSDavid van Moolenbroek 	/* number of bytes of fixed size data in resource record */
67*b636d99dSDavid van Moolenbroek #define RRFIXEDSZ	10
68*b636d99dSDavid van Moolenbroek 
69*b636d99dSDavid van Moolenbroek /*
70*b636d99dSDavid van Moolenbroek  * Internet nameserver port number
71*b636d99dSDavid van Moolenbroek  */
72*b636d99dSDavid van Moolenbroek #define NAMESERVER_PORT	53
73*b636d99dSDavid van Moolenbroek 
74*b636d99dSDavid van Moolenbroek /*
75*b636d99dSDavid van Moolenbroek  * Port for multicast DNS; see
76*b636d99dSDavid van Moolenbroek  *
77*b636d99dSDavid van Moolenbroek  *	http://files.multicastdns.org/draft-cheshire-dnsext-multicastdns.txt
78*b636d99dSDavid van Moolenbroek  *
79*b636d99dSDavid van Moolenbroek  * for the current mDNS spec.
80*b636d99dSDavid van Moolenbroek  */
81*b636d99dSDavid van Moolenbroek #define MULTICASTDNS_PORT	5353
82*b636d99dSDavid van Moolenbroek 
83*b636d99dSDavid van Moolenbroek /*
84*b636d99dSDavid van Moolenbroek  * Currently defined opcodes
85*b636d99dSDavid van Moolenbroek  */
86*b636d99dSDavid van Moolenbroek #define QUERY		0x0		/* standard query */
87*b636d99dSDavid van Moolenbroek #define IQUERY		0x1		/* inverse query */
88*b636d99dSDavid van Moolenbroek #define STATUS		0x2		/* nameserver status query */
89*b636d99dSDavid van Moolenbroek #if 0
90*b636d99dSDavid van Moolenbroek #define xxx		0x3		/* 0x3 reserved */
91*b636d99dSDavid van Moolenbroek #endif
92*b636d99dSDavid van Moolenbroek 	/* non standard - supports ALLOW_UPDATES stuff from Mike Schwartz */
93*b636d99dSDavid van Moolenbroek #define UPDATEA		0x9		/* add resource record */
94*b636d99dSDavid van Moolenbroek #define UPDATED		0xa		/* delete a specific resource record */
95*b636d99dSDavid van Moolenbroek #define UPDATEDA	0xb		/* delete all named resource record */
96*b636d99dSDavid van Moolenbroek #define UPDATEM		0xc		/* modify a specific resource record */
97*b636d99dSDavid van Moolenbroek #define UPDATEMA	0xd		/* modify all named resource record */
98*b636d99dSDavid van Moolenbroek 
99*b636d99dSDavid van Moolenbroek #define ZONEINIT	0xe		/* initial zone transfer */
100*b636d99dSDavid van Moolenbroek #define ZONEREF		0xf		/* incremental zone referesh */
101*b636d99dSDavid van Moolenbroek 
102*b636d99dSDavid van Moolenbroek /*
103*b636d99dSDavid van Moolenbroek  * Undefine various #defines from various System V-flavored OSes (Solaris,
104*b636d99dSDavid van Moolenbroek  * SINIX, HP-UX) so the compiler doesn't whine that we redefine them.
105*b636d99dSDavid van Moolenbroek  */
106*b636d99dSDavid van Moolenbroek #ifdef T_NULL
107*b636d99dSDavid van Moolenbroek #undef T_NULL
108*b636d99dSDavid van Moolenbroek #endif
109*b636d99dSDavid van Moolenbroek #ifdef T_OPT
110*b636d99dSDavid van Moolenbroek #undef T_OPT
111*b636d99dSDavid van Moolenbroek #endif
112*b636d99dSDavid van Moolenbroek #ifdef T_UNSPEC
113*b636d99dSDavid van Moolenbroek #undef T_UNSPEC
114*b636d99dSDavid van Moolenbroek #endif
115*b636d99dSDavid van Moolenbroek #ifdef NOERROR
116*b636d99dSDavid van Moolenbroek #undef NOERROR
117*b636d99dSDavid van Moolenbroek #endif
118*b636d99dSDavid van Moolenbroek 
119*b636d99dSDavid van Moolenbroek /*
120*b636d99dSDavid van Moolenbroek  * Currently defined response codes
121*b636d99dSDavid van Moolenbroek  */
122*b636d99dSDavid van Moolenbroek #define NOERROR		0		/* no error */
123*b636d99dSDavid van Moolenbroek #define FORMERR		1		/* format error */
124*b636d99dSDavid van Moolenbroek #define SERVFAIL	2		/* server failure */
125*b636d99dSDavid van Moolenbroek #define NXDOMAIN	3		/* non existent domain */
126*b636d99dSDavid van Moolenbroek #define NOTIMP		4		/* not implemented */
127*b636d99dSDavid van Moolenbroek #define REFUSED		5		/* query refused */
128*b636d99dSDavid van Moolenbroek 	/* non standard */
129*b636d99dSDavid van Moolenbroek #define NOCHANGE	0xf		/* update failed to change db */
130*b636d99dSDavid van Moolenbroek 
131*b636d99dSDavid van Moolenbroek /*
132*b636d99dSDavid van Moolenbroek  * Type values for resources and queries
133*b636d99dSDavid van Moolenbroek  */
134*b636d99dSDavid van Moolenbroek #define T_A		1		/* host address */
135*b636d99dSDavid van Moolenbroek #define T_NS		2		/* authoritative server */
136*b636d99dSDavid van Moolenbroek #define T_MD		3		/* mail destination */
137*b636d99dSDavid van Moolenbroek #define T_MF		4		/* mail forwarder */
138*b636d99dSDavid van Moolenbroek #define T_CNAME		5		/* connonical name */
139*b636d99dSDavid van Moolenbroek #define T_SOA		6		/* start of authority zone */
140*b636d99dSDavid van Moolenbroek #define T_MB		7		/* mailbox domain name */
141*b636d99dSDavid van Moolenbroek #define T_MG		8		/* mail group member */
142*b636d99dSDavid van Moolenbroek #define T_MR		9		/* mail rename name */
143*b636d99dSDavid van Moolenbroek #define T_NULL		10		/* null resource record */
144*b636d99dSDavid van Moolenbroek #define T_WKS		11		/* well known service */
145*b636d99dSDavid van Moolenbroek #define T_PTR		12		/* domain name pointer */
146*b636d99dSDavid van Moolenbroek #define T_HINFO		13		/* host information */
147*b636d99dSDavid van Moolenbroek #define T_MINFO		14		/* mailbox information */
148*b636d99dSDavid van Moolenbroek #define T_MX		15		/* mail routing information */
149*b636d99dSDavid van Moolenbroek #define T_TXT		16		/* text strings */
150*b636d99dSDavid van Moolenbroek #define	T_RP		17		/* responsible person */
151*b636d99dSDavid van Moolenbroek #define	T_AFSDB		18		/* AFS cell database */
152*b636d99dSDavid van Moolenbroek #define T_X25		19		/* X_25 calling address */
153*b636d99dSDavid van Moolenbroek #define T_ISDN		20		/* ISDN calling address */
154*b636d99dSDavid van Moolenbroek #define T_RT		21		/* router */
155*b636d99dSDavid van Moolenbroek #define	T_NSAP		22		/* NSAP address */
156*b636d99dSDavid van Moolenbroek #define	T_NSAP_PTR	23		/* reverse lookup for NSAP */
157*b636d99dSDavid van Moolenbroek #define T_SIG		24		/* security signature */
158*b636d99dSDavid van Moolenbroek #define T_KEY		25		/* security key */
159*b636d99dSDavid van Moolenbroek #define T_PX		26		/* X.400 mail mapping */
160*b636d99dSDavid van Moolenbroek #define T_GPOS		27		/* geographical position (withdrawn) */
161*b636d99dSDavid van Moolenbroek #define T_AAAA		28		/* IP6 Address */
162*b636d99dSDavid van Moolenbroek #define T_LOC		29		/* Location Information */
163*b636d99dSDavid van Moolenbroek #define T_NXT		30		/* Next Valid Name in Zone */
164*b636d99dSDavid van Moolenbroek #define T_EID		31		/* Endpoint identifier */
165*b636d99dSDavid van Moolenbroek #define T_NIMLOC	32		/* Nimrod locator */
166*b636d99dSDavid van Moolenbroek #define T_SRV		33		/* Server selection */
167*b636d99dSDavid van Moolenbroek #define T_ATMA		34		/* ATM Address */
168*b636d99dSDavid van Moolenbroek #define T_NAPTR		35		/* Naming Authority PoinTeR */
169*b636d99dSDavid van Moolenbroek #define T_KX		36		/* Key Exchanger */
170*b636d99dSDavid van Moolenbroek #define T_CERT		37		/* Certificates in the DNS */
171*b636d99dSDavid van Moolenbroek #define T_A6		38		/* IP6 address */
172*b636d99dSDavid van Moolenbroek #define T_DNAME		39		/* non-terminal redirection */
173*b636d99dSDavid van Moolenbroek #define T_SINK		40		/* unknown */
174*b636d99dSDavid van Moolenbroek #define T_OPT		41		/* EDNS0 option (meta-RR) */
175*b636d99dSDavid van Moolenbroek #define T_APL		42		/* lists of address prefixes */
176*b636d99dSDavid van Moolenbroek #define T_DS		43		/* Delegation Signer */
177*b636d99dSDavid van Moolenbroek #define T_SSHFP		44		/* SSH Fingerprint */
178*b636d99dSDavid van Moolenbroek #define T_IPSECKEY	45		/* IPsec keying material */
179*b636d99dSDavid van Moolenbroek #define T_RRSIG		46		/* new security signature */
180*b636d99dSDavid van Moolenbroek #define T_NSEC		47		/* provable insecure information */
181*b636d99dSDavid van Moolenbroek #define T_DNSKEY	48		/* new security key */
182*b636d99dSDavid van Moolenbroek 	/* non standard */
183*b636d99dSDavid van Moolenbroek #define T_SPF		99		/* sender policy framework */
184*b636d99dSDavid van Moolenbroek #define T_UINFO		100		/* user (finger) information */
185*b636d99dSDavid van Moolenbroek #define T_UID		101		/* user ID */
186*b636d99dSDavid van Moolenbroek #define T_GID		102		/* group ID */
187*b636d99dSDavid van Moolenbroek #define T_UNSPEC	103		/* Unspecified format (binary data) */
188*b636d99dSDavid van Moolenbroek #define T_UNSPECA	104		/* "unspecified ascii". Ugly MIT hack */
189*b636d99dSDavid van Moolenbroek 	/* Query type values which do not appear in resource records */
190*b636d99dSDavid van Moolenbroek #define T_TKEY		249		/* Transaction Key [RFC2930] */
191*b636d99dSDavid van Moolenbroek #define T_TSIG		250		/* Transaction Signature [RFC2845] */
192*b636d99dSDavid van Moolenbroek #define T_IXFR		251		/* incremental transfer [RFC1995] */
193*b636d99dSDavid van Moolenbroek #define T_AXFR		252		/* transfer zone of authority */
194*b636d99dSDavid van Moolenbroek #define T_MAILB		253		/* transfer mailbox records */
195*b636d99dSDavid van Moolenbroek #define T_MAILA		254		/* transfer mail agent records */
196*b636d99dSDavid van Moolenbroek #define T_ANY		255		/* wildcard match */
197*b636d99dSDavid van Moolenbroek 
198*b636d99dSDavid van Moolenbroek /*
199*b636d99dSDavid van Moolenbroek  * Values for class field
200*b636d99dSDavid van Moolenbroek  */
201*b636d99dSDavid van Moolenbroek 
202*b636d99dSDavid van Moolenbroek #define C_IN		1		/* the arpa internet */
203*b636d99dSDavid van Moolenbroek #define C_CHAOS		3		/* for chaos net (MIT) */
204*b636d99dSDavid van Moolenbroek #define C_HS		4		/* for Hesiod name server (MIT) (XXX) */
205*b636d99dSDavid van Moolenbroek 	/* Query class values which do not appear in resource records */
206*b636d99dSDavid van Moolenbroek #define C_ANY		255		/* wildcard match */
207*b636d99dSDavid van Moolenbroek #define C_QU		0x8000		/* mDNS QU flag in queries */
208*b636d99dSDavid van Moolenbroek #define C_CACHE_FLUSH	0x8000		/* mDNS cache flush flag in replies */
209*b636d99dSDavid van Moolenbroek 
210*b636d99dSDavid van Moolenbroek /*
211*b636d99dSDavid van Moolenbroek  * Status return codes for T_UNSPEC conversion routines
212*b636d99dSDavid van Moolenbroek  */
213*b636d99dSDavid van Moolenbroek #define CONV_SUCCESS 0
214*b636d99dSDavid van Moolenbroek #define CONV_OVERFLOW -1
215*b636d99dSDavid van Moolenbroek #define CONV_BADFMT -2
216*b636d99dSDavid van Moolenbroek #define CONV_BADCKSUM -3
217*b636d99dSDavid van Moolenbroek #define CONV_BADBUFLEN -4
218*b636d99dSDavid van Moolenbroek 
219*b636d99dSDavid van Moolenbroek /*
220*b636d99dSDavid van Moolenbroek  * Structure for query header.
221*b636d99dSDavid van Moolenbroek  */
222*b636d99dSDavid van Moolenbroek typedef struct {
223*b636d99dSDavid van Moolenbroek 	uint16_t id;		/* query identification number */
224*b636d99dSDavid van Moolenbroek 	uint8_t  flags1;	/* first byte of flags */
225*b636d99dSDavid van Moolenbroek 	uint8_t  flags2;	/* second byte of flags */
226*b636d99dSDavid van Moolenbroek 	uint16_t qdcount;	/* number of question entries */
227*b636d99dSDavid van Moolenbroek 	uint16_t ancount;	/* number of answer entries */
228*b636d99dSDavid van Moolenbroek 	uint16_t nscount;	/* number of authority entries */
229*b636d99dSDavid van Moolenbroek 	uint16_t arcount;	/* number of resource entries */
230*b636d99dSDavid van Moolenbroek } HEADER;
231*b636d99dSDavid van Moolenbroek 
232*b636d99dSDavid van Moolenbroek /*
233*b636d99dSDavid van Moolenbroek  * Macros for subfields of flag fields.
234*b636d99dSDavid van Moolenbroek  */
235*b636d99dSDavid van Moolenbroek #define DNS_QR(np)	((np)->flags1 & 0x80)		/* response flag */
236*b636d99dSDavid van Moolenbroek #define DNS_OPCODE(np)	((((np)->flags1) >> 3) & 0xF)	/* purpose of message */
237*b636d99dSDavid van Moolenbroek #define DNS_AA(np)	((np)->flags1 & 0x04)		/* authoritative answer */
238*b636d99dSDavid van Moolenbroek #define DNS_TC(np)	((np)->flags1 & 0x02)		/* truncated message */
239*b636d99dSDavid van Moolenbroek #define DNS_RD(np)	((np)->flags1 & 0x01)		/* recursion desired */
240*b636d99dSDavid van Moolenbroek 
241*b636d99dSDavid van Moolenbroek #define DNS_RA(np)	((np)->flags2 & 0x80)	/* recursion available */
242*b636d99dSDavid van Moolenbroek #define DNS_AD(np)	((np)->flags2 & 0x20)	/* authentic data from named */
243*b636d99dSDavid van Moolenbroek #define DNS_CD(np)	((np)->flags2 & 0x10)	/* checking disabled by resolver */
244*b636d99dSDavid van Moolenbroek #define DNS_RCODE(np)	((np)->flags2 & 0xF)	/* response code */
245*b636d99dSDavid van Moolenbroek 
246*b636d99dSDavid van Moolenbroek /*
247*b636d99dSDavid van Moolenbroek  * Defines for handling compressed domain names, EDNS0 labels, etc.
248*b636d99dSDavid van Moolenbroek  */
249*b636d99dSDavid van Moolenbroek #define INDIR_MASK	0xc0	/* 11.... */
250*b636d99dSDavid van Moolenbroek #define EDNS0_MASK	0x40	/* 01.... */
251*b636d99dSDavid van Moolenbroek #  define EDNS0_ELT_BITLABEL 0x01
252*b636d99dSDavid van Moolenbroek 
253*b636d99dSDavid van Moolenbroek /*
254*b636d99dSDavid van Moolenbroek  * Structure for passing resource records around.
255*b636d99dSDavid van Moolenbroek  */
256*b636d99dSDavid van Moolenbroek struct rrec {
257*b636d99dSDavid van Moolenbroek 	int16_t	r_zone;			/* zone number */
258*b636d99dSDavid van Moolenbroek 	int16_t	r_class;		/* class number */
259*b636d99dSDavid van Moolenbroek 	int16_t	r_type;			/* type number */
260*b636d99dSDavid van Moolenbroek 	uint32_t	r_ttl;			/* time to live */
261*b636d99dSDavid van Moolenbroek 	int	r_size;			/* size of data area */
262*b636d99dSDavid van Moolenbroek 	char	*r_data;		/* pointer to data */
263*b636d99dSDavid van Moolenbroek };
264*b636d99dSDavid van Moolenbroek 
265*b636d99dSDavid van Moolenbroek /*
266*b636d99dSDavid van Moolenbroek  * Inline versions of get/put short/long.  Pointer is advanced.
267*b636d99dSDavid van Moolenbroek  * We also assume that a "uint16_t" holds 2 "chars"
268*b636d99dSDavid van Moolenbroek  * and that a "uint32_t" holds 4 "chars".
269*b636d99dSDavid van Moolenbroek  *
270*b636d99dSDavid van Moolenbroek  * These macros demonstrate the property of C whereby it can be
271*b636d99dSDavid van Moolenbroek  * portable or it can be elegant but never both.
272*b636d99dSDavid van Moolenbroek  */
273*b636d99dSDavid van Moolenbroek #define GETSHORT(s, cp) { \
274*b636d99dSDavid van Moolenbroek 	register u_char *t_cp = (u_char *)(cp); \
275*b636d99dSDavid van Moolenbroek 	(s) = ((uint16_t)t_cp[0] << 8) | (uint16_t)t_cp[1]; \
276*b636d99dSDavid van Moolenbroek 	(cp) += 2; \
277*b636d99dSDavid van Moolenbroek }
278*b636d99dSDavid van Moolenbroek 
279*b636d99dSDavid van Moolenbroek #define GETLONG(l, cp) { \
280*b636d99dSDavid van Moolenbroek 	register u_char *t_cp = (u_char *)(cp); \
281*b636d99dSDavid van Moolenbroek 	(l) = (((uint32_t)t_cp[0]) << 24) \
282*b636d99dSDavid van Moolenbroek 	    | (((uint32_t)t_cp[1]) << 16) \
283*b636d99dSDavid van Moolenbroek 	    | (((uint32_t)t_cp[2]) << 8) \
284*b636d99dSDavid van Moolenbroek 	    | (((uint32_t)t_cp[3])); \
285*b636d99dSDavid van Moolenbroek 	(cp) += 4; \
286*b636d99dSDavid van Moolenbroek }
287*b636d99dSDavid van Moolenbroek 
288*b636d99dSDavid van Moolenbroek #define PUTSHORT(s, cp) { \
289*b636d99dSDavid van Moolenbroek 	register uint16_t t_s = (uint16_t)(s); \
290*b636d99dSDavid van Moolenbroek 	register u_char *t_cp = (u_char *)(cp); \
291*b636d99dSDavid van Moolenbroek 	*t_cp++ = t_s >> 8; \
292*b636d99dSDavid van Moolenbroek 	*t_cp   = t_s; \
293*b636d99dSDavid van Moolenbroek 	(cp) += 2; \
294*b636d99dSDavid van Moolenbroek }
295*b636d99dSDavid van Moolenbroek 
296*b636d99dSDavid van Moolenbroek /*
297*b636d99dSDavid van Moolenbroek  * Warning: PUTLONG --no-longer-- destroys its first argument.  if you
298*b636d99dSDavid van Moolenbroek  * were depending on this "feature", you will lose.
299*b636d99dSDavid van Moolenbroek  */
300*b636d99dSDavid van Moolenbroek #define PUTLONG(l, cp) { \
301*b636d99dSDavid van Moolenbroek 	register uint32_t t_l = (uint32_t)(l); \
302*b636d99dSDavid van Moolenbroek 	register u_char *t_cp = (u_char *)(cp); \
303*b636d99dSDavid van Moolenbroek 	*t_cp++ = t_l >> 24; \
304*b636d99dSDavid van Moolenbroek 	*t_cp++ = t_l >> 16; \
305*b636d99dSDavid van Moolenbroek 	*t_cp++ = t_l >> 8; \
306*b636d99dSDavid van Moolenbroek 	*t_cp   = t_l; \
307*b636d99dSDavid van Moolenbroek 	(cp) += 4; \
308*b636d99dSDavid van Moolenbroek }
309*b636d99dSDavid van Moolenbroek 
310*b636d99dSDavid van Moolenbroek #endif /* !_NAMESER_H_ */
311