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