Back to index

glibc  2.9
nameser.h
Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 1983, 1989, 1993
00003  *    The Regents of the University of California.  All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  * 1. Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in the
00012  *    documentation and/or other materials provided with the distribution.
00013  * 4. Neither the name of the University nor the names of its contributors
00014  *    may be used to endorse or promote products derived from this software
00015  *    without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00027  * SUCH DAMAGE.
00028  */
00029 
00030 /*
00031  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
00032  * Copyright (c) 1996-1999 by Internet Software Consortium.
00033  *
00034  * Permission to use, copy, modify, and distribute this software for any
00035  * purpose with or without fee is hereby granted, provided that the above
00036  * copyright notice and this permission notice appear in all copies.
00037  *
00038  * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
00039  * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
00040  * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
00041  * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
00042  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
00043  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
00044  * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
00045  * SOFTWARE.
00046  */
00047 
00048 /*
00049  *     $BINDId: nameser.h,v 8.37 2000/03/30 21:16:49 vixie Exp $
00050  */
00051 
00052 #ifndef _ARPA_NAMESER_H_
00053 #define _ARPA_NAMESER_H_
00054 
00057 #define BIND_4_COMPAT
00058 
00059 #include <sys/param.h>
00060 #if (!defined(BSD)) || (BSD < 199306)
00061 # include <sys/bitypes.h>
00062 #else
00063 # include <sys/types.h>
00064 #endif
00065 #include <sys/cdefs.h>
00066 
00067 /*%
00068  * Revision information.  This is the release date in YYYYMMDD format.
00069  * It can change every day so the right thing to do with it is use it
00070  * in preprocessor commands such as "#if (__NAMESER > 19931104)".  Do not
00071  * compare for equality; rather, use it to determine whether your libbind.a
00072  * contains a new enough lib/nameser/ to support the feature you need.
00073  */
00074 
00075 #define __NAMESER    19991006      /*%< New interface version stamp. */
00076 /*
00077  * Define constants based on RFC 883, RFC 1034, RFC 1035
00078  */
00079 #define NS_PACKETSZ  512    /*%< default UDP packet size */
00080 #define NS_MAXDNAME  1025   /*%< maximum domain name */
00081 #define NS_MAXMSG    65535  /*%< maximum message size */
00082 #define NS_MAXCDNAME 255    /*%< maximum compressed domain name */
00083 #define NS_MAXLABEL  63     /*%< maximum length of domain label */
00084 #define NS_HFIXEDSZ  12     /*%< #/bytes of fixed data in header */
00085 #define NS_QFIXEDSZ  4      /*%< #/bytes of fixed data in query */
00086 #define NS_RRFIXEDSZ 10     /*%< #/bytes of fixed data in r record */
00087 #define NS_INT32SZ   4      /*%< #/bytes of data in a u_int32_t */
00088 #define NS_INT16SZ   2      /*%< #/bytes of data in a u_int16_t */
00089 #define NS_INT8SZ    1      /*%< #/bytes of data in a u_int8_t */
00090 #define NS_INADDRSZ  4      /*%< IPv4 T_A */
00091 #define NS_IN6ADDRSZ 16     /*%< IPv6 T_AAAA */
00092 #define NS_CMPRSFLGS 0xc0   /*%< Flag bits indicating name compression. */
00093 #define NS_DEFAULTPORT      53     /*%< For both TCP and UDP. */
00094 /*
00095  * These can be expanded with synonyms, just keep ns_parse.c:ns_parserecord()
00096  * in synch with it.
00097  */
00098 typedef enum __ns_sect {
00099        ns_s_qd = 0,         /*%< Query: Question. */
00100        ns_s_zn = 0,         /*%< Update: Zone. */
00101        ns_s_an = 1,         /*%< Query: Answer. */
00102        ns_s_pr = 1,         /*%< Update: Prerequisites. */
00103        ns_s_ns = 2,         /*%< Query: Name servers. */
00104        ns_s_ud = 2,         /*%< Update: Update. */
00105        ns_s_ar = 3,         /*%< Query|Update: Additional records. */
00106        ns_s_max = 4
00107 } ns_sect;
00108 
00109 /*%
00110  * This is a message handle.  It is caller allocated and has no dynamic data.
00111  * This structure is intended to be opaque to all but ns_parse.c, thus the
00112  * leading _'s on the member names.  Use the accessor functions, not the _'s.
00113  */
00114 typedef struct __ns_msg {
00115        const u_char  *_msg, *_eom;
00116        u_int16_t     _id, _flags, _counts[ns_s_max];
00117        const u_char  *_sections[ns_s_max];
00118        ns_sect              _sect;
00119        int           _rrnum;
00120        const u_char  *_msg_ptr;
00121 } ns_msg;
00122 
00123 /* Private data structure - do not use from outside library. */
00124 struct _ns_flagdata {  int mask, shift;  };
00125 extern const struct _ns_flagdata _ns_flagdata[];
00126 
00127 /* Accessor macros - this is part of the public interface. */
00128 
00129 #define ns_msg_id(handle) ((handle)._id + 0)
00130 #define ns_msg_base(handle) ((handle)._msg + 0)
00131 #define ns_msg_end(handle) ((handle)._eom + 0)
00132 #define ns_msg_size(handle) ((handle)._eom - (handle)._msg)
00133 #define ns_msg_count(handle, section) ((handle)._counts[section] + 0)
00134 
00135 /*%
00136  * This is a parsed record.  It is caller allocated and has no dynamic data.
00137  */
00138 typedef       struct __ns_rr {
00139        char          name[NS_MAXDNAME];
00140        u_int16_t     type;
00141        u_int16_t     rr_class;
00142        u_int32_t     ttl;
00143        u_int16_t     rdlength;
00144        const u_char *       rdata;
00145 } ns_rr;
00146 
00147 /* Accessor macros - this is part of the public interface. */
00148 #define ns_rr_name(rr)      (((rr).name[0] != '\0') ? (rr).name : ".")
00149 #define ns_rr_type(rr)      ((ns_type)((rr).type + 0))
00150 #define ns_rr_class(rr)     ((ns_class)((rr).rr_class + 0))
00151 #define ns_rr_ttl(rr)       ((rr).ttl + 0)
00152 #define ns_rr_rdlen(rr)     ((rr).rdlength + 0)
00153 #define ns_rr_rdata(rr)     ((rr).rdata + 0)
00154 
00155 /*%
00156  * These don't have to be in the same order as in the packet flags word,
00157  * and they can even overlap in some cases, but they will need to be kept
00158  * in synch with ns_parse.c:ns_flagdata[].
00159  */
00160 typedef enum __ns_flag {
00161        ns_f_qr,             /*%< Question/Response. */
00162        ns_f_opcode,         /*%< Operation code. */
00163        ns_f_aa,             /*%< Authoritative Answer. */
00164        ns_f_tc,             /*%< Truncation occurred. */
00165        ns_f_rd,             /*%< Recursion Desired. */
00166        ns_f_ra,             /*%< Recursion Available. */
00167        ns_f_z,                     /*%< MBZ. */
00168        ns_f_ad,             /*%< Authentic Data (DNSSEC). */
00169        ns_f_cd,             /*%< Checking Disabled (DNSSEC). */
00170        ns_f_rcode,          /*%< Response code. */
00171        ns_f_max
00172 } ns_flag;
00173 
00174 /*%
00175  * Currently defined opcodes.
00176  */
00177 typedef enum __ns_opcode {
00178        ns_o_query = 0,             /*%< Standard query. */
00179        ns_o_iquery = 1,     /*%< Inverse query (deprecated/unsupported). */
00180        ns_o_status = 2,     /*%< Name server status query (unsupported). */
00181                             /* Opcode 3 is undefined/reserved. */
00182        ns_o_notify = 4,     /*%< Zone change notification. */
00183        ns_o_update = 5,     /*%< Zone update message. */
00184        ns_o_max = 6
00185 } ns_opcode;
00186 
00187 /*%
00188  * Currently defined response codes.
00189  */
00190 typedef       enum __ns_rcode {
00191        ns_r_noerror = 0,    /*%< No error occurred. */
00192        ns_r_formerr = 1,    /*%< Format error. */
00193        ns_r_servfail = 2,   /*%< Server failure. */
00194        ns_r_nxdomain = 3,   /*%< Name error. */
00195        ns_r_notimpl = 4,    /*%< Unimplemented. */
00196        ns_r_refused = 5,    /*%< Operation refused. */
00197        /* these are for BIND_UPDATE */
00198        ns_r_yxdomain = 6,   /*%< Name exists */
00199        ns_r_yxrrset = 7,    /*%< RRset exists */
00200        ns_r_nxrrset = 8,    /*%< RRset does not exist */
00201        ns_r_notauth = 9,    /*%< Not authoritative for zone */
00202        ns_r_notzone = 10,   /*%< Zone of record different from zone section */
00203        ns_r_max = 11,
00204        /* The following are EDNS extended rcodes */
00205        ns_r_badvers = 16,
00206        /* The following are TSIG errors */
00207        ns_r_badsig = 16,
00208        ns_r_badkey = 17,
00209        ns_r_badtime = 18
00210 } ns_rcode;
00211 
00212 /* BIND_UPDATE */
00213 typedef enum __ns_update_operation {
00214        ns_uop_delete = 0,
00215        ns_uop_add = 1,
00216        ns_uop_max = 2
00217 } ns_update_operation;
00218 
00219 /*%
00220  * This structure is used for TSIG authenticated messages
00221  */
00222 struct ns_tsig_key {
00223         char name[NS_MAXDNAME], alg[NS_MAXDNAME];
00224         unsigned char *data;
00225         int len;
00226 };
00227 typedef struct ns_tsig_key ns_tsig_key;
00228 
00229 /*%
00230  * This structure is used for TSIG authenticated TCP messages
00231  */
00232 struct ns_tcp_tsig_state {
00233        int counter;
00234        struct dst_key *key;
00235        void *ctx;
00236        unsigned char sig[NS_PACKETSZ];
00237        int siglen;
00238 };
00239 typedef struct ns_tcp_tsig_state ns_tcp_tsig_state;
00240 
00241 #define NS_TSIG_FUDGE 300
00242 #define NS_TSIG_TCP_COUNT 100
00243 #define NS_TSIG_ALG_HMAC_MD5 "HMAC-MD5.SIG-ALG.REG.INT"
00244 
00245 #define NS_TSIG_ERROR_NO_TSIG -10
00246 #define NS_TSIG_ERROR_NO_SPACE -11
00247 #define NS_TSIG_ERROR_FORMERR -12
00248 
00249 /*%
00250  * Currently defined type values for resources and queries.
00251  */
00252 typedef enum __ns_type {
00253        ns_t_invalid = 0,    /*%< Cookie. */
00254        ns_t_a = 1,          /*%< Host address. */
00255        ns_t_ns = 2,         /*%< Authoritative server. */
00256        ns_t_md = 3,         /*%< Mail destination. */
00257        ns_t_mf = 4,         /*%< Mail forwarder. */
00258        ns_t_cname = 5,             /*%< Canonical name. */
00259        ns_t_soa = 6,        /*%< Start of authority zone. */
00260        ns_t_mb = 7,         /*%< Mailbox domain name. */
00261        ns_t_mg = 8,         /*%< Mail group member. */
00262        ns_t_mr = 9,         /*%< Mail rename name. */
00263        ns_t_null = 10,             /*%< Null resource record. */
00264        ns_t_wks = 11,              /*%< Well known service. */
00265        ns_t_ptr = 12,              /*%< Domain name pointer. */
00266        ns_t_hinfo = 13,     /*%< Host information. */
00267        ns_t_minfo = 14,     /*%< Mailbox information. */
00268        ns_t_mx = 15,        /*%< Mail routing information. */
00269        ns_t_txt = 16,              /*%< Text strings. */
00270        ns_t_rp = 17,        /*%< Responsible person. */
00271        ns_t_afsdb = 18,     /*%< AFS cell database. */
00272        ns_t_x25 = 19,              /*%< X_25 calling address. */
00273        ns_t_isdn = 20,             /*%< ISDN calling address. */
00274        ns_t_rt = 21,        /*%< Router. */
00275        ns_t_nsap = 22,             /*%< NSAP address. */
00276        ns_t_nsap_ptr = 23,  /*%< Reverse NSAP lookup (deprecated). */
00277        ns_t_sig = 24,              /*%< Security signature. */
00278        ns_t_key = 25,              /*%< Security key. */
00279        ns_t_px = 26,        /*%< X.400 mail mapping. */
00280        ns_t_gpos = 27,             /*%< Geographical position (withdrawn). */
00281        ns_t_aaaa = 28,             /*%< Ip6 Address. */
00282        ns_t_loc = 29,              /*%< Location Information. */
00283        ns_t_nxt = 30,              /*%< Next domain (security). */
00284        ns_t_eid = 31,              /*%< Endpoint identifier. */
00285        ns_t_nimloc = 32,    /*%< Nimrod Locator. */
00286        ns_t_srv = 33,              /*%< Server Selection. */
00287        ns_t_atma = 34,             /*%< ATM Address */
00288        ns_t_naptr = 35,     /*%< Naming Authority PoinTeR */
00289        ns_t_kx = 36,        /*%< Key Exchange */
00290        ns_t_cert = 37,             /*%< Certification record */
00291        ns_t_a6 = 38,        /*%< IPv6 address (deprecated, use ns_t_aaaa) */
00292        ns_t_dname = 39,     /*%< Non-terminal DNAME (for IPv6) */
00293        ns_t_sink = 40,             /*%< Kitchen sink (experimentatl) */
00294        ns_t_opt = 41,              /*%< EDNS0 option (meta-RR) */
00295        ns_t_apl = 42,              /*%< Address prefix list (RFC3123) */
00296        ns_t_tkey = 249,     /*%< Transaction key */
00297        ns_t_tsig = 250,     /*%< Transaction signature. */
00298        ns_t_ixfr = 251,     /*%< Incremental zone transfer. */
00299        ns_t_axfr = 252,     /*%< Transfer zone of authority. */
00300        ns_t_mailb = 253,    /*%< Transfer mailbox records. */
00301        ns_t_maila = 254,    /*%< Transfer mail agent records. */
00302        ns_t_any = 255,             /*%< Wildcard match. */
00303        ns_t_zxfr = 256,     /*%< BIND-specific, nonstandard. */
00304        ns_t_max = 65536
00305 } ns_type;
00306 
00307 /* Exclusively a QTYPE? (not also an RTYPE) */
00308 #define       ns_t_qt_p(t) (ns_t_xfr_p(t) || (t) == ns_t_any || \
00309                     (t) == ns_t_mailb || (t) == ns_t_maila)
00310 /* Some kind of meta-RR? (not a QTYPE, but also not an RTYPE) */
00311 #define       ns_t_mrr_p(t) ((t) == ns_t_tsig || (t) == ns_t_opt)
00312 /* Exclusively an RTYPE? (not also a QTYPE or a meta-RR) */
00313 #define ns_t_rr_p(t) (!ns_t_qt_p(t) && !ns_t_mrr_p(t))
00314 #define ns_t_udp_p(t) ((t) != ns_t_axfr && (t) != ns_t_zxfr)
00315 #define ns_t_xfr_p(t) ((t) == ns_t_axfr || (t) == ns_t_ixfr || \
00316                      (t) == ns_t_zxfr)
00317 
00318 /*%
00319  * Values for class field
00320  */
00321 typedef enum __ns_class {
00322        ns_c_invalid = 0,    /*%< Cookie. */
00323        ns_c_in = 1,         /*%< Internet. */
00324        ns_c_2 = 2,          /*%< unallocated/unsupported. */
00325        ns_c_chaos = 3,             /*%< MIT Chaos-net. */
00326        ns_c_hs = 4,         /*%< MIT Hesiod. */
00327        /* Query class values which do not appear in resource records */
00328        ns_c_none = 254,     /*%< for prereq. sections in update requests */
00329        ns_c_any = 255,             /*%< Wildcard match. */
00330        ns_c_max = 65536
00331 } ns_class;
00332 
00333 /* DNSSEC constants. */
00334 
00335 typedef enum __ns_key_types {
00336        ns_kt_rsa = 1,              /*%< key type RSA/MD5 */
00337        ns_kt_dh  = 2,              /*%< Diffie Hellman */
00338        ns_kt_dsa = 3,              /*%< Digital Signature Standard (MANDATORY) */
00339        ns_kt_private = 254  /*%< Private key type starts with OID */
00340 } ns_key_types;
00341 
00342 typedef enum __ns_cert_types {
00343        cert_t_pkix = 1,     /*%< PKIX (X.509v3) */
00344        cert_t_spki = 2,     /*%< SPKI */
00345        cert_t_pgp  = 3,     /*%< PGP */
00346        cert_t_url  = 253,   /*%< URL private type */
00347        cert_t_oid  = 254    /*%< OID private type */
00348 } ns_cert_types;
00349 
00350 /* Flags field of the KEY RR rdata. */
00351 #define       NS_KEY_TYPEMASK             0xC000 /*%< Mask for "type" bits */
00352 #define       NS_KEY_TYPE_AUTH_CONF       0x0000 /*%< Key usable for both */
00353 #define       NS_KEY_TYPE_CONF_ONLY       0x8000 /*%< Key usable for confidentiality */
00354 #define       NS_KEY_TYPE_AUTH_ONLY       0x4000 /*%< Key usable for authentication */
00355 #define       NS_KEY_TYPE_NO_KEY   0xC000 /*%< No key usable for either; no key */
00356 /* The type bits can also be interpreted independently, as single bits: */
00357 #define       NS_KEY_NO_AUTH              0x8000 /*%< Key unusable for authentication */
00358 #define       NS_KEY_NO_CONF              0x4000 /*%< Key unusable for confidentiality */
00359 #define       NS_KEY_RESERVED2     0x2000 /* Security is *mandatory* if bit=0 */
00360 #define       NS_KEY_EXTENDED_FLAGS       0x1000 /*%< reserved - must be zero */
00361 #define       NS_KEY_RESERVED4     0x0800  /*%< reserved - must be zero */
00362 #define       NS_KEY_RESERVED5     0x0400  /*%< reserved - must be zero */
00363 #define       NS_KEY_NAME_TYPE     0x0300 /*%< these bits determine the type */
00364 #define       NS_KEY_NAME_USER     0x0000 /*%< key is assoc. with user */
00365 #define       NS_KEY_NAME_ENTITY   0x0200 /*%< key is assoc. with entity eg host */
00366 #define       NS_KEY_NAME_ZONE     0x0100 /*%< key is zone key */
00367 #define       NS_KEY_NAME_RESERVED 0x0300 /*%< reserved meaning */
00368 #define       NS_KEY_RESERVED8     0x0080  /*%< reserved - must be zero */
00369 #define       NS_KEY_RESERVED9     0x0040  /*%< reserved - must be zero */
00370 #define       NS_KEY_RESERVED10    0x0020  /*%< reserved - must be zero */
00371 #define       NS_KEY_RESERVED11    0x0010  /*%< reserved - must be zero */
00372 #define       NS_KEY_SIGNATORYMASK 0x000F /*%< key can sign RR's of same name */
00373 #define       NS_KEY_RESERVED_BITMASK ( NS_KEY_RESERVED2 | \
00374                               NS_KEY_RESERVED4 | \
00375                               NS_KEY_RESERVED5 | \
00376                               NS_KEY_RESERVED8 | \
00377                               NS_KEY_RESERVED9 | \
00378                               NS_KEY_RESERVED10 | \
00379                               NS_KEY_RESERVED11 )
00380 #define NS_KEY_RESERVED_BITMASK2 0xFFFF /*%< no bits defined here */
00381 /* The Algorithm field of the KEY and SIG RR's is an integer, {1..254} */
00382 #define       NS_ALG_MD5RSA        1      /*%< MD5 with RSA */
00383 #define       NS_ALG_DH               2   /*%< Diffie Hellman KEY */
00384 #define       NS_ALG_DSA              3   /*%< DSA KEY */
00385 #define       NS_ALG_DSS              NS_ALG_DSA
00386 #define       NS_ALG_EXPIRE_ONLY   253    /*%< No alg, no security */
00387 #define       NS_ALG_PRIVATE_OID   254    /*%< Key begins with OID giving alg */
00388 /* Protocol values  */
00389 /* value 0 is reserved */
00390 #define NS_KEY_PROT_TLS         1
00391 #define NS_KEY_PROT_EMAIL       2
00392 #define NS_KEY_PROT_DNSSEC      3
00393 #define NS_KEY_PROT_IPSEC       4
00394 #define NS_KEY_PROT_ANY            255
00395 
00396 /* Signatures */
00397 #define       NS_MD5RSA_MIN_BITS    512   /*%< Size of a mod or exp in bits */
00398 #define       NS_MD5RSA_MAX_BITS   4096
00399        /* Total of binary mod and exp */
00400 #define       NS_MD5RSA_MAX_BYTES  ((NS_MD5RSA_MAX_BITS+7/8)*2+3)
00401        /* Max length of text sig block */
00402 #define       NS_MD5RSA_MAX_BASE64 (((NS_MD5RSA_MAX_BYTES+2)/3)*4)
00403 #define NS_MD5RSA_MIN_SIZE  ((NS_MD5RSA_MIN_BITS+7)/8)
00404 #define NS_MD5RSA_MAX_SIZE  ((NS_MD5RSA_MAX_BITS+7)/8)
00405 
00406 #define NS_DSA_SIG_SIZE         41
00407 #define NS_DSA_MIN_SIZE         213
00408 #define NS_DSA_MAX_BYTES        405
00409 
00410 /* Offsets into SIG record rdata to find various values */
00411 #define       NS_SIG_TYPE   0      /*%< Type flags */
00412 #define       NS_SIG_ALG    2      /*%< Algorithm */
00413 #define       NS_SIG_LABELS 3      /*%< How many labels in name */
00414 #define       NS_SIG_OTTL   4      /*%< Original TTL */
00415 #define       NS_SIG_EXPIR  8      /*%< Expiration time */
00416 #define       NS_SIG_SIGNED 12     /*%< Signature time */
00417 #define       NS_SIG_FOOT   16     /*%< Key footprint */
00418 #define       NS_SIG_SIGNER 18     /*%< Domain name of who signed it */
00419 /* How RR types are represented as bit-flags in NXT records */
00420 #define       NS_NXT_BITS 8
00421 #define       NS_NXT_BIT_SET(  n,p) (p[(n)/NS_NXT_BITS] |=  (0x80>>((n)%NS_NXT_BITS)))
00422 #define       NS_NXT_BIT_CLEAR(n,p) (p[(n)/NS_NXT_BITS] &= ~(0x80>>((n)%NS_NXT_BITS)))
00423 #define       NS_NXT_BIT_ISSET(n,p) (p[(n)/NS_NXT_BITS] &   (0x80>>((n)%NS_NXT_BITS)))
00424 #define NS_NXT_MAX 127
00425 
00426 /*%
00427  * EDNS0 extended flags and option codes, host order.
00428  */
00429 #define NS_OPT_DNSSEC_OK        0x8000U
00430 #define NS_OPT_NSID         3
00431 
00432 /*%
00433  * Inline versions of get/put short/long.  Pointer is advanced.
00434  */
00435 #define NS_GET16(s, cp) do { \
00436        register const u_char *t_cp = (const u_char *)(cp); \
00437        (s) = ((u_int16_t)t_cp[0] << 8) \
00438            | ((u_int16_t)t_cp[1]) \
00439            ; \
00440        (cp) += NS_INT16SZ; \
00441 } while (0)
00442 
00443 #define NS_GET32(l, cp) do { \
00444        register const u_char *t_cp = (const u_char *)(cp); \
00445        (l) = ((u_int32_t)t_cp[0] << 24) \
00446            | ((u_int32_t)t_cp[1] << 16) \
00447            | ((u_int32_t)t_cp[2] << 8) \
00448            | ((u_int32_t)t_cp[3]) \
00449            ; \
00450        (cp) += NS_INT32SZ; \
00451 } while (0)
00452 
00453 #define NS_PUT16(s, cp) do { \
00454        register u_int16_t t_s = (u_int16_t)(s); \
00455        register u_char *t_cp = (u_char *)(cp); \
00456        *t_cp++ = t_s >> 8; \
00457        *t_cp   = t_s; \
00458        (cp) += NS_INT16SZ; \
00459 } while (0)
00460 
00461 #define NS_PUT32(l, cp) do { \
00462        register u_int32_t t_l = (u_int32_t)(l); \
00463        register u_char *t_cp = (u_char *)(cp); \
00464        *t_cp++ = t_l >> 24; \
00465        *t_cp++ = t_l >> 16; \
00466        *t_cp++ = t_l >> 8; \
00467        *t_cp   = t_l; \
00468        (cp) += NS_INT32SZ; \
00469 } while (0)
00470 
00471 __BEGIN_DECLS
00472 int           ns_msg_getflag (ns_msg, int) __THROW;
00473 u_int         ns_get16 (const u_char *) __THROW;
00474 u_long        ns_get32 (const u_char *) __THROW;
00475 void          ns_put16 (u_int, u_char *) __THROW;
00476 void          ns_put32 (u_long, u_char *) __THROW;
00477 int           ns_initparse (const u_char *, int, ns_msg *) __THROW;
00478 int           ns_skiprr (const u_char *, const u_char *, ns_sect, int)
00479      __THROW;
00480 int           ns_parserr (ns_msg *, ns_sect, int, ns_rr *) __THROW;
00481 int           ns_sprintrr (const ns_msg *, const ns_rr *,
00482                           const char *, const char *, char *, size_t)
00483      __THROW;
00484 int           ns_sprintrrf (const u_char *, size_t, const char *,
00485                            ns_class, ns_type, u_long, const u_char *,
00486                            size_t, const char *, const char *,
00487                            char *, size_t) __THROW;
00488 int           ns_format_ttl (u_long, char *, size_t) __THROW;
00489 int           ns_parse_ttl (const char *, u_long *) __THROW;
00490 u_int32_t     ns_datetosecs (const char *cp, int *errp) __THROW;
00491 int           ns_name_ntol (const u_char *, u_char *, size_t) __THROW;
00492 int           ns_name_ntop (const u_char *, char *, size_t) __THROW;
00493 int           ns_name_pton (const char *, u_char *, size_t) __THROW;
00494 int           ns_name_unpack (const u_char *, const u_char *,
00495                             const u_char *, u_char *, size_t) __THROW;
00496 int           ns_name_pack (const u_char *, u_char *, int,
00497                            const u_char **, const u_char **) __THROW;
00498 int           ns_name_uncompress (const u_char *, const u_char *,
00499                                 const u_char *, char *, size_t) __THROW;
00500 int           ns_name_compress (const char *, u_char *, size_t,
00501                               const u_char **, const u_char **) __THROW;
00502 int           ns_name_skip (const u_char **, const u_char *) __THROW;
00503 void          ns_name_rollback (const u_char *, const u_char **,
00504                               const u_char **) __THROW;
00505 int           ns_sign (u_char *, int *, int, int, void *,
00506                       const u_char *, int, u_char *, int *, time_t) __THROW;
00507 int           ns_sign2 (u_char *, int *, int, int, void *,
00508                        const u_char *, int, u_char *, int *, time_t,
00509                        u_char **, u_char **) __THROW;
00510 int           ns_sign_tcp (u_char *, int *, int, int,
00511                           ns_tcp_tsig_state *, int) __THROW;
00512 int           ns_sign_tcp2 (u_char *, int *, int, int,
00513                            ns_tcp_tsig_state *, int,
00514                            u_char **, u_char **) __THROW;
00515 int           ns_sign_tcp_init (void *, const u_char *, int,
00516                               ns_tcp_tsig_state *) __THROW;
00517 u_char        *ns_find_tsig (u_char *, u_char *) __THROW;
00518 int           ns_verify (u_char *, int *, void *, const u_char *, int,
00519                         u_char *, int *, time_t *, int) __THROW;
00520 int           ns_verify_tcp (u_char *, int *, ns_tcp_tsig_state *, int)
00521      __THROW;
00522 int           ns_verify_tcp_init (void *, const u_char *, int,
00523                                 ns_tcp_tsig_state *) __THROW;
00524 int           ns_samedomain (const char *, const char *) __THROW;
00525 int           ns_subdomain (const char *, const char *) __THROW;
00526 int           ns_makecanon (const char *, char *, size_t) __THROW;
00527 int           ns_samename (const char *, const char *) __THROW;
00528 __END_DECLS
00529 
00530 #ifdef BIND_4_COMPAT
00531 #include <arpa/nameser_compat.h>
00532 #endif
00533 
00534 #endif /* !_ARPA_NAMESER_H_ */
00535