26 /* query types (all RR types are also queries) */
27 Tixfr= 251, /* incremental zone transfer */
28 Taxfr= 252, /* zone transfer */
29 Tmailb= 253, /* { Tmb, Tmg, Tmr } */
30 Tall= 255, /* all records */
33 Csym= 0, /* internal symbols */
34 Cin= 1, /* internet */
35 Ccs, /* CSNET (obsolete) */
39 /* class queries (all class types are also queries) */
40 Call= 255, /* all classes */
43 Oquery= 0<<11, /* normal query */
44 Oinverse= 1<<11, /* inverse query */
45 Ostatus= 2<<11, /* status request */
46 Onotify= 4<<11, /* notify slaves of updates */
47 Omask= 0xf<<11, /* mask for opcode */
51 Rformat= 1, /* format error */
52 Rserver= 2, /* server failure (e.g. no answer from something) */
53 Rname= 3, /* bad name */
54 Runimplimented= 4, /* unimplemented */
55 Rrefused= 5, /* we don't like you */
56 Rmask= 0xf, /* mask for response */
57 Rtimeout= 0x10, /* timeout sending (for internal use only) */
59 /* bits in flag word (other than opcode and response) */
60 Fresp= 1<<15, /* message is a response */
61 Fauth= 1<<10, /* true if an authoritative response */
62 Ftrunc= 1<<9, /* truncated message */
63 Frecurse= 1<<8, /* request recursion */
64 Fcanrec= 1<<7, /* server can recurse */
66 Domlen= 256, /* max domain name length (with NULL) */
67 Labellen= 256, /* max domain label length (with NULL) */
68 Strlen= 256, /* max string length (with NULL) */
69 Iplen= 32, /* max ascii ip address length (with NULL) */
71 /* time to live values (in seconds) */
74 Day= 24*Hour, /* Ta, Tmx */
75 Week= 7*Day, /* Tsoa, Tns */
79 /* reserved time (can't be timed out earlier) */
83 Maxudp= 512, /* maximum bytes per udp message */
84 Maxudpin= 2048, /* maximum bytes per udp message */
86 /* length of domain name hash table */
89 #define RRmagic 0xdeadbabe
90 #define DNmagic 0xa110a110
97 typedef struct DNSmsg DNSmsg;
99 typedef struct SOA SOA;
100 typedef struct Area Area;
101 typedef struct Request Request;
102 typedef struct Key Key;
103 typedef struct Cert Cert;
104 typedef struct Sig Sig;
105 typedef struct Null Null;
106 typedef struct Server Server;
107 typedef struct Txt Txt;
110 * a structure to track a request and any slave process handling it
114 ulong aborttime; /* time at which we give up */
123 DN *next; /* hash collision list */
125 char *name; /* owner */
126 RR *rr; /* resource records off this name */
127 ulong referenced; /* time last referenced */
128 ulong lookuptime; /* last time we tried to get a better value */
129 ushort class; /* RR class */
130 char refs; /* for mark and sweep */
131 char nonexistent; /* true if we get an authoritative nx for this domain */
183 * an unpacked resource record
189 DN *owner; /* domain that owns this resource record */
190 uchar negative; /* this is a cached negative response */
192 ulong ttl; /* time to live to be passed on */
193 ulong expire; /* time this entry expires locally */
194 ushort type; /* RR type */
195 ushort query; /* query tyis is in response to */
196 uchar auth; /* authoritative */
197 uchar db; /* from database */
198 uchar cached; /* rr in cache */
199 ulong marker; /* used locally when scanning rrlists */
201 DN *negsoaowner; /* soa for cached negative response */
202 DN *host; /* hostname - soa, cname, mb, md, mf, mx, ns */
203 DN *cpu; /* cpu type - hinfo */
204 DN *mb; /* mailbox - mg, minfo */
205 DN *ip; /* ip addrss - a */
206 DN *rp; /* rp arg - rp */
211 int negrcode; /* response code for cached negative response */
212 DN *rmb; /* responsible maibox - minfo, soa, rp */
213 DN *ptr; /* pointer to domain name - ptr */
214 DN *os; /* operating system - hinfo */
215 ulong pref; /* preference value - mx */
216 ulong local; /* ns served from local database - ns */
220 SOA *soa; /* soa timers - soa */
239 * timers for a start of authenticated record
243 ulong serial; /* zone serial # (sec) - soa */
244 ulong refresh; /* zone refresh interval (sec) - soa */
245 ulong retry; /* zone retry interval (sec) - soa */
246 ulong expire; /* time to expiration (sec) - soa */
247 ulong minttl; /* minimum time to live for any entry (sec) - soa */
248 Server *slaves; /* slave servers */
258 int qdcount; /* questions */
260 int ancount; /* answers */
262 int nscount; /* name servers */
264 int arcount; /* hints */
269 * definition of local area for dblookup
275 int len; /* strlen(area->soarr->owner->name) */
276 RR *soarr; /* soa defining this area */
295 extern char *rrtname[];
296 extern char *rname[];
297 extern void db2cache(int);
298 extern void dninit(void);
299 extern DN* dnlookup(char*, int, int);
300 extern void dnage(DN*);
301 extern void dnageall(int);
302 extern void dnagedb(void);
303 extern void dnauthdb(void);
304 extern void dnget(void);
305 extern void dnpurge(void);
306 extern void dnput(void);
307 extern Area* inmyarea(char*);
308 extern void rrattach(RR*, int);
309 extern RR* rralloc(int);
310 extern void rrfree(RR*);
311 extern void rrfreelist(RR*);
312 extern RR* rrlookup(DN*, int, int);
313 extern RR* rrcat(RR**, RR*);
314 extern RR** rrcopy(RR*, RR**);
315 extern RR* rrremneg(RR**);
316 extern RR* rrremtype(RR**, int);
317 extern int rrfmt(Fmt*);
318 extern int rravfmt(Fmt*);
319 extern int rrsupported(int);
320 extern int rrtype(char*);
321 extern char* rrname(int, char*, int);
322 extern int tsame(int, int);
323 extern void dndump(char*);
324 extern int getactivity(Request*);
325 extern void putactivity(void);
326 extern void warning(char*, ...);
327 extern void dncheck(void*, int);
328 extern void unique(RR*);
329 extern int subsume(char*, char*);
330 extern RR* randomize(RR*);
331 extern void* emalloc(int);
332 extern char* estrdup(char*);
333 extern void dnptr(uchar*, uchar*, char*, int, int);
334 extern void addserver(Server**, char*);
335 extern Server* copyserverlist(Server*);
336 extern void freeserverlist(Server*);
339 extern void refresh_areas(Area*);
340 extern void freearea(Area**);
341 extern void addarea(DN *dp, RR *rp, Ndbtuple *t);
344 extern RR* dblookup(char*, int, int, int, int);
345 extern RR* dbinaddr(DN*, int);
346 extern int baddelegation(RR*, RR*, uchar*);
347 extern RR* dnsservers(int);
348 extern RR* domainlist(int);
349 extern int opendatabase(void);
352 extern char* walkup(char*);
353 extern RR* getdnsservers(int);
354 extern void logreply(int, uchar*, DNSmsg*);
355 extern void logsend(int, int, uchar*, char*, char*, int);
358 extern RR* dnresolve(char*, int, int, Request*, RR**, int, int, int, int*);
359 extern int udpport(void);
360 extern int mkreq(DN *dp, int type, uchar *buf, int flags, ushort reqno);
363 extern void dnserver(DNSmsg*, DNSmsg*, Request*);
364 extern void dnudpserver(void*);
365 extern void dntcpserver(void*);
366 extern void tcpproc(void*);
369 extern void dnnotify(DNSmsg*, DNSmsg*, Request*);
370 extern void notifyproc(void*);
373 extern int convDNS2M(DNSmsg*, uchar*, int);
376 extern char* convM2DNS(uchar*, int, DNSmsg*);
379 extern void mallocsanity(void*);
380 extern void lasthist(void*, int, ulong);
383 extern Waitmsg* runproc(char*, char**, int);
384 extern Waitmsg* runprocfd(char*, char**, int[3]);
387 extern int traceactivity;
389 extern int testing; /* test cache whenever removing a DN */
391 extern int needrefresh;
394 extern char *logfile;
396 extern int maxage; /* age of oldest entry in cache (secs) */
397 extern char *zonerefreshprogram;
398 extern int sendnotifies;
399 extern ulong now; /* time base */
401 extern Area *delegated;
403 extern char *udpaddr;
404 extern char *tcpaddr;
407 #pragma varargck type "R" RR*
408 #pragma varargck type "Q" RR*