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