|  | /* | 
|  | * This file is part of the UCB release of Plan 9. It is subject to the license | 
|  | * terms in the LICENSE file found in the top-level directory of this | 
|  | * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No | 
|  | * part of the UCB release of Plan 9, including this file, may be copied, | 
|  | * modified, propagated, or distributed except according to the terms contained | 
|  | * in the LICENSE file. | 
|  | */ | 
|  | #ifndef ROS_INC_NDB_H | 
|  |  | 
|  | #define ROS_INC_NDB_H | 
|  |  | 
|  | #include <fcall.h> | 
|  |  | 
|  | enum | 
|  | { | 
|  | Ndbalen=	32,	/* max attribute length */ | 
|  | Ndbvlen=	64,	/* max value length */ | 
|  | }; | 
|  |  | 
|  | struct ndbcache; | 
|  | /* | 
|  | *  the database | 
|  | */ | 
|  | struct ndb | 
|  | { | 
|  | struct ndb		*next; | 
|  |  | 
|  | FILE	*b;		/* buffered input file */ | 
|  | uint8_t		buf[256];	/* and its buffer */ | 
|  |  | 
|  | uint32_t		mtime;		/* mtime of db file */ | 
|  | struct qid		qid;		/* qid of db file */ | 
|  | char		file[128];/* path name of db file */ | 
|  | uint32_t		length;		/* length of db file */ | 
|  | int		isopen;	/* true if the file is open */ | 
|  |  | 
|  | int		nohash;		/* don't look for hash files */ | 
|  | struct ndbhf		*hf;		/* open hash files */ | 
|  |  | 
|  | int		ncache;		/* size of tuple cache */ | 
|  | struct ndbcache	*cache;		/* cached entries */ | 
|  | }; | 
|  |  | 
|  | /* | 
|  | *  a parsed entry, doubly linked | 
|  | */ | 
|  | struct ndbtuple | 
|  | { | 
|  | char		attr[Ndbalen];		/* attribute name */ | 
|  | char		*val;			/* value(s) */ | 
|  | struct ndbtuple	*entry;			/* next tuple in this entry */ | 
|  | struct ndbtuple	*line;			/* next tuple on this line */ | 
|  | uint32_t		ptr;			/* (for the application - starts 0) */ | 
|  | char		valbuf[Ndbvlen];	/* initial allocation for value */ | 
|  | }; | 
|  |  | 
|  | /* | 
|  | *  each hash file is of the form | 
|  | * | 
|  | *		+---------------------------------------+ | 
|  | *		|	mtime of db file (4 bytes)	| | 
|  | *		+---------------------------------------+ | 
|  | *		|  size of table (in entries - 4 bytes)	| | 
|  | *		+---------------------------------------+ | 
|  | *		|		hash table		| | 
|  | *		+---------------------------------------+ | 
|  | *		|		hash chains		| | 
|  | *		+---------------------------------------+ | 
|  | * | 
|  | *  hash collisions are resolved using chained entries added to the | 
|  | *  the end of the hash table. | 
|  | * | 
|  | *  Hash entries are of the form | 
|  | * | 
|  | *		+-------------------------------+ | 
|  | *		|	offset	(3 bytes) 	| | 
|  | *		+-------------------------------+ | 
|  | * | 
|  | *  Chain entries are of the form | 
|  | * | 
|  | *		+-------------------------------+ | 
|  | *		|	offset1	(3 bytes) 	| | 
|  | *		+-------------------------------+ | 
|  | *		|	offset2	(3 bytes) 	| | 
|  | *		+-------------------------------+ | 
|  | * | 
|  | *  The top bit of an offset set to 1 indicates a pointer to a hash chain entry. | 
|  | */ | 
|  | #define NDBULLEN	4		/* unsigned long length in bytes */ | 
|  | #define NDBPLEN		3		/* pointer length in bytes */ | 
|  | #define NDBHLEN		(2*NDBULLEN)	/* hash file header length in bytes */ | 
|  |  | 
|  | /* | 
|  | *  finger pointing to current point in a search | 
|  | */ | 
|  | struct ndbs | 
|  | { | 
|  | struct ndb	*db;	/* data base file being searched */ | 
|  | struct ndbhf	*hf;	/* hash file being searched */ | 
|  | int	type; | 
|  | uint32_t	ptr;	/* current pointer */ | 
|  | uint32_t	ptr1;	/* next pointer */ | 
|  | struct ndbtuple *t;	/* last attribute value pair found */ | 
|  | }; | 
|  |  | 
|  | struct ndbcache | 
|  | { | 
|  | struct ndbcache	*next; | 
|  | char		*attr; | 
|  | char		*val; | 
|  | struct ndbs		s; | 
|  | struct ndbtuple	*t; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | *  bit defs for pointers in hash files | 
|  | */ | 
|  | #define NDBSPEC 	(1<<23) | 
|  | #define NDBCHAIN	NDBSPEC		/* points to a collision chain */ | 
|  | #define NDBNAP		(NDBSPEC|1)	/* not a pointer */ | 
|  |  | 
|  | /* | 
|  | *  macros for packing and unpacking pointers | 
|  | */ | 
|  | #define NDBPUTP(v,a) { (a)[0] = v; (a)[1] = (v)>>8; (a)[2] = (v)>>16; } | 
|  | #define NDBGETP(a) ((a)[0] | ((a)[1]<<8) | ((a)[2]<<16)) | 
|  |  | 
|  | /* | 
|  | *  macros for packing and unpacking unsigned longs | 
|  | */ | 
|  | #define NDBPUTUL(v,a) { (a)[0] = v; (a)[1] = (v)>>8; (a)[2] = (v)>>16; (a)[3] = (v)>>24; } | 
|  | #define NDBGETUL(a) ((a)[0] | ((a)[1]<<8) | ((a)[2]<<16) | ((a)[3]<<24)) | 
|  |  | 
|  | #define NDB_IPlen 16 | 
|  |  | 
|  | struct ndbtuple*	csgetval(char*, char*, char*, char*, char*); | 
|  | char*		csgetvalue(char*, char*, char*, char*, struct ndbtuple**); | 
|  | struct ndbtuple*	csipinfo(char*, char*, char*, char**, int); | 
|  | struct ndbtuple*	dnsquery(char*, char*, char*); | 
|  | char*		ipattr(char*); | 
|  | struct ndb*		ndbcat(struct ndb*, struct ndb*); | 
|  | int		ndbchanged(struct ndb*); | 
|  | void		ndbclose(struct ndb*); | 
|  | struct ndbtuple*	ndbconcatenate(struct ndbtuple*, struct ndbtuple*); | 
|  | struct ndbtuple*	ndbdiscard(struct ndbtuple*, struct ndbtuple*); | 
|  | void		ndbfree(struct ndbtuple*); | 
|  | struct ndbtuple*	ndbgetipaddr(struct ndb*, char*); | 
|  | struct ndbtuple*	ndbgetval(struct ndb*, | 
|  | struct ndbs*, char*, char*, char*, char*); | 
|  | char*		ndbgetvalue(struct ndb*, struct ndbs*, char*, char*, char*, | 
|  | struct ndbtuple**); | 
|  | struct ndbtuple*	ndbfindattr(struct ndbtuple*, struct ndbtuple*, char*); | 
|  | uint32_t		ndbhash(char*, int); | 
|  | struct ndbtuple*	ndbipinfo(struct ndb*, char*, char*, char**, int); | 
|  | struct ndbtuple*	ndblookval(struct ndbtuple*, | 
|  | struct ndbtuple*, char*, char*); | 
|  | struct ndbtuple*	ndbnew(char*, char*); | 
|  | struct ndb*		ndbopen(char*); | 
|  | struct ndbtuple*	ndbparse(struct ndb*); | 
|  | int		ndbreopen(struct ndb*); | 
|  | struct ndbtuple*	ndbreorder(struct ndbtuple*, struct ndbtuple*); | 
|  | struct ndbtuple*	ndbsearch(struct ndb*, struct ndbs*, char*, char*); | 
|  | void		ndbsetval(struct ndbtuple*, char*, int); | 
|  | struct ndbtuple*	ndbsnext(struct ndbs*, char*, char*); | 
|  | struct ndbtuple*	ndbsubstitute(struct ndbtuple*, struct ndbtuple*, | 
|  | struct ndbtuple*); | 
|  | char*_ndbparsetuple(char *cp, struct ndbtuple **tp); | 
|  | struct ndbtuple*_ndbparseline(char *cp); | 
|  | //void		ndbsetmalloctag(struct ndbtuple*, uintptr_t); | 
|  | static inline void		ndbsetmalloctag(struct ndbtuple*t, uintptr_t v){} | 
|  |  | 
|  | static inline uintptr_t getcallerpc(void *v){return 0;} | 
|  | static inline void setmalloctag(void *v){} | 
|  |  | 
|  | void _ndbcacheflush(struct ndb *db); | 
|  | /* No implementation for this, dumped into a garbage file */ | 
|  | void setnetmtpt(char *net, int n, char *x); | 
|  |  | 
|  | #endif /* ROS_INC_NDB_H */ |