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 March 22, 2002 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" "const char *name" 59.Ft int 60.Fn cgetset "const char *ent" 61.Ft int 62.Fn cgetmatch "const char *buf" "const char *name" 63.Ft char * 64.Fn cgetcap "char *buf" "const char *cap" "int type" 65.Ft int 66.Fn cgetnum "char *buf" "const char *cap" "long *num" 67.Ft int 68.Fn cgetstr "char *buf" "const char *cap" "char **str" 69.Ft int 70.Fn cgetustr "char *buf" "const 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 could not be found, 114\-2 if a system error was encountered (could not 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 could not 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 could not 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 could not 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 have not 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 is 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 (`:') cannot 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