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