Blob


1 enum
2 {
3 /* RR types */
4 Ta= 1,
5 Tns= 2,
6 Tmd= 3,
7 Tmf= 4,
8 Tcname= 5,
9 Tsoa= 6,
10 Tmb= 7,
11 Tmg= 8,
12 Tmr= 9,
13 Tnull= 10,
14 Twks= 11,
15 Tptr= 12,
16 Thinfo= 13,
17 Tminfo= 14,
18 Tmx= 15,
19 Ttxt= 16,
20 Trp= 17,
21 Tsig= 24,
22 Tkey= 25,
23 Taaaa= 28,
24 Tcert= 37,
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 */
32 /* classes */
33 Csym= 0, /* internal symbols */
34 Cin= 1, /* internet */
35 Ccs, /* CSNET (obsolete) */
36 Cch, /* Chaos net */
37 Chs, /* Hesiod (?) */
39 /* class queries (all class types are also queries) */
40 Call= 255, /* all classes */
42 /* opcodes */
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 */
49 /* response codes */
50 Rok= 0,
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) */
72 Min= 60,
73 Hour= 60*Min, /* */
74 Day= 24*Hour, /* Ta, Tmx */
75 Week= 7*Day, /* Tsoa, Tns */
76 Year= 52*Week,
77 DEFTTL= Day,
79 /* reserved time (can't be timed out earlier) */
80 Reserved= 5*Min,
82 /* packet sizes */
83 Maxudp= 512, /* maximum bytes per udp message */
84 Maxudpin= 2048, /* maximum bytes per udp message */
86 /* length of domain name hash table */
87 HTLEN= 4*1024,
89 #define RRmagic 0xdeadbabe
90 #define DNmagic 0xa110a110
92 /* parallelism */
93 Maxactive= 32
94 };
96 typedef struct DN DN;
97 typedef struct DNSmsg DNSmsg;
98 typedef struct RR RR;
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;
109 /*
110 * a structure to track a request and any slave process handling it
111 */
112 struct Request
114 ulong aborttime; /* time at which we give up */
115 int id;
116 };
118 /*
119 * a domain name
120 */
121 struct DN
123 DN *next; /* hash collision list */
124 ulong magic;
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 */
132 ulong ordinal;
133 };
135 /*
136 * security info
137 */
138 struct Key
140 int flags;
141 int proto;
142 int alg;
143 int dlen;
144 uchar *data;
145 };
146 struct Cert
148 int type;
149 int tag;
150 int alg;
151 int dlen;
152 uchar *data;
153 };
154 struct Sig
156 int type;
157 int alg;
158 int labels;
159 ulong ttl;
160 ulong exp;
161 ulong incep;
162 int tag;
163 DN *signer;
164 int dlen;
165 uchar *data;
166 };
167 struct Null
169 int dlen;
170 uchar *data;
171 };
173 /*
174 * text strings
175 */
176 struct Txt
178 Txt *next;
179 char *p;
180 };
182 /*
183 * an unpacked resource record
184 */
185 struct RR
187 RR *next;
188 ulong magic;
189 DN *owner; /* domain that owns this resource record */
190 uchar negative; /* this is a cached negative response */
191 ulong pc;
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 */
200 /* union { */
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 */
207 int cruftlen;
208 ulong arg0;
209 /* }; */
210 /* union { */
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 */
217 ulong arg1;
218 /* }; */
219 /* union { */
220 SOA *soa; /* soa timers - soa */
221 Key *key;
222 Cert *cert;
223 Sig *sig;
224 Null *null;
225 Txt *txt;
226 /* }; */
227 };
229 /*
230 * list of servers
231 */
232 struct Server
234 Server *next;
235 char *name;
236 };
238 /*
239 * timers for a start of authenticated record
240 */
241 struct SOA
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 */
249 };
251 /*
252 * domain messages
253 */
254 struct DNSmsg
256 ushort id;
257 int flags;
258 int qdcount; /* questions */
259 RR *qd;
260 int ancount; /* answers */
261 RR *an;
262 int nscount; /* name servers */
263 RR *ns;
264 int arcount; /* hints */
265 RR *ar;
266 };
268 /*
269 * definition of local area for dblookup
270 */
271 struct Area
273 Area *next;
275 int len; /* strlen(area->soarr->owner->name) */
276 RR *soarr; /* soa defining this area */
277 int neednotify;
278 int needrefresh;
279 };
281 enum
283 Recurse,
284 Dontrecurse,
285 NOneg,
286 OKneg
287 };
289 enum
291 STACK = 32*1024
292 };
294 /* dn.c */
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*);
338 /* dnarea.c */
339 extern void refresh_areas(Area*);
340 extern void freearea(Area**);
341 extern void addarea(DN *dp, RR *rp, Ndbtuple *t);
343 /* dblookup.c */
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);
351 /* dns.c */
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);
357 /* dnresolve.c */
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);
362 /* dnserver.c */
363 extern void dnserver(DNSmsg*, DNSmsg*, Request*);
364 extern void dnudpserver(void*);
365 extern void dntcpserver(void*);
366 extern void tcpproc(void*);
368 /* dnnotify.c */
369 extern void dnnotify(DNSmsg*, DNSmsg*, Request*);
370 extern void notifyproc(void*);
372 /* convDNS2M.c */
373 extern int convDNS2M(DNSmsg*, uchar*, int);
375 /* convM2DNS.c */
376 extern char* convM2DNS(uchar*, int, DNSmsg*);
378 /* malloc.c */
379 extern void mallocsanity(void*);
380 extern void lasthist(void*, int, ulong);
382 /* runproc.c */
383 extern Waitmsg* runproc(char*, char**, int);
384 extern Waitmsg* runprocfd(char*, char**, int[3]);
386 extern int debug;
387 extern int traceactivity;
388 extern char *trace;
389 extern int testing; /* test cache whenever removing a DN */
390 extern int cachedb;
391 extern int needrefresh;
392 extern char *dbfile;
393 extern char mntpt[];
394 extern char *logfile;
395 extern int resolver;
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 */
400 extern Area *owned;
401 extern Area *delegated;
403 extern char *udpaddr;
404 extern char *tcpaddr;
406 #ifdef VARARGCK
407 #pragma varargck type "R" RR*
408 #pragma varargck type "Q" RR*
409 #endif