| enum |
| { |
| /* RR types */ |
| Ta= 1, |
| Tns= 2, |
| Tmd= 3, |
| Tmf= 4, |
| Tcname= 5, |
| Tsoa= 6, |
| Tmb= 7, |
| Tmg= 8, |
| Tmr= 9, |
| Tnull= 10, |
| Twks= 11, |
| Tptr= 12, |
| Thinfo= 13, |
| Tminfo= 14, |
| Tmx= 15, |
| Ttxt= 16, |
| Trp= 17, |
| Tsig= 24, |
| Tkey= 25, |
| Taaaa= 28, |
| Tcert= 37, |
| |
| /* query types (all RR types are also queries) */ |
| Tixfr= 251, /* incremental zone transfer */ |
| Taxfr= 252, /* zone transfer */ |
| Tmailb= 253, /* { Tmb, Tmg, Tmr } */ |
| Tall= 255, /* all records */ |
| |
| /* classes */ |
| Csym= 0, /* internal symbols */ |
| Cin= 1, /* internet */ |
| Ccs, /* CSNET (obsolete) */ |
| Cch, /* Chaos net */ |
| Chs, /* Hesiod (?) */ |
| |
| /* class queries (all class types are also queries) */ |
| Call= 255, /* all classes */ |
| |
| /* opcodes */ |
| Oquery= 0<<11, /* normal query */ |
| Oinverse= 1<<11, /* inverse query */ |
| Ostatus= 2<<11, /* status request */ |
| Onotify= 4<<11, /* notify slaves of updates */ |
| Omask= 0xf<<11, /* mask for opcode */ |
| |
| /* response codes */ |
| Rok= 0, |
| Rformat= 1, /* format error */ |
| Rserver= 2, /* server failure (e.g. no answer from something) */ |
| Rname= 3, /* bad name */ |
| Runimplimented= 4, /* unimplemented */ |
| Rrefused= 5, /* we don't like you */ |
| Rmask= 0xf, /* mask for response */ |
| Rtimeout= 0x10, /* timeout sending (for internal use only) */ |
| |
| /* bits in flag word (other than opcode and response) */ |
| Fresp= 1<<15, /* message is a response */ |
| Fauth= 1<<10, /* true if an authoritative response */ |
| Ftrunc= 1<<9, /* truncated message */ |
| Frecurse= 1<<8, /* request recursion */ |
| Fcanrec= 1<<7, /* server can recurse */ |
| |
| Domlen= 256, /* max domain name length (with NULL) */ |
| Labellen= 256, /* max domain label length (with NULL) */ |
| Strlen= 256, /* max string length (with NULL) */ |
| Iplen= 32, /* max ascii ip address length (with NULL) */ |
| |
| /* time to live values (in seconds) */ |
| Min= 60, |
| Hour= 60*Min, /* */ |
| Day= 24*Hour, /* Ta, Tmx */ |
| Week= 7*Day, /* Tsoa, Tns */ |
| Year= 52*Week, |
| DEFTTL= Day, |
| |
| /* reserved time (can't be timed out earlier) */ |
| Reserved= 5*Min, |
| |
| /* packet sizes */ |
| Maxudp= 512, /* maximum bytes per udp message */ |
| Maxudpin= 2048, /* maximum bytes per udp message */ |
| |
| /* length of domain name hash table */ |
| HTLEN= 4*1024, |
| |
| #define RRmagic 0xdeadbabe |
| #define DNmagic 0xa110a110 |
| |
| /* parallelism */ |
| Maxactive= 32 |
| }; |
| |
| typedef struct DN DN; |
| typedef struct DNSmsg DNSmsg; |
| typedef struct RR RR; |
| typedef struct SOA SOA; |
| typedef struct Area Area; |
| typedef struct Request Request; |
| typedef struct Key Key; |
| typedef struct Cert Cert; |
| typedef struct Sig Sig; |
| typedef struct Null Null; |
| typedef struct Server Server; |
| typedef struct Txt Txt; |
| |
| /* |
| * a structure to track a request and any slave process handling it |
| */ |
| struct Request |
| { |
| ulong aborttime; /* time at which we give up */ |
| int id; |
| }; |
| |
| /* |
| * a domain name |
| */ |
| struct DN |
| { |
| DN *next; /* hash collision list */ |
| ulong magic; |
| char *name; /* owner */ |
| RR *rr; /* resource records off this name */ |
| ulong referenced; /* time last referenced */ |
| ulong lookuptime; /* last time we tried to get a better value */ |
| ushort class; /* RR class */ |
| char refs; /* for mark and sweep */ |
| char nonexistent; /* true if we get an authoritative nx for this domain */ |
| ulong ordinal; |
| }; |
| |
| /* |
| * security info |
| */ |
| struct Key |
| { |
| int flags; |
| int proto; |
| int alg; |
| int dlen; |
| uchar *data; |
| }; |
| struct Cert |
| { |
| int type; |
| int tag; |
| int alg; |
| int dlen; |
| uchar *data; |
| }; |
| struct Sig |
| { |
| int type; |
| int alg; |
| int labels; |
| ulong ttl; |
| ulong exp; |
| ulong incep; |
| int tag; |
| DN *signer; |
| int dlen; |
| uchar *data; |
| }; |
| struct Null |
| { |
| int dlen; |
| uchar *data; |
| }; |
| |
| /* |
| * text strings |
| */ |
| struct Txt |
| { |
| Txt *next; |
| char *p; |
| }; |
| |
| /* |
| * an unpacked resource record |
| */ |
| struct RR |
| { |
| RR *next; |
| ulong magic; |
| DN *owner; /* domain that owns this resource record */ |
| uchar negative; /* this is a cached negative response */ |
| ulong pc; |
| ulong ttl; /* time to live to be passed on */ |
| ulong expire; /* time this entry expires locally */ |
| ushort type; /* RR type */ |
| ushort query; /* query tyis is in response to */ |
| uchar auth; /* authoritative */ |
| uchar db; /* from database */ |
| uchar cached; /* rr in cache */ |
| ulong marker; /* used locally when scanning rrlists */ |
| /* union { */ |
| DN *negsoaowner; /* soa for cached negative response */ |
| DN *host; /* hostname - soa, cname, mb, md, mf, mx, ns */ |
| DN *cpu; /* cpu type - hinfo */ |
| DN *mb; /* mailbox - mg, minfo */ |
| DN *ip; /* ip addrss - a */ |
| DN *rp; /* rp arg - rp */ |
| int cruftlen; |
| ulong arg0; |
| /* }; */ |
| /* union { */ |
| int negrcode; /* response code for cached negative response */ |
| DN *rmb; /* responsible maibox - minfo, soa, rp */ |
| DN *ptr; /* pointer to domain name - ptr */ |
| DN *os; /* operating system - hinfo */ |
| ulong pref; /* preference value - mx */ |
| ulong local; /* ns served from local database - ns */ |
| ulong arg1; |
| /* }; */ |
| /* union { */ |
| SOA *soa; /* soa timers - soa */ |
| Key *key; |
| Cert *cert; |
| Sig *sig; |
| Null *null; |
| Txt *txt; |
| /* }; */ |
| }; |
| |
| /* |
| * list of servers |
| */ |
| struct Server |
| { |
| Server *next; |
| char *name; |
| }; |
| |
| /* |
| * timers for a start of authenticated record |
| */ |
| struct SOA |
| { |
| ulong serial; /* zone serial # (sec) - soa */ |
| ulong refresh; /* zone refresh interval (sec) - soa */ |
| ulong retry; /* zone retry interval (sec) - soa */ |
| ulong expire; /* time to expiration (sec) - soa */ |
| ulong minttl; /* minimum time to live for any entry (sec) - soa */ |
| Server *slaves; /* slave servers */ |
| }; |
| |
| /* |
| * domain messages |
| */ |
| struct DNSmsg |
| { |
| ushort id; |
| int flags; |
| int qdcount; /* questions */ |
| RR *qd; |
| int ancount; /* answers */ |
| RR *an; |
| int nscount; /* name servers */ |
| RR *ns; |
| int arcount; /* hints */ |
| RR *ar; |
| }; |
| |
| /* |
| * definition of local area for dblookup |
| */ |
| struct Area |
| { |
| Area *next; |
| |
| int len; /* strlen(area->soarr->owner->name) */ |
| RR *soarr; /* soa defining this area */ |
| int neednotify; |
| int needrefresh; |
| }; |
| |
| enum |
| { |
| Recurse, |
| Dontrecurse, |
| NOneg, |
| OKneg |
| }; |
| |
| enum |
| { |
| STACK = 32*1024 |
| }; |
| |
| /* dn.c */ |
| extern char *rrtname[]; |
| extern char *rname[]; |
| extern void db2cache(int); |
| extern void dninit(void); |
| extern DN* dnlookup(char*, int, int); |
| extern void dnage(DN*); |
| extern void dnageall(int); |
| extern void dnagedb(void); |
| extern void dnauthdb(void); |
| extern void dnget(void); |
| extern void dnpurge(void); |
| extern void dnput(void); |
| extern Area* inmyarea(char*); |
| extern void rrattach(RR*, int); |
| extern RR* rralloc(int); |
| extern void rrfree(RR*); |
| extern void rrfreelist(RR*); |
| extern RR* rrlookup(DN*, int, int); |
| extern RR* rrcat(RR**, RR*); |
| extern RR** rrcopy(RR*, RR**); |
| extern RR* rrremneg(RR**); |
| extern RR* rrremtype(RR**, int); |
| extern int rrfmt(Fmt*); |
| extern int rravfmt(Fmt*); |
| extern int rrsupported(int); |
| extern int rrtype(char*); |
| extern char* rrname(int, char*, int); |
| extern int tsame(int, int); |
| extern void dndump(char*); |
| extern int getactivity(Request*); |
| extern void putactivity(void); |
| extern void warning(char*, ...); |
| extern void dncheck(void*, int); |
| extern void unique(RR*); |
| extern int subsume(char*, char*); |
| extern RR* randomize(RR*); |
| extern void* emalloc(int); |
| extern char* estrdup(char*); |
| extern void dnptr(uchar*, uchar*, char*, int, int); |
| extern void addserver(Server**, char*); |
| extern Server* copyserverlist(Server*); |
| extern void freeserverlist(Server*); |
| |
| /* dnarea.c */ |
| extern void refresh_areas(Area*); |
| extern void freearea(Area**); |
| extern void addarea(DN *dp, RR *rp, Ndbtuple *t); |
| |
| /* dblookup.c */ |
| extern RR* dblookup(char*, int, int, int, int); |
| extern RR* dbinaddr(DN*, int); |
| extern int baddelegation(RR*, RR*, uchar*); |
| extern RR* dnsservers(int); |
| extern RR* domainlist(int); |
| extern int opendatabase(void); |
| |
| /* dns.c */ |
| extern char* walkup(char*); |
| extern RR* getdnsservers(int); |
| extern void logreply(int, uchar*, DNSmsg*); |
| extern void logsend(int, int, uchar*, char*, char*, int); |
| |
| /* dnresolve.c */ |
| extern RR* dnresolve(char*, int, int, Request*, RR**, int, int, int, int*); |
| extern int udpport(void); |
| extern int mkreq(DN *dp, int type, uchar *buf, int flags, ushort reqno); |
| |
| /* dnserver.c */ |
| extern void dnserver(DNSmsg*, DNSmsg*, Request*); |
| extern void dnudpserver(void*); |
| extern void dntcpserver(void*); |
| extern void tcpproc(void*); |
| |
| /* dnnotify.c */ |
| extern void dnnotify(DNSmsg*, DNSmsg*, Request*); |
| extern void notifyproc(void*); |
| |
| /* convDNS2M.c */ |
| extern int convDNS2M(DNSmsg*, uchar*, int); |
| |
| /* convM2DNS.c */ |
| extern char* convM2DNS(uchar*, int, DNSmsg*); |
| |
| /* malloc.c */ |
| extern void mallocsanity(void*); |
| extern void lasthist(void*, int, ulong); |
| |
| /* runproc.c */ |
| extern Waitmsg* runproc(char*, char**, int); |
| extern Waitmsg* runprocfd(char*, char**, int[3]); |
| |
| extern int debug; |
| extern int traceactivity; |
| extern char *trace; |
| extern int testing; /* test cache whenever removing a DN */ |
| extern int cachedb; |
| extern int needrefresh; |
| extern char *dbfile; |
| extern char mntpt[]; |
| extern char *logfile; |
| extern int resolver; |
| extern int maxage; /* age of oldest entry in cache (secs) */ |
| extern char *zonerefreshprogram; |
| extern int sendnotifies; |
| extern ulong now; /* time base */ |
| extern Area *owned; |
| extern Area *delegated; |
| |
| extern char *udpaddr; |
| extern char *tcpaddr; |
| |
| #ifdef VARARGCK |
| #pragma varargck type "R" RR* |
| #pragma varargck type "Q" RR* |
| #endif |