]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - lib/libc/gen/getcap.3
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / lib / libc / gen / getcap.3
1 .\" Copyright (c) 1992, 1993
2 .\"     The Regents of the University of California.  All rights reserved.
3 .\"
4 .\" This code is derived from software contributed to Berkeley by
5 .\" Casey Leedom of Lawrence Livermore National Laboratory.
6 .\"
7 .\" Redistribution and use in source and binary forms, with or without
8 .\" modification, are permitted provided that the following conditions
9 .\" are met:
10 .\" 1. Redistributions of source code must retain the above copyright
11 .\"    notice, this list of conditions and the following disclaimer.
12 .\" 2. Redistributions in binary form must reproduce the above copyright
13 .\"    notice, this list of conditions and the following disclaimer in the
14 .\"    documentation and/or other materials provided with the distribution.
15 .\" 4. Neither the name of the University nor the names of its contributors
16 .\"    may be used to endorse or promote products derived from this software
17 .\"    without specific prior written permission.
18 .\"
19 .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 .\" SUCH DAMAGE.
30 .\"
31 .\"     @(#)getcap.3    8.4 (Berkeley) 5/13/94
32 .\" $FreeBSD$
33 .\"
34 .Dd March 22, 2002
35 .Dt GETCAP 3
36 .Os
37 .Sh NAME
38 .Nm cgetent ,
39 .Nm cgetset ,
40 .Nm cgetmatch ,
41 .Nm cgetcap ,
42 .Nm cgetnum ,
43 .Nm cgetstr ,
44 .Nm cgetustr ,
45 .Nm cgetfirst ,
46 .Nm cgetnext ,
47 .Nm cgetclose
48 .Nd capability database access routines
49 .Sh LIBRARY
50 .Lb libc
51 .Sh SYNOPSIS
52 .In stdlib.h
53 .Ft int
54 .Fn cgetent "char **buf" "char **db_array" "const char *name"
55 .Ft int
56 .Fn cgetset "const char *ent"
57 .Ft int
58 .Fn cgetmatch "const char *buf" "const char *name"
59 .Ft char *
60 .Fn cgetcap "char *buf" "const char *cap" "int type"
61 .Ft int
62 .Fn cgetnum "char *buf" "const char *cap" "long *num"
63 .Ft int
64 .Fn cgetstr "char *buf" "const char *cap" "char **str"
65 .Ft int
66 .Fn cgetustr "char *buf" "const char *cap" "char **str"
67 .Ft int
68 .Fn cgetfirst "char **buf" "char **db_array"
69 .Ft int
70 .Fn cgetnext "char **buf" "char **db_array"
71 .Ft int
72 .Fn cgetclose "void"
73 .Sh DESCRIPTION
74 The
75 .Fn cgetent
76 function extracts the capability
77 .Fa name
78 from the database specified by the
79 .Dv NULL
80 terminated file array
81 .Fa db_array
82 and returns a pointer to a
83 .Xr malloc 3 Ns \&'d
84 copy of it in
85 .Fa buf .
86 The
87 .Fn cgetent
88 function will first look for files ending in
89 .Pa .db
90 (see
91 .Xr cap_mkdb 1 )
92 before accessing the ASCII file.
93 The
94 .Fa buf
95 argument
96 must be retained through all subsequent calls to
97 .Fn cgetmatch ,
98 .Fn cgetcap ,
99 .Fn cgetnum ,
100 .Fn cgetstr ,
101 and
102 .Fn cgetustr ,
103 but may then be
104 .Xr free 3 Ns \&'d .
105 On success 0 is returned, 1 if the returned
106 record contains an unresolved
107 .Ic tc
108 expansion,
109 \-1 if the requested record could not be found,
110 \-2 if a system error was encountered (could not open/read a file, etc.) also
111 setting
112 .Va errno ,
113 and \-3 if a potential reference loop is detected (see
114 .Ic tc=
115 comments below).
116 .Pp
117 The
118 .Fn cgetset
119 function enables the addition of a character buffer containing a single capability
120 record entry
121 to the capability database.
122 Conceptually, the entry is added as the first ``file'' in the database, and
123 is therefore searched first on the call to
124 .Fn cgetent .
125 The entry is passed in
126 .Fa ent .
127 If
128 .Fa ent
129 is
130 .Dv NULL ,
131 the current entry is removed from the database.
132 A call to
133 .Fn cgetset
134 must precede the database traversal.
135 It must be called before the
136 .Fn cgetent
137 call.
138 If a sequential access is being performed (see below), it must be called
139 before the first sequential access call
140 .Fn ( cgetfirst
141 or
142 .Fn cgetnext ) ,
143 or be directly preceded by a
144 .Fn cgetclose
145 call.
146 On success 0 is returned and \-1 on failure.
147 .Pp
148 The
149 .Fn cgetmatch
150 function will return 0 if
151 .Fa name
152 is one of the names of the capability record
153 .Fa buf ,
154 \-1 if
155 not.
156 .Pp
157 The
158 .Fn cgetcap
159 function searches the capability record
160 .Fa buf
161 for the capability
162 .Fa cap
163 with type
164 .Fa type .
165 A
166 .Fa type
167 is specified using any single character.
168 If a colon (`:') is used, an
169 untyped capability will be searched for (see below for explanation of
170 types).
171 A pointer to the value of
172 .Fa cap
173 in
174 .Fa buf
175 is returned on success,
176 .Dv NULL
177 if the requested capability could not be
178 found.
179 The end of the capability value is signaled by a `:' or
180 .Tn ASCII
181 .Dv NUL
182 (see below for capability database syntax).
183 .Pp
184 The
185 .Fn cgetnum
186 function retrieves the value of the numeric capability
187 .Fa cap
188 from the capability record pointed to by
189 .Fa buf .
190 The numeric value is returned in the
191 .Ft long
192 pointed to by
193 .Fa num .
194 0 is returned on success, \-1 if the requested numeric capability could not
195 be found.
196 .Pp
197 The
198 .Fn cgetstr
199 function retrieves the value of the string capability
200 .Fa cap
201 from the capability record pointed to by
202 .Fa buf .
203 A pointer to a decoded,
204 .Dv NUL
205 terminated,
206 .Xr malloc 3 Ns \&'d
207 copy of the string is returned in the
208 .Ft char *
209 pointed to by
210 .Fa str .
211 The number of characters in the decoded string not including the trailing
212 .Dv NUL
213 is returned on success, \-1 if the requested string capability could not
214 be found, \-2 if a system error was encountered (storage allocation
215 failure).
216 .Pp
217 The
218 .Fn cgetustr
219 function is identical to
220 .Fn cgetstr
221 except that it does not expand special characters, but rather returns each
222 character of the capability string literally.
223 .Pp
224 The
225 .Fn cgetfirst
226 and
227 .Fn cgetnext
228 functions comprise a function group that provides for sequential
229 access of the
230 .Dv NULL
231 pointer terminated array of file names,
232 .Fa db_array .
233 The
234 .Fn cgetfirst
235 function returns the first record in the database and resets the access
236 to the first record.
237 The
238 .Fn cgetnext
239 function returns the next record in the database with respect to the
240 record returned by the previous
241 .Fn cgetfirst
242 or
243 .Fn cgetnext
244 call.
245 If there is no such previous call, the first record in the database is
246 returned.
247 Each record is returned in a
248 .Xr malloc 3 Ns \&'d
249 copy pointed to by
250 .Fa buf .
251 .Ic Tc
252 expansion is done (see
253 .Ic tc=
254 comments below).
255 Upon completion of the database 0 is returned, 1 is returned upon successful
256 return of record with possibly more remaining (we have not reached the end of
257 the database yet), 2 is returned if the record contains an unresolved
258 .Ic tc
259 expansion, \-1 is returned if a system error occurred, and \-2
260 is returned if a potential reference loop is detected (see
261 .Ic tc=
262 comments below).
263 Upon completion of database (0 return) the database is closed.
264 .Pp
265 The
266 .Fn cgetclose
267 function closes the sequential access and frees any memory and file descriptors
268 being used.
269 Note that it does not erase the buffer pushed by a call to
270 .Fn cgetset .
271 .Sh CAPABILITY DATABASE SYNTAX
272 Capability databases are normally
273 .Tn ASCII
274 and may be edited with standard
275 text editors.
276 Blank lines and lines beginning with a `#' are comments
277 and are ignored.
278 Lines ending with a `\|\e' indicate that the next line
279 is a continuation of the current line; the `\|\e' and following newline
280 are ignored.
281 Long lines are usually continued onto several physical
282 lines by ending each line except the last with a `\|\e'.
283 .Pp
284 Capability databases consist of a series of records, one per logical
285 line.
286 Each record contains a variable number of `:'-separated fields
287 (capabilities).
288 Empty fields consisting entirely of white space
289 characters (spaces and tabs) are ignored.
290 .Pp
291 The first capability of each record specifies its names, separated by `|'
292 characters.
293 These names are used to reference records in the database.
294 By convention, the last name is usually a comment and is not intended as
295 a lookup tag.
296 For example, the
297 .Em vt100
298 record from the
299 .Xr termcap 5
300 database begins:
301 .Pp
302 .Dl "d0\||\|vt100\||\|vt100-am\||\|vt100am\||\|dec vt100:"
303 .Pp
304 giving four names that can be used to access the record.
305 .Pp
306 The remaining non-empty capabilities describe a set of (name, value)
307 bindings, consisting of a names optionally followed by a typed value:
308 .Pp
309 .Bl -tag -width "nameTvalue" -compact
310 .It name
311 typeless [boolean] capability
312 .Em name No "is present [true]"
313 .It name Ns Em \&T Ns value
314 capability
315 .Pq Em name , \&T
316 has value
317 .Em value
318 .It name@
319 no capability
320 .Em name No exists
321 .It name Ns Em T Ns \&@
322 capability
323 .Pq Em name , T
324 does not exist
325 .El
326 .Pp
327 Names consist of one or more characters.
328 Names may contain any character
329 except `:', but it is usually best to restrict them to the printable
330 characters and avoid use of graphics like `#', `=', `%', `@', etc.
331 Types
332 are single characters used to separate capability names from their
333 associated typed values.
334 Types may be any character except a `:'.
335 Typically, graphics like `#', `=', `%', etc.\& are used.
336 Values may be any
337 number of characters and may contain any character except `:'.
338 .Sh CAPABILITY DATABASE SEMANTICS
339 Capability records describe a set of (name, value) bindings.
340 Names may
341 have multiple values bound to them.
342 Different values for a name are
343 distinguished by their
344 .Fa types .
345 The
346 .Fn cgetcap
347 function will return a pointer to a value of a name given the capability
348 name and the type of the value.
349 .Pp
350 The types `#' and `=' are conventionally used to denote numeric and
351 string typed values, but no restriction on those types is enforced.
352 The
353 functions
354 .Fn cgetnum
355 and
356 .Fn cgetstr
357 can be used to implement the traditional syntax and semantics of `#'
358 and `='.
359 Typeless capabilities are typically used to denote boolean objects with
360 presence or absence indicating truth and false values respectively.
361 This interpretation is conveniently represented by:
362 .Pp
363 .Dl "(getcap(buf, name, ':') != NULL)"
364 .Pp
365 A special capability,
366 .Ic tc= name ,
367 is used to indicate that the record specified by
368 .Fa name
369 should be substituted for the
370 .Ic tc
371 capability.
372 .Ic Tc
373 capabilities may interpolate records which also contain
374 .Ic tc
375 capabilities and more than one
376 .Ic tc
377 capability may be used in a record.
378 A
379 .Ic tc
380 expansion scope (i.e., where the argument is searched for) contains the
381 file in which the
382 .Ic tc
383 is declared and all subsequent files in the file array.
384 .Pp
385 When a database is searched for a capability record, the first matching
386 record in the search is returned.
387 When a record is scanned for a
388 capability, the first matching capability is returned; the capability
389 .Ic :nameT@:
390 will hide any following definition of a value of type
391 .Em T
392 for
393 .Fa name ;
394 and the capability
395 .Ic :name@:
396 will prevent any following values of
397 .Fa name
398 from being seen.
399 .Pp
400 These features combined with
401 .Ic tc
402 capabilities can be used to generate variations of other databases and
403 records by either adding new capabilities, overriding definitions with new
404 definitions, or hiding following definitions via `@' capabilities.
405 .Sh EXAMPLES
406 .Bd -unfilled -offset indent
407 example\||\|an example of binding multiple values to names:\e
408         :foo%bar:foo^blah:foo@:\e
409         :abc%xyz:abc^frap:abc$@:\e
410         :tc=more:
411 .Ed
412 .Pp
413 The capability foo has two values bound to it (bar of type `%' and blah of
414 type `^') and any other value bindings are hidden.
415 The capability abc
416 also has two values bound but only a value of type `$' is prevented from
417 being defined in the capability record more.
418 .Bd -unfilled -offset indent
419 file1:
420         new\||\|new_record\||\|a modification of "old":\e
421                 :fript=bar:who-cares@:tc=old:blah:tc=extensions:
422 file2:
423         old\||\|old_record\||\|an old database record:\e
424                 :fript=foo:who-cares:glork#200:
425 .Ed
426 .Pp
427 The records are extracted by calling
428 .Fn cgetent
429 with file1 preceding file2.
430 In the capability record new in file1, fript=bar overrides the definition
431 of fript=foo interpolated from the capability record old in file2,
432 who-cares@ prevents the definition of any who-cares definitions in old
433 from being seen, glork#200 is inherited from old, and blah and anything
434 defined by the record extensions is added to those definitions in old.
435 Note that the position of the fript=bar and who-cares@ definitions before
436 tc=old is important here.
437 If they were after, the definitions in old
438 would take precedence.
439 .Sh CGETNUM AND CGETSTR SYNTAX AND SEMANTICS
440 Two types are predefined by
441 .Fn cgetnum
442 and
443 .Fn cgetstr :
444 .Pp
445 .Bl -tag -width "nameXnumber" -compact
446 .It Em name Ns \&# Ns Em number
447 numeric capability
448 .Em name
449 has value
450 .Em number
451 .It Em name Ns = Ns Em string
452 string capability
453 .Em name
454 has value
455 .Em string
456 .It Em name Ns \&#@
457 the numeric capability
458 .Em name
459 does not exist
460 .It Em name Ns \&=@
461 the string capability
462 .Em name
463 does not exist
464 .El
465 .Pp
466 Numeric capability values may be given in one of three numeric bases.
467 If the number starts with either
468 .Ql 0x
469 or
470 .Ql 0X
471 it is interpreted as a hexadecimal number (both upper and lower case a-f
472 may be used to denote the extended hexadecimal digits).
473 Otherwise, if the number starts with a
474 .Ql 0
475 it is interpreted as an octal number.
476 Otherwise the number is interpreted as a decimal number.
477 .Pp
478 String capability values may contain any character.
479 Non-printable
480 .Dv ASCII
481 codes, new lines, and colons may be conveniently represented by the use
482 of escape sequences:
483 .Bl -column "\e\|X,X\e\|X" "(ASCII octal nnn)"
484 ^X      ('X' & 037)     control-X
485 \e\|b, \e\|B    (ASCII 010)     backspace
486 \e\|t, \e\|T    (ASCII 011)     tab
487 \e\|n, \e\|N    (ASCII 012)     line feed (newline)
488 \e\|f, \e\|F    (ASCII 014)     form feed
489 \e\|r, \e\|R    (ASCII 015)     carriage return
490 \e\|e, \e\|E    (ASCII 027)     escape
491 \e\|c, \e\|C    (:)     colon
492 \e\|\e  (\e\|)  back slash
493 \e\|^   (^)     caret
494 \e\|nnn (ASCII octal nnn)
495 .El
496 .Pp
497 A `\|\e' may be followed by up to three octal digits directly specifies
498 the numeric code for a character.
499 The use of
500 .Tn ASCII
501 .Dv NUL Ns s ,
502 while easily
503 encoded, causes all sorts of problems and must be used with care since
504 .Dv NUL Ns s
505 are typically used to denote the end of strings; many applications
506 use `\e\|200' to represent a
507 .Dv NUL .
508 .Sh DIAGNOSTICS
509 The
510 .Fn cgetent ,
511 .Fn cgetset ,
512 .Fn cgetmatch ,
513 .Fn cgetnum ,
514 .Fn cgetstr ,
515 .Fn cgetustr ,
516 .Fn cgetfirst ,
517 and
518 .Fn cgetnext
519 functions
520 return a value greater than or equal to 0 on success and a value less
521 than 0 on failure.
522 The
523 .Fn cgetcap
524 function returns a character pointer on success and a
525 .Dv NULL
526 on failure.
527 .Pp
528 The
529 .Fn cgetent ,
530 and
531 .Fn cgetset
532 functions may fail and set
533 .Va errno
534 for any of the errors specified for the library functions:
535 .Xr fopen 3 ,
536 .Xr fclose 3 ,
537 .Xr open 2 ,
538 and
539 .Xr close 2 .
540 .Pp
541 The
542 .Fn cgetent ,
543 .Fn cgetset ,
544 .Fn cgetstr ,
545 and
546 .Fn cgetustr
547 functions
548 may fail and set
549 .Va errno
550 as follows:
551 .Bl -tag -width Er
552 .It Bq Er ENOMEM
553 No memory to allocate.
554 .El
555 .Sh SEE ALSO
556 .Xr cap_mkdb 1 ,
557 .Xr malloc 3
558 .Sh BUGS
559 Colons (`:') cannot be used in names, types, or values.
560 .Pp
561 There are no checks for
562 .Ic tc Ns = Ns Ic name
563 loops in
564 .Fn cgetent .
565 .Pp
566 The buffer added to the database by a call to
567 .Fn cgetset
568 is not unique to the database but is rather prepended to any database used.