NDB(3) NDB(3)
NAME
ndbopen, ndbcat, ndbchanged, ndbclose, ndbreopen, ndbsearch,
ndbsnext, ndbgetvalue, ndbfree, ipattr, ndbgetipaddr,
ndbipinfo, ndbhash, ndbparse, ndbfindattr, ndbdiscard,
ndbconcatenate, ndbreorder, ndbsubstitute, ndbgetval,
ndblookval - network database
SYNOPSIS
#include <u.h>
#include <libc.h>
#include <bio.h>
#include <ndb.h>
Ndb* ndbopen(char *file)
Ndb* ndbcat(Ndb *db1, Ndb *db2)
Ndb* ndbchanged(Ndb *db)
int ndbreopen(Ndb *db)
void ndbclose(Ndb *db)
Ndbtuple* ndbsearch(Ndb *db, Ndbs *s, char *attr, char
*val)
Ndbtuple* ndbsnext(Ndbs *s, char *attr, char *val)
char* ndbgetvalue(Ndb *db, Ndbs *s, char *attr, char
*val,
char *rattr, Ndbtuple **tp)
char* ipattr(char *name)
Ndbtuple* ndbgetipaddr(Ndb *db, char *sys);
Ndbtuple* ndbipinfo(Ndb *db, char *attr, char *val, char
**attrs,
int nattr)
ulong ndbhash(char *val, int hlen)
Ndbtuple* ndbparse(Ndb *db)
Ndbtuple* ndbfindattr(Ndbtuple *entry, Ndbtuple *line, char
*attr)
void ndbfree(Ndbtuple *db)
Ndbtuple* ndbdiscard(Ndbtuple *t, Ndbtuple *a)
Page 1 Plan 9 (printed 10/28/25)
NDB(3) NDB(3)
Ndbtuple* ndbconcatenate(Ndbtuple *a, Ndbtuple *b);
Ndbtuple* ndbreorder(Ndbtuple *t, Ndbtuple *a);
Ndbtuple* ndbsubstitute(Ndbtuple *t, Ndbtuple *from, Ndbtu-
ple *to);
DESCRIPTION
These routines are used by network administrative programs
to search the network database. They operate on the data-
base files described in ndb(7).
Ndbopen opens the database file and calls malloc(3) to allo-
cate a buffer for it. If file is zero, all network database
files are opened.
Ndbcat concatenates two open databases. Either argument may
be nil.
Ndbreopen checks if the database files associated with db
have changed and if so throws out any cached information and
reopens the files.
Ndbclose closes any database files associated with db and
frees all storage associated with them.
Ndbsearch and ndbsnext search a database for an entry con-
taining the attribute/value pair, attr=val. Ndbsearch is
used to find the first match and ndbsnext is used to find
each successive match. On a successful search both return a
linked list of Ndbtuple structures acquired by malloc(3)
that represent the attribute/value pairs in the entry. On
failure they return zero.
typedef struct Ndbtuple Ndbtuple;
struct Ndbtuple {
char attr[Ndbalen];
char *val;
Ndbtuple *entry;
Ndbtuple *line;
ulong ptr; /* for the application; starts 0 */
char valbuf[Ndbvlen]; /* initial allocation for val */
};
The entry pointers chain together all pairs in the entry in
a null-terminated list. The line pointers chain together
all pairs on the same line in a circular list. Thus, a pro-
gram can implement 2 levels of binding for pairs in an
entry. In general, pairs on the same line are bound tighter
than pairs on different lines.
The argument s of ndbsearch has type Ndbs and should be
Page 2 Plan 9 (printed 10/28/25)
NDB(3) NDB(3)
pointed to valid storage before calling ndbsearch, which
will fill it with information used by ndbsnext to link suc-
cessive searches. The structure Ndbs looks like:
typedef struct Ndbs Ndbs;
struct Ndbs {
Ndb *db; /* data base file being searched */
...
Ndbtuple *t; /* last attribute value pair found */
};
The t field points to the pair within the entry matched by
the ndbsearch or ndbsnext.
Ndbgetvalue searches the database for an entry containing
not only an attribute/value pair, attr=val, but also a pair
with the attribute rattr. If successful, it returns a mal-
loced copy of the null terminated value associated with
rattr. If tp is non nil, *tp will point to the entry. Oth-
erwise the entry will be freeed.
Ndbfree frees a list of tuples returned by one of the other
routines.
Ipattr takes the name of an IP system and returns the
attribute it corresponds to:
dom domain name
ip Internet number
sys system name
Ndbgetipaddr looks in db for an entry matching sys as the
value of a sys= or dom= attribute/value pair and returns all
IP addresses in the entry. If sys is already an IP address,
a tuple containing just that address is returned.
Ndbipinfo looks up Internet protocol information about a
system. This is an IP aware search. It looks first for
information in the system's database entry and then in the
database entries for any IP subnets or networks containing
the system. The system is identified by the attribute/value
pair, attr=val. Ndbipinfo returns a list of tuples whose
attributes match the attributes in the n element array
attrs. For example, consider the following database entries
describing a network, a subnetwork, and a system.
ipnet=big ip=10.0.0.0
dns=dns.big.com
smtp=smtp.big.com
ipnet=dept ip=10.1.1.0 ipmask=255.255.255.0
Page 3 Plan 9 (printed 10/28/25)
NDB(3) NDB(3)
smtp=smtp1.big.com
ip=10.1.1.4 dom=x.big.com
bootf=/386/9pc
Calling
ndbipinfo(db, "dom", "x.big.com", ["bootf" "smtp" "dns"], 3)
will return the tuples bootf=/386/9pc, smtp=smtp1.big.com,
and dns=dns.big.com.
The next three routines are used by programs that create the
hash tables and database files. Ndbhash computes a hash
offset into a table of length hlen for the string val.
Ndbparse reads and parses the next entry from the database
file. Multiple calls to ndbparse parse sequential entries
in the database file. A zero is returned at end of file.
Ndbfindattr searches entry for the tuple with attribute attr
and returns a pointer to the tuple. If line points to a
particular line in the entry, the search starts there and
then wraps around to the beginning of the entry.
All of the routines provided to search the database provide
an always consistent view of the relevant files. However,
it may be advantageous for an application to read in the
whole database using ndbopen and ndbparse and provide its
own search routines. The ndbchanged routine can be used by
the application to periodicly check for changes. It returns
zero if none of the files comprising the database have
changes and non-zero if they have.
Finally, a number of routines are provided for manipulating
tuples.
Ndbdiscard removes attr/val pair a from tuple t and frees
it. If a isn't in t it is just freed.
Ndbconcatenate concatenates two tuples and returns the
result. Either or both tuples may be nil.
Ndbreorder reorders a tuple t to make the line containing
attr/val pair a first in the entry and making a first in its
line.
Ndbsubstitute replaces a single att/val pair from in t with
the tuple to. All attr/val pairs in to end up on the same
line. from is freed.
FILES
/usr/local/plan9/ndb
directory of network database files
Page 4 Plan 9 (printed 10/28/25)
NDB(3) NDB(3)
SOURCE
/usr/local/plan9/src/libndb
SEE ALSO
ndb(1) ndb(7)
DIAGNOSTICS
Ndbgetvalue and ndblookvalue set errstr to buffer too short
if the buffer provided isn't long enough for the returned
value.
BUGS
Ndbgetval and ndblookval are deprecated versions of
ndbgetvalue and ndblookvalue. They expect a fixed 64 byte
long result buffer and existed when the values of a Ndbtuple
structure where fixed length.
Page 5 Plan 9 (printed 10/28/25)