plan9fox/sys/include/ndb.h
Ori Bernstein 7ca997bf7e ndb: increase buffer size to allow longer lines
when reading a long line such as a dkim key in a
txt record, ndb calls Brdstr, which is limited
to the size of the buffer. This means we would
fail to parse the line from NDB, and bail out
early.

Increasing the buffer size allows us to read and
parse longer lines.
2022-06-19 23:42:04 +00:00

153 lines
4.2 KiB
C

#pragma src "/sys/src/libndb"
#pragma lib "libndb.a"
/*
* this include file requires includes of <u.h> and <bio.h>
*/
typedef struct Ndb Ndb;
typedef struct Ndbtuple Ndbtuple;
typedef struct Ndbhf Ndbhf;
typedef struct Ndbs Ndbs;
typedef struct Ndbcache Ndbcache;
#pragma incomplete Ndbhf
#pragma incomplete Ndbcache
enum
{
Ndbalen= 32, /* max attribute length */
Ndbvlen= 64, /* max value length */
};
/*
* the database
*/
struct Ndb
{
Ndb *next;
Biobufhdr b; /* buffered input file */
uchar buf[8192]; /* and its buffer */
ulong mtime; /* mtime of db file */
Qid qid; /* qid of db file */
char file[128]; /* path name of db file */
ulong length; /* length of db file */
int nohash; /* don't look for hash files */
Ndbhf *hf; /* open hash files */
int ncache; /* size of tuple cache */
Ndbcache *cache; /* cached entries */
};
/*
* a parsed entry, doubly linked
*/
struct Ndbtuple
{
char attr[Ndbalen]; /* attribute name */
char *val; /* value(s) */
Ndbtuple *entry; /* next tuple in this entry */
Ndbtuple *line; /* next tuple on this line */
ulong 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
{
Ndb *db; /* data base file being searched */
Ndbhf *hf; /* hash file being searched */
int type;
ulong ptr; /* current pointer */
ulong 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 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
char* csgetvalue(char*, char*, char*, char*, Ndbtuple**);
Ndbtuple* csipinfo(char*, char*, char*, char**, int);
Ndbtuple* dnsquery(char*, char*, char*);
char* ipattr(char*);
void mkptrname(char *ip, char *rip, int rlen);
Ndb* ndbcat(Ndb*, Ndb*);
int ndbchanged(Ndb*);
void ndbclose(Ndb*);
Ndbtuple* ndbconcatenate(Ndbtuple*, Ndbtuple*);
Ndbtuple* ndbdiscard(Ndbtuple*, Ndbtuple*);
void ndbfree(Ndbtuple*);
Ndbtuple* ndbgetipaddr(Ndb*, char*);
char* ndbgetvalue(Ndb*, Ndbs*, char*, char*, char*, Ndbtuple**);
Ndbtuple* ndbfindattr(Ndbtuple*, Ndbtuple*, char*);
ulong ndbhash(char*, int);
Ndbtuple* ndbipinfo(Ndb*, char*, char*, char**, int);
Ndbtuple* ndbnew(char*, char*);
Ndb* ndbopen(char*);
Ndbtuple* ndbparse(Ndb*);
int ndbreopen(Ndb*);
Ndbtuple* ndbreorder(Ndbtuple*, Ndbtuple*);
Ndbtuple* ndbsearch(Ndb*, Ndbs*, char*, char*);
void ndbsetval(Ndbtuple*, char*, int);
Ndbtuple* ndbsnext(Ndbs*, char*, char*);
Ndbtuple* ndbsubstitute(Ndbtuple*, Ndbtuple*, Ndbtuple*);
Ndbtuple* ndbdedup(Ndbtuple*);
void ndbsetmalloctag(Ndbtuple*, uintptr);