409 lines
8.8 KiB
C
Executable file
409 lines
8.8 KiB
C
Executable file
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
|