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