Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

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