summaryrefslogtreecommitdiff
path: root/usr/src/lib/libresolv/arpa/nameser.h
blob: cf8dc45f42415980207abfec0600fd3a1c28728a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 1994 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*	Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T	*/
/*	  All Rights Reserved  	*/

/*
 * Portions of this source code were derived from Berkeley 4.3 BSD
 * under license from the Regents of the University of California.
 */

#ifndef _ARPA_NAMESER_H
#define	_ARPA_NAMESER_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#include <sys/isa_defs.h>

#ifdef	__cplusplus
extern "C" {
#endif

/*
 * Define constants based on rfc883
 */
#define	PACKETSZ	512		/* maximum packet size */
#define	MAXDNAME	256		/* maximum domain name */
#define	MAXCDNAME	255		/* maximum compressed domain name */
#define	MAXLABEL	63		/* maximum length of domain label */
	/* Number of bytes of fixed size data in query structure */
#define	QFIXEDSZ	4
	/* number of bytes of fixed size data in resource record */
#define	RRFIXEDSZ	10

/*
 * Internet nameserver port number
 */
#define	NAMESERVER_PORT	53

/*
 * Currently defined opcodes
 */
#define	QUERY		0x0		/* standard query */
#define	IQUERY		0x1		/* inverse query */
#define	STATUS		0x2		/* nameserver status query */
/* #define	xxx		0x3 */	/* 0x3 reserved */
	/* non standard */
#define	UPDATEA		0x9		/* add resource record */
#define	UPDATED		0xa		/* delete a specific resource record */
#define	UPDATEDA	0xb		/* delete all nemed resource record */
#define	UPDATEM		0xc		/* modify a specific resource record */
#define	UPDATEMA	0xd		/* modify all named resource record */

#define	ZONEINIT	0xe		/* initial zone transfer */
#define	ZONEREF		0xf		/* incremental zone referesh */

/*
 * Currently defined response codes
 */
#define	NOERROR		0		/* no error */
#define	FORMERR		1		/* format error */
#define	SERVFAIL	2		/* server failure */
#define	NXDOMAIN	3		/* non existent domain */
#define	NOTIMP		4		/* not implemented */
#define	REFUSED		5		/* query refused */
	/* non standard */
#define	NOCHANGE	0xf		/* update failed to change db */

/*
 * Type values for resources and queries
 */
#define	T_A		1		/* host address */
#define	T_NS		2		/* authoritative server */
#define	T_MD		3		/* mail destination */
#define	T_MF		4		/* mail forwarder */
#define	T_CNAME		5		/* connonical name */
#define	T_SOA		6		/* start of authority zone */
#define	T_MB		7		/* mailbox domain name */
#define	T_MG		8		/* mail group member */
#define	T_MR		9		/* mail rename name */
#define	T_NULL		10		/* null resource record */
#define	T_WKS		11		/* well known service */
#define	T_PTR		12		/* domain name pointer */
#define	T_HINFO		13		/* host information */
#define	T_MINFO		14		/* mailbox information */
#define	T_MX		15		/* mail routing information */
#define	T_TXT		16		/* text strings */
	/* non standard */
#define	T_UINFO		100		/* user (finger) information */
#define	T_UID		101		/* user ID */
#define	T_GID		102		/* group ID */
#define	T_UNSPEC	103		/* Unspecified format (binary data) */
	/* Query type values which do not appear in resource records */
#define	T_AXFR		252		/* transfer zone of authority */
#define	T_MAILB		253		/* transfer mailbox records */
#define	T_MAILA		254		/* transfer mail agent records */
#define	T_ANY		255		/* wildcard match */

/*
 * Values for class field
 */

#define	C_IN		1		/* the arpa internet */
#define	C_CHAOS		3		/* for chaos net at MIT */
#define	C_HS		4		/* for Hesiod name server at MIT */
	/* Query class values which do not appear in resource records */
#define	C_ANY		255		/* wildcard match */

/*
 * Status return codes for T_UNSPEC conversion routines
 */
#define	CONV_SUCCESS 0
#define	CONV_OVERFLOW -1
#define	CONV_BADFMT -2
#define	CONV_BADCKSUM -3
#define	CONV_BADBUFLEN -4

/*
 * Structure for query header, the order of the fields is machine and
 * compiler dependent, in our case, the bits within a byte are assignd
 * least significant first, while the order of transmition is most
 * significant first.  This requires a somewhat confusing rearrangement.
 */

typedef struct {
	u_short	id;		/* query identification number */
#if defined(_BIT_FIELDS_HTOL) || defined(BIT_ZERO_ON_LEFT)
	/* Bit zero on left:  SPARC and similar architectures */
			/* fields in third byte */
	u_char	qr:1;		/* response flag */
	u_char	opcode:4;	/* purpose of message */
	u_char	aa:1;		/* authoritive answer */
	u_char	tc:1;		/* truncated message */
	u_char	rd:1;		/* recursion desired */
			/* fields in fourth byte */
	u_char	ra:1;		/* recursion available */
	u_char	pr:1;		/* primary server required (non standard) */
	u_char	unused:2;	/* unused bits */
	u_char	rcode:4;	/* response code */
#else
#if defined(_BIT_FIELDS_LTOH) || defined(BIT_ZERO_ON_RIGHT)
	/* Bit zero on right:  Intel x86 and similar architectures */
			/* fields in third byte */
	u_char	rd:1;		/* recursion desired */
	u_char	tc:1;		/* truncated message */
	u_char	aa:1;		/* authoritive answer */
	u_char	opcode:4;	/* purpose of message */
	u_char	qr:1;		/* response flag */
			/* fields in fourth byte */
	u_char	rcode:4;	/* response code */
	u_char	unused:2;	/* unused bits */
	u_char	pr:1;		/* primary server required (non standard) */
	u_char	ra:1;		/* recursion available */
#else
	/* you must determine what the correct bit order is for your compiler */
	UNDEFINED_BIT_ORDER;
#endif
#endif
			/* remaining bytes */
	u_short	qdcount;	/* number of question entries */
	u_short	ancount;	/* number of answer entries */
	u_short	nscount;	/* number of authority entries */
	u_short	arcount;	/* number of resource entries */
} HEADER;

/*
 * Defines for handling compressed domain names
 */
#define	INDIR_MASK	0xc0

/*
 * Structure for passing resource records around.
 */
struct rrec {
	short	r_zone;			/* zone number */
	short	r_class;		/* class number */
	short	r_type;			/* type number */
	u_long	r_ttl;			/* time to live */
	int	r_size;			/* size of data area */
	char	*r_data;		/* pointer to data */
};

extern	u_short	_getshort();
extern	u_long	_getlong();

/*
 * Inline versions of get/put short/long.
 * Pointer is advanced; we assume that both arguments
 * are lvalues and will already be in registers.
 * cp MUST be u_char *.
 */
#define	GETSHORT(s, cp) { \
	(s) = *(cp)++ << 8; \
	(s) |= *(cp)++; \
}

#define	GETLONG(l, cp) { \
	(l) = *(cp)++ << 8; \
	(l) |= *(cp)++; (l) <<= 8; \
	(l) |= *(cp)++; (l) <<= 8; \
	(l) |= *(cp)++; \
}


#define	PUTSHORT(s, cp) { \
	*(cp)++ = (s) >> 8; \
	*(cp)++ = (s); \
}

/*
 * Warning: PUTLONG destroys its first argument.
 */
#define	PUTLONG(l, cp) { \
	(cp)[3] = l; \
	(cp)[2] = (l >>= 8); \
	(cp)[1] = (l >>= 8); \
	(cp)[0] = l >> 8; \
	(cp) += sizeof (u_long); \
}

#ifdef	__cplusplus
}
#endif

#endif /* _ARPA_NAMESER_H */