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