NDB(2)                                                     NDB(2)

     NAME
          ndbopen, ndbcat, ndbclose, ndbreopen, ndbsearch, ndbsnext,
          ndbgetval, ndbfree, ipattr, ndbipinfo, csipinfo, ndbhash,
          ndbparse, csgetval, ndblookval, dnsquery - 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)

          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)

          Ndbtuple*  csgetval(char *netroot, char *attr, char *val,
          char *rattr, char *buf)

          void       ndbfree(Ndbtuple *db)

          char*      ipattr(char *name)

          Ndbtuple*  ndbipinfo(Ndb *db, char *attr, char *val, char
          **attrs,
                     int nattr)

          Ndbtuple*  csipinfo(char *netroot, char *attr, char *val,
          char **attrs,
                     int nattr)

          ulong      ndbhash(char *val, int hlen)

          Ndbtuple*  ndbparse(Ndb *db)

          Ndbtuple*  dnsquery(char *netroot, char *domainname, char
          *type)

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

     NDB(2)                                                     NDB(2)

          Ndbtuple*  ndblookval(Ndbtuple *entry, Ndbtuple *line, char
          *attr, char *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(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.

          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(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;
                       ulong     ptr;    /* for the application; starts 0 */
               };

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

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

     NDB(2)                                                     NDB(2)

               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.  Csgetval is like ndbgetval but queries
          the connection server instead of looking directly at the
          database.  It's first argument specifies the network root to
          use.  If the argument is 0, it defaults to "/net".

          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

          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 ipsubmask=255.255.255.0
                     dns=dns.big.com
                     smtp=smtp.big.com
          ipnet=dept ip=10.1.1.0 ipmask=255.255.255.0
                     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)

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

     NDB(2)                                                     NDB(2)

          will return the tuples bootf=/386/9pc, smtp=smtp1.big.com,
          and dns=dns.big.com.

          Csipinfo is to ndbipinfo as csgetval is to ndbgetval.

          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.
          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.

          Dnsquery submits a query about domainname to the ndb/dns
          mounted at netroot/dns.  It returns a linked list of
          Ndbtuple's representing a single database entry.  The tuples
          are logicly arranged into lines using the line fieldin the
          structure.  The possible type's of query are and the
          attributes on each returned tuple line is:

          ip   find the IP addresses.  Returns domain name (dom) and
               ip address (ip)

          mx   look up the mail exchangers.  Returns preference (pref)
               and exchanger (mx)

          ptr  do a reverse query.  Here domainname must be an ASCII
               IP address.  Returns reverse name (ptr) and domain name
               (dom)

          cname
               get the system that this name is a nickname for.
               Returns the nickname (dom) and the real name (cname)

          soa  return the start of area record for this field.
               Returns area name (dom), primary name server (ns),
               serial number (serial), refresh time in seconds
               (refresh), retry time in seconds (retry), expiration
               time in seconds (expire), and minimum time to lie
               (ttl).

          ns   name servers.  Returns domain name (dom) and name
               server (ns)

          Ndblookval searches entry for the tuple with attribute attr,
          copies the value into to, 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 begin-
          ning of the entry.

     FILES
          /lib/ndb    directory of network database files

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

     NDB(2)                                                     NDB(2)

     SOURCE
          /sys/src/libndb

     SEE ALSO
          ndb(6) ndb(8)

     DIAGNOSTICS
          These routines set errstr.

     Page 5                       Plan 9            (printed 12/26/24)