plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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