|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1985, 1990 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted provided ! 6: * that: (1) source distributions retain this entire copyright notice and ! 7: * comment, and (2) distributions including binaries display the following ! 8: * acknowledgement: ``This product includes software developed by the ! 9: * University of California, Berkeley and its contributors'' in the ! 10: * documentation or other materials provided with the distribution and in ! 11: * all advertising materials mentioning features or use of this software. ! 12: * Neither the name of the University nor the names of its contributors may ! 13: * be used to endorse or promote products derived from this software without ! 14: * specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 16: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 17: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: * ! 19: * @(#)ns.h 4.31 (Berkeley) 6/1/90 ! 20: */ ! 21: ! 22: /* ! 23: * Global definitions and variables for the name server. ! 24: */ ! 25: ! 26: #include <arpa/inet.h> ! 27: #include <string.h> ! 28: ! 29: /* ! 30: * Timeout time should be around 1 minute or so. Using the ! 31: * the current simplistic backoff strategy, the sequence ! 32: * retrys after 4, 8, and 16 seconds. With 3 servers, this ! 33: * dies out in a little more than a minute. ! 34: * (sequence RETRYBASE, 2*RETRYBASE, 4*RETRYBASE... for MAXRETRY) ! 35: */ ! 36: #define MINROOTS 2 /* min number of root hints */ ! 37: #define NSMAX 16 /* max number of NS addrs to try */ ! 38: #define RETRYBASE 4 /* base time between retries */ ! 39: #define MAXRETRY 3 /* max number of retries per addr */ ! 40: #define MAXCNAMES 8 /* max # of CNAMES tried per addr */ ! 41: #define MAXQUERIES 20 /* max # of queries to be made */ ! 42: /* (prevent "recursive" loops) */ ! 43: #define INIT_REFRESH 600 /* retry time for initial secondary */ ! 44: /* contact (10 minutes) */ ! 45: ! 46: #define ALPHA 0.7 /* How much to preserver of old response time */ ! 47: #define BETA 1.2 /* How much to penalize response time on failure */ ! 48: #define GAMMA 0.98 /* How much to decay unused response times */ ! 49: ! 50: struct zoneinfo { ! 51: int z_type; /* type of zone */ ! 52: int z_auth; /* zone is authoritative */ ! 53: char *z_origin; /* root domain name of zone */ ! 54: time_t z_time; /* time for next refresh */ ! 55: time_t z_lastupdate; /* time of last refresh */ ! 56: u_long z_refresh; /* refresh interval */ ! 57: u_long z_retry; /* refresh retry interval */ ! 58: u_long z_expire; /* expiration time for cached info */ ! 59: u_long z_minimum; /* minimum TTL value */ ! 60: u_long z_serial; /* changes if zone modified */ ! 61: char *z_source; /* source location of data */ ! 62: time_t z_ftime; /* modification time of source file */ ! 63: int z_addrcnt; /* address count */ ! 64: struct in_addr z_addr[NSMAX]; /* list of master servers for zone */ ! 65: int z_state; /* state bits; see below */ ! 66: u_short z_xferpid; /* xfer child pid */ ! 67: #ifdef ALLOW_UPDATES ! 68: int hasChanged; /* non-zero if zone has been updated ! 69: * since last checkpoint ! 70: */ ! 71: #endif ALLOW_UPDATES ! 72: }; ! 73: ! 74: /* zone types (z_type) */ ! 75: #define Z_PRIMARY 1 ! 76: #define Z_SECONDARY 2 ! 77: #define Z_CACHE 3 ! 78: ! 79: /* zone state bits */ ! 80: #define Z_AUTH 0x01 /* should replace z_auth */ ! 81: #define Z_NEED_XFER 0x02 /* waiting to do xfer */ ! 82: #define Z_XFER_RUNNING 0x04 /* asynch. xfer is running */ ! 83: #define Z_NEED_RELOAD 0x08 /* waiting to do reload */ ! 84: #define Z_SYSLOGGED 0x10 /* have logged timeout */ ! 85: #define Z_CHANGED 0x20 /* should replace hasChanged */ ! 86: #define Z_FOUND 0x40 /* found in boot file when reloading */ ! 87: #define Z_INCLUDE 0x80 /* set if include used in file */ ! 88: #define Z_DB_BAD 0x100 /* errors when loading file */ ! 89: #define Z_TMP_FILE 0x200 /* backup file for xfer is temporary */ ! 90: #ifdef ALLOW_UPDATES ! 91: #define Z_DYNAMIC 0x400 /* allow dynamic updates */ ! 92: #define Z_DYNADDONLY 0x800 /* dynamic mode: add new data only */ ! 93: #endif ALLOW_UPDATES ! 94: ! 95: /* xfer exit codes */ ! 96: #define XFER_UPTODATE 0 /* zone is up-to-date */ ! 97: #define XFER_SUCCESS 1 /* performed transfer successfully */ ! 98: #define XFER_TIMEOUT 2 /* no server reachable/xfer timeout */ ! 99: #define XFER_FAIL 3 /* other failure, has been logged */ ! 100: ! 101: /* ! 102: * Structure for recording info on forwarded queries. ! 103: */ ! 104: struct qinfo { ! 105: u_short q_id; /* id of query */ ! 106: u_short q_nsid; /* id of forwarded query */ ! 107: int q_dfd; /* UDP file descriptor */ ! 108: struct sockaddr_in q_from; /* requestor's address */ ! 109: char *q_msg; /* the message */ ! 110: int q_msglen; /* len of message */ ! 111: int q_naddr; /* number of addr's in q_addr */ ! 112: int q_curaddr; /* last addr sent to */ ! 113: struct fwdinfo *q_fwd; /* last forwarder used */ ! 114: time_t q_time; /* time to retry */ ! 115: struct qinfo *q_next; /* rexmit list (sorted by time) */ ! 116: struct qinfo *q_link; /* storage list (random order) */ ! 117: struct qserv { ! 118: struct sockaddr_in ns_addr; /* addresses of NS's */ ! 119: struct databuf *ns; /* databuf for NS record */ ! 120: struct databuf *nsdata; /* databuf for server address */ ! 121: struct timeval stime; /* time first query started */ ! 122: int nretry; /* # of times addr retried */ ! 123: } q_addr[NSMAX]; /* addresses of NS's */ ! 124: struct databuf *q_usedns[NSMAX]; /* databuf for NS that we've tried */ ! 125: int q_nusedns; ! 126: int q_cname; /* # of cnames found */ ! 127: int q_nqueries; /* # of queries required */ ! 128: char *q_cmsg; /* the cname message */ ! 129: int q_cmsglen; /* len of cname message */ ! 130: struct qstream *q_stream; /* TCP stream, null if UDP */ ! 131: int q_system; /* boolean, system query */ ! 132: }; ! 133: ! 134: #define Q_NEXTADDR(qp,n) \ ! 135: (((qp)->q_fwd == (struct fwdinfo *)0) ? \ ! 136: &(qp)->q_addr[n].ns_addr : &(qp)->q_fwd->fwdaddr) ! 137: ! 138: #define PRIMING_CACHE 42 ! 139: #define QINFO_NULL ((struct qinfo *)0) ! 140: ! 141: #ifndef XFER ! 142: extern struct qinfo *qfindid(); ! 143: extern struct qinfo *qnew(); ! 144: extern struct qinfo *retryqp; /* next query to retry */ ! 145: #endif /* XFER */ ! 146: ! 147: /* ! 148: * Return codes from ns_forw: ! 149: */ ! 150: #define FW_OK 0 ! 151: #define FW_DUP 1 ! 152: #define FW_NOSERVER 2 ! 153: #define FW_SERVFAIL 3 ! 154: ! 155: struct qstream { ! 156: int s_rfd; /* stream file descriptor */ ! 157: int s_size; /* expected amount of data to recive */ ! 158: int s_bufsize; /* amount of data recived in s_buf */ ! 159: char *s_buf; /* buffer of recived data */ ! 160: char *s_bufp; /* pointer into s_buf of recived data */ ! 161: struct qstream *s_next; /* next stream */ ! 162: struct sockaddr_in s_from; /* address query came from */ ! 163: u_long s_time; /* time stamp of last transaction */ ! 164: int s_refcnt; /* number of outstanding queries */ ! 165: u_short s_tempsize; /* temporary for size from net */ ! 166: }; ! 167: ! 168: #define QSTREAM_NULL ((struct qstream *)0) ! 169: extern struct qstream *streamq; /* stream queue */ ! 170: ! 171: struct qdatagram { ! 172: int dq_dfd; /* datagram file descriptor */ ! 173: struct qdatagram *dq_next; /* next datagram */ ! 174: struct in_addr dq_addr; /* address of interface */ ! 175: }; ! 176: ! 177: #define QDATAGRAM_NULL ((struct qdatagram *)0) ! 178: extern struct qdatagram *datagramq; /* datagram queue */ ! 179: ! 180: struct netinfo { ! 181: struct netinfo *next; ! 182: u_long net; ! 183: u_long mask; ! 184: struct in_addr my_addr; ! 185: }; ! 186: ! 187: struct fwdinfo { ! 188: struct fwdinfo *next; ! 189: struct sockaddr_in fwdaddr; ! 190: }; ! 191: ! 192: struct nets { ! 193: char *name; ! 194: long net; ! 195: struct nets *next; ! 196: }; ! 197: ! 198: /* ! 199: * Statistics Defines ! 200: */ ! 201: struct stats { ! 202: unsigned long cnt; ! 203: char *description; ! 204: }; ! 205: ! 206: /* gross count of UDP packets in and out */ ! 207: #define S_INPKTS 0 ! 208: #define S_OUTPKTS 1 ! 209: /* gross count of queries and inverse queries received */ ! 210: #define S_QUERIES 2 ! 211: #define S_IQUERIES 3 ! 212: #define S_DUPQUERIES 4 ! 213: #define S_RESPONSES 5 ! 214: #define S_DUPRESP 6 ! 215: #define S_RESPOK 7 ! 216: #define S_RESPFAIL 8 ! 217: #define S_RESPFORMERR 9 ! 218: #define S_SYSQUERIES 10 ! 219: #define S_PRIMECACHE 11 ! 220: #define S_CHECKNS 12 ! 221: #define S_BADRESPONSES 13 ! 222: #define S_MARTIANS 14 ! 223: #define S_NSTATS 15 /* Careful! */ ! 224: #ifdef STATS ! 225: extern struct stats stats[S_NSTATS]; ! 226: extern unsigned long typestats[T_ANY+1]; ! 227: #endif ! 228: ! 229: #ifndef VOID ! 230: /* Support posix signals and old systems equally */ ! 231: #define VOID void ! 232: #endif ! 233: ! 234: #ifdef DEBUG ! 235: extern int debug; /* debug flag */ ! 236: extern FILE *ddt; /* debug file discriptor */ ! 237: #endif ! 238: #ifndef XFER ! 239: extern int ds; /* datagram socket */ ! 240: extern struct qdatagram *dqp; ! 241: extern struct timeval tt; /* place to store time */ ! 242: ! 243: extern struct itimerval ival; /* maintenance interval */ ! 244: extern struct zoneinfo *zones; /* zone information */ ! 245: extern int nzones; /* number of zones in use */ ! 246: ! 247: extern int forward_only; /* true on slave server */ ! 248: #endif /* XFER */ ! 249: ! 250: #ifdef vax ! 251: extern u_short htons(), ntohs(); ! 252: extern u_long htonl(), ntohl(); ! 253: #endif ! 254: ! 255: #define MAX_XFER_TIME 60 * 60 * 2 /* max seconds for an xfer */ ! 256: #define XFER_TIME_FUDGE 10 /* MAX_XFER_TIME fudge */ ! 257: ! 258: #ifndef XFER ! 259: extern int xfer_running_cnt; /* number of xfers running */ ! 260: extern int xfer_deferred_cnt; /* number of deferred xfers */ ! 261: #define MAX_XFERS_RUNNING 4 /* max value of xfer_running_cnt */ ! 262: #endif /* XFER */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.