Blob


1 .TH NDB 3
2 .SH NAME
3 ndbopen, ndbcat, ndbchanged, ndbclose, ndbreopen, ndbsearch, ndbsnext, ndbgetvalue, ndbfree, ipattr, ndbgetipaddr, ndbipinfo, ndbhash, ndbparse, ndbfindattr, ndbdiscard, ndbconcatenate, ndbreorder, ndbsubstitute, ndbgetval, ndblookval \- network database
4 .SH SYNOPSIS
5 .B #include <u.h>
6 .br
7 .B #include <libc.h>
8 .br
9 .B #include <bio.h>
10 .br
11 .B #include <ndb.h>
12 .ta \w'\fLNdbtuplexx 'u
13 .PP
14 .B
15 Ndb* ndbopen(char *file)
16 .PP
17 .B
18 Ndb* ndbcat(Ndb *db1, Ndb *db2)
19 .PP
20 .B
21 Ndb* ndbchanged(Ndb *db)
22 .PP
23 .B
24 int ndbreopen(Ndb *db)
25 .PP
26 .B
27 void ndbclose(Ndb *db)
28 .PP
29 .B
30 Ndbtuple* ndbsearch(Ndb *db, Ndbs *s, char *attr, char *val)
31 .PP
32 .B
33 Ndbtuple* ndbsnext(Ndbs *s, char *attr, char *val)
34 .PP
35 .B
36 char* ndbgetvalue(Ndb *db, Ndbs *s, char *attr, char *val,
37 .br
38 .B
39 char *rattr, Ndbtuple **tp)
40 .\" .PP
41 .\" .B
42 .\" char* csgetvalue(char *netroot, char *attr, char *val, char *rattr,
43 .\" Ndbtuple **tp)
44 .PP
45 .B
46 char* ipattr(char *name)
47 .PP
48 .B
49 Ndbtuple* ndbgetipaddr(Ndb *db, char *sys);
50 .PP
51 .B
52 Ndbtuple* ndbipinfo(Ndb *db, char *attr, char *val, char **attrs,
53 .br
54 .B int nattr)
55 .\" .PP
56 .\" .B
57 .\" Ndbtuple* csipinfo(char *netroot, char *attr, char *val, char **attrs,
58 .\" .br
59 .\" .B int nattr)
60 .PP
61 .B
62 ulong ndbhash(char *val, int hlen)
63 .PP
64 .B
65 Ndbtuple* ndbparse(Ndb *db)
66 .\" .PP
67 .\" .B
68 .\" Ndbtuple* dnsquery(char *netroot, char *domainname, char *type)
69 .PP
70 .B
71 Ndbtuple* ndbfindattr(Ndbtuple *entry, Ndbtuple *line, char *attr)
72 .PP
73 .B
74 void ndbfree(Ndbtuple *db)
75 .PP
76 .B
77 Ndbtuple* ndbdiscard(Ndbtuple *t, Ndbtuple *a)
78 .PP
79 .B
80 Ndbtuple* ndbconcatenate(Ndbtuple *a, Ndbtuple *b);
81 .PP
82 .B
83 Ndbtuple* ndbreorder(Ndbtuple *t, Ndbtuple *a);
84 .PP
85 .B
86 Ndbtuple* ndbsubstitute(Ndbtuple *t, Ndbtuple *from, Ndbtuple *to);
87 .SH DESCRIPTION
88 These routines are used by network administrative programs to search
89 the network database.
90 They operate on the database files described in
91 .MR ndb (7) .
92 .PP
93 .I Ndbopen
94 opens the database
95 .I file
96 and calls
97 .MR malloc (3)
98 to allocate a buffer for it.
99 If
100 .I file
101 is zero, all network database files are opened.
102 .PP
103 .I Ndbcat
104 concatenates two open databases. Either argument may be
105 nil.
106 .PP
107 .I Ndbreopen
108 checks if the database files associated with
109 .I db
110 have changed and if so throws out any cached information and reopens
111 the files.
112 .PP
113 .I Ndbclose
114 closes any database files associated with
115 .I db
116 and frees all storage associated with them.
117 .PP
118 .I Ndbsearch
119 and
120 .I ndbsnext
121 search a database for an entry containing the
122 attribute/value pair,
123 .IR attr = val .
124 .I Ndbsearch
125 is used to find the first match and
126 .I ndbsnext
127 is used to find each successive match.
128 On a successful search both return a linked list of
129 .I Ndbtuple
130 structures acquired by
131 .MR malloc (3)
132 that represent the attribute/value pairs in the
133 entry.
134 On failure they return zero.
135 .IP
136 .EX
137 typedef struct Ndbtuple Ndbtuple;
138 struct Ndbtuple {
139 char attr[Ndbalen];
140 char *val;
141 Ndbtuple *entry;
142 Ndbtuple *line;
143 ulong ptr; /* for the application; starts 0 */
144 char valbuf[Ndbvlen]; /* initial allocation for val */
145 };
146 .EE
147 .LP
148 The
149 .I entry
150 pointers chain together all pairs in the entry in a null-terminated list.
151 The
152 .I line
153 pointers chain together all pairs on the same line
154 in a circular list.
155 Thus, a program can implement 2 levels of binding for
156 pairs in an entry.
157 In general, pairs on the same line are bound tighter
158 than pairs on different lines.
159 .PP
160 The argument
161 .I s
162 of
163 .I ndbsearch
164 has type
165 .I Ndbs
166 and should be pointed to valid storage before calling
167 .IR ndbsearch ,
168 which will fill it with information used by
169 .I ndbsnext
170 to link successive searches.
171 The structure
172 .I Ndbs
173 looks like:
174 .IP
175 .EX
176 typedef struct Ndbs Ndbs;
177 struct Ndbs {
178 Ndb *db; /* data base file being searched */
179 ...
180 Ndbtuple *t; /* last attribute value pair found */
181 };
182 .EE
183 .LP
184 The
185 .I t
186 field points to the pair within the entry matched by the
187 .I ndbsearch
188 or
189 .IR ndbsnext .
190 .PP
191 .I Ndbgetvalue
192 searches the database for an entry containing not only an
193 attribute/value pair,
194 .IR attr = val ,
195 but also a pair with the attribute
196 .IR rattr .
197 If successful, it returns a malloced copy of the null terminated value associated with
198 .IR rattr .
199 If
200 .I tp
201 is non nil,
202 .I *tp
203 will point to the entry. Otherwise the entry will be freeed.
204 .\" .PP
205 .\" .I Csgetvalue
206 .\" is like
207 .\" .I ndbgetvalue
208 .\" but queries the connection server
209 .\" instead of looking directly at the database.
210 .\" Its first argument specifies the network root to use.
211 .\" If the argument is 0, it defaults to
212 .\" \f5"/net"\f1.
213 .PP
214 .I Ndbfree
215 frees a list of tuples returned by one of the other
216 routines.
217 .PP
218 .I Ipattr
219 takes the name of an IP system and returns the attribute
220 it corresponds to:
221 .RS
222 .TP
223 .B dom
224 domain name
225 .TP
226 .B ip
227 Internet number
228 .TP
229 .B sys
230 system name
231 .RE
232 .PP
233 .I Ndbgetipaddr
234 looks in
235 .I db
236 for an entry matching
237 .I sys
238 as the value of a
239 .B sys=
240 or
241 .B dom=
242 attribute/value pair and returns all IP addresses in the entry.
243 If
244 .I sys
245 is already an IP address, a tuple containing just
246 that address is returned.
247 .PP
248 .I Ndbipinfo
249 looks up Internet protocol information about a system.
250 This is an IP aware search. It looks first for information
251 in the system's database entry and then in the database entries
252 for any IP subnets or networks containing the system.
253 The system is identified by the
254 attribute/value pair,
255 .IR attr = val .
256 .I Ndbipinfo
257 returns a list of tuples whose attributes match the
258 attributes in the
259 .I n
260 element array
261 .IR attrs .
262 For example, consider the following database entries describing a network,
263 a subnetwork, and a system.
264 .PP
265 .EX
266 ipnet=big ip=10.0.0.0
267 dns=dns.big.com
268 smtp=smtp.big.com
269 ipnet=dept ip=10.1.1.0 ipmask=255.255.255.0
270 smtp=smtp1.big.com
271 ip=10.1.1.4 dom=x.big.com
272 bootf=/386/9pc
273 .EE
274 .PP
275 Calling
276 .PP
277 .EX
278 ndbipinfo(db, "dom", "x.big.com", ["bootf" "smtp" "dns"], 3)
279 .EE
280 .PP
281 will return the tuples
282 .BR bootf=/386/9pc ,
283 .BR smtp=smtp1.big.com ,
284 and
285 .BR dns=dns.big.com .
286 .\" .PP
287 .\" .I Csipinfo
288 .\" is to
289 .\" .I ndbipinfo
290 .\" as
291 .\" .I csgetval
292 .\" is to
293 .\" .IR ndbgetval .
294 .PP
295 The next three routines are used by programs that create the
296 hash tables and database files.
297 .I Ndbhash
298 computes a hash offset into a table of length
299 .I hlen
300 for the string
301 .IR val .
302 .I Ndbparse
303 reads and parses the next entry from the database file.
304 Multiple calls to
305 .IR ndbparse
306 parse sequential entries in the database file.
307 A zero is returned at end of file.
308 .\" .PP
309 .\" .I Dnsquery
310 .\" submits a query about
311 .\" .I domainname
312 .\" to the
313 .\" .I ndb/dns
314 .\" mounted at
315 .\" .IB netroot /dns.
316 .\" It returns a linked list of
317 .\" .I Ndbtuple's
318 .\" representing a single database entry.
319 .\" The tuples are logicly arranged into lines using the
320 .\" .B line
321 .\" fieldin the structure.
322 .\" The possible
323 .\" .IR type 's
324 .\" of query are and the attributes on each returned tuple line is:
325 .\" .TP
326 .\" .B ip
327 .\" find the IP addresses. Returns
328 .\" domain name
329 .\" .RI ( dom )
330 .\" and ip address
331 .\" .RI ( ip )
332 .\" .TP
333 .\" .B mx
334 .\" look up the mail exchangers. Returns preference
335 .\" .RI ( pref )
336 .\" and exchanger
337 .\" .RI ( mx )
338 .\" .TP
339 .\" .B ptr
340 .\" do a reverse query. Here
341 .\" .I domainname
342 .\" must be an
343 .\" .SM ASCII
344 .\" IP address. Returns reverse name
345 .\" .RI ( ptr )
346 .\" and domain name
347 .\" .RI ( dom )
348 .\" .TP
349 .\" .B cname
350 .\" get the system that this name is a nickname for. Returns the nickname
351 .\" .RI ( dom )
352 .\" and the real name
353 .\" .RI ( cname )
354 .\" .TP
355 .\" .B soa
356 .\" return the start of area record for this field. Returns
357 .\" area name
358 .\" .RI ( dom ),
359 .\" primary name server
360 .\" .RI ( ns ),
361 .\" serial number
362 .\" .RI ( serial ),
363 .\" refresh time in seconds
364 .\" .RI ( refresh ),
365 .\" retry time in seconds
366 .\" .RI ( retry ),
367 .\" expiration time in seconds
368 .\" .RI ( expire ),
369 .\" and minimum time to lie
370 .\" .RI ( ttl ).
371 .\" .TP
372 .\" .B ns
373 .\" name servers. Returns domain name
374 .\" .RI ( dom )
375 .\" and name server
376 .\" .RI ( ns )
377 .PP
378 .I Ndbfindattr
379 searches
380 .I entry
381 for the tuple
382 with attribute
383 .I attr
384 and returns a pointer to the tuple.
385 If
386 .I line
387 points to a particular line in the entry, the
388 search starts there and then wraps around to the beginning
389 of the entry.
390 .PP
391 All of the routines provided to search the database
392 provide an always consistent view of the relevant
393 files. However, it may be advantageous for an application
394 to read in the whole database using
395 .I ndbopen
396 and
397 .I ndbparse
398 and provide its own search routines. The
399 .I ndbchanged
400 routine can be used by the application to periodicly
401 check for changes. It returns zero
402 if none of the files comprising the database have
403 changes and non-zero if they have.
404 .PP
405 Finally, a number of routines are provided for manipulating
406 tuples.
407 .PP
408 .I Ndbdiscard
409 removes attr/val pair
410 .I a
411 from tuple
412 .I t
413 and frees it.
414 If
415 .I a
416 isn't in
417 .I t
418 it is just freed.
419 .PP
420 .I Ndbconcatenate
421 concatenates two tuples and returns the result. Either
422 or both tuples may be nil.
423 .PP
424 .I Ndbreorder
425 reorders a tuple
426 .IR t
427 to make the line containing attr/val pair
428 .I a
429 first in the entry and making
430 .I a
431 first in its line.
432 .PP
433 .I Ndbsubstitute
434 replaces a single att/val pair
435 .I from
436 in
437 .I t
438 with the tuple
439 .IR to .
440 All attr/val pairs in
441 .I to
442 end up on the same line.
443 .I from
444 is freed.
445 .SH FILES
446 .TP
447 .B \*9/ndb
448 directory of network database files
449 .PD
450 .SH SOURCE
451 .B \*9/src/libndb
452 .SH SEE ALSO
453 .MR ndb (1)
454 .MR ndb (7)
455 .SH DIAGNOSTICS
456 .IR Ndbgetvalue
457 and
458 .I ndblookvalue
459 set
460 .I errstr
461 to
462 .B "buffer too short"
463 if the buffer provided isn't long enough for the
464 returned value.
465 .SH BUGS
466 .IR Ndbgetval
467 and
468 .I ndblookval
469 are deprecated versions of
470 .IR ndbgetvalue
471 and
472 .IR ndblookvalue .
473 They expect a fixed 64 byte long result
474 buffer and existed when the values of a
475 .I Ndbtuple
476 structure where fixed length.