#pragma src "/sys/src/alef/lib/libnet" #pragma lib "/$M/lib/alef/libnet.a" typedef aggr Ndb; typedef aggr Ndbtuple; typedef aggr Ndbhf; typedef aggr Ndbs; enum { Ndbalen= 32, /* max attribute length */ Ndbvlen= 64, /* max value length */ }; /* * the database */ aggr Ndb { Ndb *next; Biobufhdr; /* buffered input file */ byte buf[256]; /* and it's buffer */ uint offset; /* current file offset */ byte *line; /* next unparsed line */ int linelen; /* and its length */ uint mtime; /* mtime of db file */ Qid qid; /* qid of db file */ byte file[2*NAMELEN];/* path name of db file */ Ndbhf *hf; /* open hash files */ }; /* * a parsed entry, doubly linked */ aggr Ndbtuple { byte attr[Ndbalen]; /* attribute name */ byte val[Ndbvlen]; /* value(s) */ Ndbtuple *entry; /* next tuple in this entry */ Ndbtuple *line; /* next tuple on this line */ uint ptr; /* (for the application - starts 0) */ }; /* * 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 int 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 */ aggr Ndbs { Ndb *db; /* data base file being searched */ Ndbhf *hf; /* hash file being searched */ int type; uint ptr; /* current pointer */ uint ptr1; /* next pointer */ Ndbtuple *t; /* last attribute value pair found */ }; /* * 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 ints */ #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)) enum { DNScache= 128, }; /* * Domain name service cache */ aggr Dns { Ndbtuple *cache[DNScache]; }; /* * ip information about a system */ aggr Ipinfo { byte domain[128]; /* system domain name */ byte bootf[128]; /* boot file */ byte ipaddr[4]; /* ip address of system */ byte ipmask[4]; /* ip network mask */ byte ipnet[4]; /* ip network address (ipaddr & ipmask) */ byte etheraddr[6]; /* ethernet address */ byte gwip[4]; /* gateway ip address */ byte fsip[4]; /* file system ip address */ byte auip[4]; /* authentication server ip address */ }; extern byte classmask[4][4]; #define CLASS(p) ((*(byte*)(p))>>6) /* * for user level udp headers */ enum { Udphdrsize= 6, /* size if a to/from user Udp header */ }; aggr Udphdr { byte ipaddr[4]; byte port[2]; }; uint ndbhash(byte*, int); Ndbtuple* ndbparse(Ndb*); void ndbfree(Ndbtuple*); Ndb* ndbopen(byte*); int ndbreopen(Ndb*); void ndbclose(Ndb*); int ndbseek(Ndb*, int, int); Ndbtuple* ndbsearch(Ndb*, Ndbs*, byte*, byte*); Ndbtuple* ndbsnext(Ndbs*, byte*, byte*); Ndbtuple* ndbgetval(Ndb*, Ndbs*, byte*, byte*, byte*, byte*); byte* ipattr(byte*); int ipinfo(Ndb*, byte*, byte*, byte*, Ipinfo*); int eipconv(Printspec*); uint parseip(byte*, byte*); int parseether(byte*, byte*); int myipaddr(byte*, byte*); int myetheraddr(byte*, byte*); void maskip(byte*, byte*, byte*); int equivip(byte*, byte*); uint nhgetl(byte*); usint nhgets(byte*); void hnputl(byte*, uint); void hnputs(byte*, usint);