/********************************************************Copyright.IBM*****/
/*                                                                        */
/*                                                                        */
/*      Multi-Protocol Transport Services - nameser.h                     */
/*                                                                        */
/*      Licensed Materials - Property of IBM (R)                          */
/*      5622-069                                                          */
/*      (C) Copyright IBM Corp. 1993, All right reserved.                 */
/*      US Government Users Restricted Rights - Use, duplication,         */
/*      disclosure restricted by GSA ADP Schedule Contract with IBM Corp. */
/*                                                                        */
/********************************************************Copyright.IBM*****/




/*
 * Copyright (c) 1983 Regents of the University of California.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms are permitted
 * provided that the above copyright notice and this paragraph are
 * duplicated in all such forms and that any documentation,
 * advertising materials, and other materials related to such
 * distribution and use acknowledge that the software was developed
 * by the University of California, Berkeley.  The name of the
 * University may not be used to endorse or promote products derived
 * from this software without specific prior written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 *
 *      @(#)nameser.h   5.20 (Berkeley) 10/7/88
 */

/*
 * 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           0               /* standard query */
#define IQUERY          1               /* inverse query */
#define CQUERYM         2               /* completion query (multiple) */
#define CQUERYU         3               /* completion query (unique) */
        /* non standard */
#define UPDATEA         100             /* add resource record */
#define UPDATED         101             /* delete resource record */
#define UPDATEM         102             /* modify resource record */
#define ZONEINIT        103             /* initial zone transfer */
#define ZONEREF         104             /* 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        100             /* 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 */
        /* non standard */
#define T_UINFO         100             /* user (finger) information */
#define T_UID           101             /* user ID */
#define T_GID           102             /* group ID */
        /* 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 */
        /* Query class values which do not appear in resource records */
#define C_ANY           255             /* wildcard match */

/*
 * 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 */
#ifdef OS2
#if defined(__32BIT__) && defined(__IBMC__)
        u_int   rd:1;           /* recursion desired */
        u_int   tc:1;           /* truncated message */
        u_int   aa:1;           /* authoritive answer */
        u_int   opcode:4;       /* purpose of message */
        u_int   qr:1;           /* response flag */
                        /* fields in fourth byte */
        u_int   rcode:4;        /* response code */
        u_int   unused:2;       /* unused bits */
        u_int   pr:1;           /* primary server required (non standard) */
        u_int   ra:1;           /* recursion available */
#else
        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 */
#endif
#else
#if defined (sun) || defined (sel) || defined (pyr) || defined (is68k) \
|| defined (tahoe) || defined (ibm032) || defined (ibm370) \
|| defined (BIT_ZERO_ON_LEFT)
        /* Bit zero on left:  Gould 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 (vax) || defined (BIT_ZERO_ON_RIGHT)
        /* Bit zero on right:  VAX */
                        /* 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
#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();
