dns.h (9028B)
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, 25 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 */ 31 32 /* classes */ 33 Csym= 0, /* internal symbols */ 34 Cin= 1, /* internet */ 35 Ccs, /* CSNET (obsolete) */ 36 Cch, /* Chaos net */ 37 Chs, /* Hesiod (?) */ 38 39 /* class queries (all class types are also queries) */ 40 Call= 255, /* all classes */ 41 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 */ 48 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) */ 58 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 */ 65 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) */ 70 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, 78 79 /* reserved time (can't be timed out earlier) */ 80 Reserved= 5*Min, 81 82 /* packet sizes */ 83 Maxudp= 512, /* maximum bytes per udp message */ 84 Maxudpin= 2048, /* maximum bytes per udp message */ 85 86 /* length of domain name hash table */ 87 HTLEN= 4*1024, 88 89 #define RRmagic 0xdeadbabe 90 #define DNmagic 0xa110a110 91 92 /* parallelism */ 93 Maxactive= 32 94 }; 95 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; 108 109 /* 110 * a structure to track a request and any slave process handling it 111 */ 112 struct Request 113 { 114 ulong aborttime; /* time at which we give up */ 115 int id; 116 }; 117 118 /* 119 * a domain name 120 */ 121 struct DN 122 { 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 }; 134 135 /* 136 * security info 137 */ 138 struct Key 139 { 140 int flags; 141 int proto; 142 int alg; 143 int dlen; 144 uchar *data; 145 }; 146 struct Cert 147 { 148 int type; 149 int tag; 150 int alg; 151 int dlen; 152 uchar *data; 153 }; 154 struct Sig 155 { 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 168 { 169 int dlen; 170 uchar *data; 171 }; 172 173 /* 174 * text strings 175 */ 176 struct Txt 177 { 178 Txt *next; 179 char *p; 180 }; 181 182 /* 183 * an unpacked resource record 184 */ 185 struct RR 186 { 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 }; 228 229 /* 230 * list of servers 231 */ 232 struct Server 233 { 234 Server *next; 235 char *name; 236 }; 237 238 /* 239 * timers for a start of authenticated record 240 */ 241 struct SOA 242 { 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 }; 250 251 /* 252 * domain messages 253 */ 254 struct DNSmsg 255 { 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 }; 267 268 /* 269 * definition of local area for dblookup 270 */ 271 struct Area 272 { 273 Area *next; 274 275 int len; /* strlen(area->soarr->owner->name) */ 276 RR *soarr; /* soa defining this area */ 277 int neednotify; 278 int needrefresh; 279 }; 280 281 enum 282 { 283 Recurse, 284 Dontrecurse, 285 NOneg, 286 OKneg 287 }; 288 289 enum 290 { 291 STACK = 32*1024 292 }; 293 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*); 337 338 /* dnarea.c */ 339 extern void refresh_areas(Area*); 340 extern void freearea(Area**); 341 extern void addarea(DN *dp, RR *rp, Ndbtuple *t); 342 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); 350 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); 356 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); 361 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*); 367 368 /* dnnotify.c */ 369 extern void dnnotify(DNSmsg*, DNSmsg*, Request*); 370 extern void notifyproc(void*); 371 372 /* convDNS2M.c */ 373 extern int convDNS2M(DNSmsg*, uchar*, int); 374 375 /* convM2DNS.c */ 376 extern char* convM2DNS(uchar*, int, DNSmsg*); 377 378 /* malloc.c */ 379 extern void mallocsanity(void*); 380 extern void lasthist(void*, int, ulong); 381 382 /* runproc.c */ 383 extern Waitmsg* runproc(char*, char**, int); 384 extern Waitmsg* runprocfd(char*, char**, int[3]); 385 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; 402 403 extern char *udpaddr; 404 extern char *tcpaddr; 405 406 #ifdef VARARGCK 407 #pragma varargck type "R" RR* 408 #pragma varargck type "Q" RR* 409 #endif