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