NDB(2X)                                                   NDB(2X)

     NAME
          ndbopen, ndbclose, ndbreopen, ndbsearch, ndbsnext,
          ndbgetval, ndbfree, ipattr, ipinfo, ndbhash, ndbseek,
          ndbparse - network database

     SYNOPSIS
          #include <bio.h>
          #include <ndb.h>

          Ndb*       ndbopen(char *file);

          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);

          Ndbtuple*  ndbgetval(Ndb *db, Ndbs *s, char *attr, char
          *val,
                     char *rattr, char *buf);

          void       ndbfree(Ndbtuple *db);

          char*      ipattr(char *name);

          int        ipinfo(Ndb *db, char *ether, char *ip, char
          *name,
                     Ipinfo *iip);

          ulong      ndbhash(char *val, int hlen);

          long       ndbseek(Ndb *db, long off, int whence);

          Ndbtuple*  ndbparse(Ndb *db);

     DESCRIPTION
          These routines are used by network administrative programs
          to search the network database.  They operate on the data-
          base files described in ndb(6).

          Ndbopen opens the database file and calls malloc(2) to allo-
          cate a buffer for it.  If file is zero, all network database
          files are opened.

          Ndbreopen checks if the database files associated with db
          have changed and if so throws out any cached information and
          reopens the files.

     Page 1                       Plan 9             (printed 4/26/24)

     NDB(2X)                                                   NDB(2X)

          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(2)
          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[Ndbvlen];
                       Ndbtuple  *entry;
                       Ndbtuple  *line;
               };

          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 structure Ndbs is used to link successive searches.

               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.

          Ndbgetval 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 copies the value
          associated with rattr into buf. Buf must point to an area at
          least Ndbvlen long.

          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

     Page 2                       Plan 9             (printed 4/26/24)

     NDB(2X)                                                   NDB(2X)

          ip   Internet number

          sys  system name

          Ipinfo searches the database for Internet Protocol informa-
          tion about a system and returns it in the structure
          addressed by iip. The arguments ether (textual Ethernet
          address), ip (textual IP address), and name identify the
          system.  At least one must be non-zero.  Ipinfo returns 0 if
          successful, -1 otherwise.  Both bootp(8) and ipconfig(8) use
          ipinfo to search the database.

          The last three calls 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.
          Ndbseek causes a subsequent read, write, or ndbparse of the
          database file to start at the position specified by the last
          two arguments.  These arguments have the same meaning as the
          last two arguments of seek(2). Ndbseek returns a negative
          number on error.  Ndbparse reads and parses the next entry
          from the database file.  Multiple ndbparse's without inter-
          vening ndbseek's parse sequential entries in the database
          file.  A zero is returned at end of file.

     SEE ALSO
          ndb(6) ndb(8)

     Page 3                       Plan 9             (printed 4/26/24)