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