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