1.. index:: API 2 3The libxo API 4============= 5 6This section gives details about the functions in libxo, how to call 7them, and the actions they perform. 8 9.. index:: Handles 10.. _handles: 11 12Handles 13------- 14 15libxo uses "handles" to control its rendering functionality. The 16handle contains state and buffered data, as well as callback functions 17to process data. 18 19Handles give an abstraction for libxo that encapsulates the state of a 20stream of output. Handles have the data type "`xo_handle_t`" and are 21opaque to the caller. 22 23The library has a default handle that is automatically initialized. 24By default, this handle will send text style output (`XO_STYLE_TEXT`) to 25standard output. The xo_set_style and xo_set_flags functions can be 26used to change this behavior. 27 28For the typical command that is generating output on standard output, 29there is no need to create an explicit handle, but they are available 30when needed, e.g., for daemons that generate multiple streams of 31output. 32 33Many libxo functions take a handle as their first parameter; most that 34do not use the default handle. Any function taking a handle can be 35passed NULL to access the default handle. For the convenience of 36callers, the libxo library includes handle-less functions that 37implicitly use the default handle. 38 39For example, the following are equivalent:: 40 41 xo_emit("test"); 42 xo_emit_h(NULL, "test"); 43 44Handles are created using `xo_create` and destroy using 45`xo_destroy`. 46 47.. index:: xo_create 48 49xo_create 50~~~~~~~~~ 51 52.. c:function:: xo_handle_t *xo_create (xo_style_t style, xo_xof_flags_t flags) 53 54 The `xo_create` function allocates a new handle which can be passed 55 to further libxo function calls. The `xo_handle_t` structure is 56 opaque. 57 58 :param xo_style_t style: Output style (XO_STYLE\_*) 59 :param xo_xof_flags_t flags: Flags for this handle (XOF\_*) 60 :return: New libxo handle 61 :rtype: xo_handle_t \* 62 63 :: 64 65 EXAMPLE: 66 xo_handle_t *xop = xo_create(XO_STYLE_JSON, XOF_WARN | XOF_PRETTY); 67 .... 68 xo_emit_h(xop, "testing\n"); 69 70 See also :ref:`output-styles` and :ref:`flags`. 71 72.. index:: xo_create_to_file 73.. index:: XOF_CLOSE_FP 74 75xo_create_to_file 76~~~~~~~~~~~~~~~~~ 77 78.. c:function:: 79 xo_handle_t *xo_create_to_file (FILE *fp, unsigned style, unsigned flags) 80 81 The `xo_create_to_file` function is aconvenience function is 82 provided for situations when output should be written to a different 83 file, rather than the default of standard output. 84 85 The `XOF_CLOSE_FP` flag can be set on the returned handle to trigger a 86 call to fclose() for the FILE pointer when the handle is destroyed, 87 avoiding the need for the caller to perform this task. 88 89 :param fp: FILE to use as base for this handle 90 :type fp: FILE * 91 :param xo_style_t style: Output style (XO_STYLE\_*) 92 :param xo_xof_flags_t flags: Flags for this handle (XOF\_*) 93 :return: New libxo handle 94 :rtype: xo_handle_t \* 95 96.. index:: xo_set_writer 97.. index:: xo_write_func_t 98.. index:: xo_close_func_t 99.. index:: xo_flush_func_t 100 101xo_set_writer 102~~~~~~~~~~~~~ 103 104.. c:function:: 105 void xo_set_writer (xo_handle_t *xop, void *opaque, \ 106 xo_write_func_t write_func, xo_close_func_t close_func, \ 107 xo_flush_func_t flush_func) 108 109 The `xo_set_writer` function allows custom functions which can 110 tailor how libxo writes data. The `opaque` argument is recorded and 111 passed back to the functions, allowing the function to acquire 112 context information. The *write_func* function writes data to the 113 output stream. The *close_func* function can release this opaque 114 data and any other resources as needed. The *flush_func* function 115 is called to flush buffered data associated with the opaque object. 116 117 :param xop: Handle to modify (or NULL for default handle) 118 :type xop: xo_handle_t * 119 :param opaque: Pointer to opaque data passed to the given functions 120 :type opaque: void * 121 :param xo_write_func_t write_func: New write function 122 :param xo_close_func_t close_func: New close function 123 :param xo_flush_func_t flush_func: New flush function 124 :returns: void 125 126.. index:: xo_get_style 127 128xo_get_style 129~~~~~~~~~~~~ 130 131.. c:function:: xo_style_t xo_get_style(xo_handle_t *xop) 132 133 Use the `xo_get_style` function to find the current output style for 134 a given handle. To use the default handle, pass a `NULL` handle. 135 136 :param xop: Handle to interrogate (or NULL for default handle) 137 :type xop: xo_handle_t * 138 :returns: Output style (XO_STYLE\_*) 139 :rtype: xo_style_t 140 141 :: 142 143 EXAMPLE:: 144 style = xo_get_style(NULL); 145 146.. index:: XO_STYLE_TEXT 147.. index:: XO_STYLE_XML 148.. index:: XO_STYLE_JSON 149.. index:: XO_STYLE_HTML 150 151.. _output-styles: 152 153Output Styles (XO_STYLE\_\*) 154++++++++++++++++++++++++++++ 155 156The libxo functions accept a set of output styles: 157 158 =============== ========================= 159 Flag Description 160 =============== ========================= 161 XO_STYLE_TEXT Traditional text output 162 XO_STYLE_XML XML encoded data 163 XO_STYLE_JSON JSON encoded data 164 XO_STYLE_HTML HTML encoded data 165 =============== ========================= 166 167The "XML", "JSON", and "HTML" output styles all use the UTF-8 168character encoding. "TEXT" using locale-based encoding. 169 170.. index:: xo_set_style 171 172xo_set_style 173~~~~~~~~~~~~ 174 175.. c:function:: void xo_set_style(xo_handle_t *xop, xo_style_t style) 176 177 The `xo_set_style` function is used to change the output style 178 setting for a handle. To use the default handle, pass a `NULL` 179 handle. 180 181 :param xop: Handle to modify 182 :type xop: xo_handle_t * 183 :param xo_style_t style: Output style (XO_STYLE\_*) 184 :returns: void 185 186 :: 187 188 EXAMPLE: 189 xo_set_style(NULL, XO_STYLE_XML); 190 191.. index:: xo_set_style_name 192 193xo_set_style_name 194~~~~~~~~~~~~~~~~~ 195 196.. c:function:: int xo_set_style_name (xo_handle_t *xop, const char *style) 197 198 The `xo_set_style_name` function can be used to set the style based 199 on a name encoded as a string: The name can be any of the supported 200 styles: "text", "xml", "json", or "html". 201 202 :param xop: Handle for modify (or NULL for default handle) 203 :type xop: xo_handle_t \* 204 :param style: Text name of the style 205 :type style: const char \* 206 :returns: zero for success, non-zero for error 207 :rtype: int 208 209 :: 210 211 EXAMPLE: 212 xo_set_style_name(NULL, "html"); 213 214.. index:: xo_set_flags 215 216xo_set_flags 217~~~~~~~~~~~~ 218 219.. c:function:: void xo_set_flags(xo_handle_t *xop, xo_xof_flags_t flags) 220 221 :param xop: Handle for modify (or NULL for default handle) 222 :type xop: xo_handle_t \* 223 :param xo_xof_flags_t flags: Flags to add for the handle 224 :returns: void 225 226 Use the `xo_set_flags` function to turn on flags for a given libxo 227 handle. To use the default handle, pass a `NULL` handle. 228 229 :: 230 231 EXAMPLE: 232 xo_set_flags(NULL, XOF_PRETTY | XOF_WARN); 233 234.. index:: Flags; XOF_* 235.. index:: XOF_CLOSE_FP 236.. index:: XOF_COLOR 237.. index:: XOF_COLOR_ALLOWED 238.. index:: XOF_DTRT 239.. index:: XOF_INFO 240.. index:: XOF_KEYS 241.. index:: XOF_NO_ENV 242.. index:: XOF_NO_HUMANIZE 243.. index:: XOF_PRETTY 244.. index:: XOF_UNDERSCORES 245.. index:: XOF_UNITS 246.. index:: XOF_WARN 247.. index:: XOF_WARN_XML 248.. index:: XOF_XPATH 249.. index:: XOF_COLUMNS 250.. index:: XOF_FLUSH 251 252.. _flags: 253 254Flags (XOF\_\*) 255+++++++++++++++ 256 257The set of valid flags include: 258 259 =================== ========================================= 260 Flag Description 261 =================== ========================================= 262 XOF_CLOSE_FP Close file pointer on `xo_destroy` 263 XOF_COLOR Enable color and effects in output 264 XOF_COLOR_ALLOWED Allow color/effect for terminal output 265 XOF_DTRT Enable "do the right thing" mode 266 XOF_INFO Display info data attributes (HTML) 267 XOF_KEYS Emit the key attribute (XML) 268 XOF_NO_ENV Do not use the :ref:`libxo-options` env var 269 XOF_NO_HUMANIZE Display humanization (TEXT, HTML) 270 XOF_PRETTY Make "pretty printed" output 271 XOF_UNDERSCORES Replaces hyphens with underscores 272 XOF_UNITS Display units (XML, HMTL) 273 XOF_WARN Generate warnings for broken calls 274 XOF_WARN_XML Generate warnings in XML on stdout 275 XOF_XPATH Emit XPath expressions (HTML) 276 XOF_COLUMNS Force xo_emit to return columns used 277 XOF_FLUSH Flush output after each `xo_emit` call 278 =================== ========================================= 279 280The `XOF_CLOSE_FP` flag will trigger the call of the *close_func* 281(provided via `xo_set_writer`) when the handle is destroyed. 282 283The `XOF_COLOR` flag enables color and effects in output regardless 284of output device, while the `XOF_COLOR_ALLOWED` flag allows color 285and effects only if the output device is a terminal. 286 287The `XOF_PRETTY` flag requests "pretty printing", which will trigger 288the addition of indentation and newlines to enhance the readability of 289XML, JSON, and HTML output. Text output is not affected. 290 291The `XOF_WARN` flag requests that warnings will trigger diagnostic 292output (on standard error) when the library notices errors during 293operations, or with arguments to functions. Without warnings enabled, 294such conditions are ignored. 295 296Warnings allow developers to debug their interaction with libxo. 297The function `xo_failure` can used as a breakpoint for a debugger, 298regardless of whether warnings are enabled. 299 300If the style is `XO_STYLE_HTML`, the following additional flags can be 301used: 302 303 =============== ========================================= 304 Flag Description 305 =============== ========================================= 306 XOF_XPATH Emit "data-xpath" attributes 307 XOF_INFO Emit additional info fields 308 =============== ========================================= 309 310The `XOF_XPATH` flag enables the emission of XPath expressions detailing 311the hierarchy of XML elements used to encode the data field, if the 312XPATH style of output were requested. 313 314The `XOF_INFO` flag encodes additional informational fields for HTML 315output. See :ref:`field-information` for details. 316 317If the style is `XO_STYLE_XML`, the following additional flags can be 318used: 319 320 =============== ========================================= 321 Flag Description 322 =============== ========================================= 323 XOF_KEYS Flag "key" fields for XML 324 =============== ========================================= 325 326The `XOF_KEYS` flag adds "key" attribute to the XML encoding for 327field definitions that use the "k" modifier. The key attribute has 328the value "key":: 329 330 xo_emit("{k:name}", item); 331 332 XML: 333 <name key="key">truck</name> 334 335.. index:: xo_clear_flags 336 337xo_clear_flags 338++++++++++++++ 339 340.. c:function:: void xo_clear_flags (xo_handle_t *xop, xo_xof_flags_t flags) 341 342 :param xop: Handle for modify (or NULL for default handle) 343 :type xop: xo_handle_t \* 344 :param xo_xof_flags_t flags: Flags to clear for the handle 345 :returns: void 346 347 Use the `xo_clear_flags` function to turn off the given flags in a 348 specific handle. To use the default handle, pass a `NULL` handle. 349 350.. index:: xo_set_options 351 352xo_set_options 353++++++++++++++ 354 355.. c:function:: int xo_set_options (xo_handle_t *xop, const char *input) 356 357 :param xop: Handle for modify (or NULL for default handle) 358 :type xop: xo_handle_t \* 359 :param input: string containing options to set 360 :type input: const char * 361 :returns: zero for success, non-zero for error 362 :rtype: int 363 364 The `xo_set_options` function accepts a comma-separated list of 365 output styles and modifier flags and enables them for a specific 366 handle. The options are identical to those listed in 367 :ref:`options`. To use the default handle, pass a `NULL` handle. 368 369.. index:: xo_destroy 370 371xo_destroy 372++++++++++ 373 374.. c:function:: void xo_destroy(xo_handle_t *xop) 375 376 :param xop: Handle for modify (or NULL for default handle) 377 :type xop: xo_handle_t \* 378 :returns: void 379 380 The `xo_destroy` function releases a handle and any resources it is 381 using. Calling `xo_destroy` with a `NULL` handle will release any 382 resources associated with the default handle. 383 384.. index:: xo_emit 385 386Emitting Content (xo_emit) 387-------------------------- 388 389The functions in this section are used to emit output. They use a 390`format` string containing field descriptors as specified in 391:ref:`format-strings`. The use of a handle is optional and `NULL` can 392be passed to access the internal "default" handle. See 393:ref:`handles`. 394 395The remaining arguments to `xo_emit` and `xo_emit_h` are a set of 396arguments corresponding to the fields in the format string. Care must 397be taken to ensure the argument types match the fields in the format 398string, since an inappropriate or missing argument can ruin your day. 399The `vap` argument to `xo_emit_hv` points to a variable argument list 400that can be used to retrieve arguments via `va_arg`. 401 402.. c:function:: xo_ssize_t xo_emit (const char *fmt, ...) 403 404 :param fmt: The format string, followed by zero or more arguments 405 :returns: If XOF_COLUMNS is set, the number of columns used; otherwise the number of bytes emitted 406 :rtype: xo_ssize_t 407 408.. c:function:: xo_ssize_t xo_emit_h (xo_handle_t *xop, const char *fmt, ...) 409 410 :param xop: Handle for modify (or NULL for default handle) 411 :type xop: xo_handle_t \* 412 :param fmt: The format string, followed by zero or more arguments 413 :returns: If XOF_COLUMNS is set, the number of columns used; otherwise the number of bytes emitted 414 :rtype: xo_ssize_t 415 416.. c:function:: xo_ssize_t xo_emit_hv (xo_handle_t *xop, const char *fmt, va_list vap) 417 418 :param xop: Handle for modify (or NULL for default handle) 419 :type xop: xo_handle_t \* 420 :param fmt: The format string 421 :param va_list vap: A set of variadic arguments 422 :returns: If XOF_COLUMNS is set, the number of columns used; otherwise the number of bytes emitted 423 :rtype: xo_ssize_t 424 425.. index:: xo_emit_field 426 427Single Field Emitting Functions (xo_emit_field) 428~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 429 430The functions in this section emit formatted output similar to 431`xo_emit` but where `xo_emit` uses a single string argument containing 432the description for multiple fields, `xo_emit_field` emits a single 433field using multiple ar- guments to contain the field description. 434`xo_emit_field_h` adds an ex- plicit handle to use instead of the 435default handle, while `xo_emit_field_hv` accepts a va_list for 436additional flexibility. 437 438The arguments `rolmod`, `content`, `fmt`, and `efmt` are detailed in 439:ref:`field-formatting`. Using distinct arguments allows callers to 440pass the field description in pieces, rather than having to use 441something like `snprintf` to build the format string required by 442`xo_emit`. The arguments are each NUL-terminated strings. The `rolmod` 443argument contains the `role` and `modifier` portions of the field 444description, the `content` argument contains the `content` portion, and 445the `fmt` and `efmt` contain the `field-format` and `encoding-format` por- 446tions, respectively. 447 448As with `xo_emit`, the `fmt` and `efmt` values are both optional, 449since the `field-format` string defaults to "%s", and the 450`encoding-format`'s default value is derived from the `field-format` 451per :ref:`field-formatting`. However, care must be taken to avoid 452using a value directly as the format, since characters like '{', '%', 453and '}' will be interpreted as formatting directives, and may cause 454xo_emit_field to dereference arbitrary values off the stack, leading 455to bugs, core files, and gnashing of teeth. 456 457.. c:function:: xo_ssize_t xo_emit_field (const char *rolmod, const char *content, const char *fmt, const char *efmt, ...) 458 459 :param rolmod: A comma-separated list of field roles and field modifiers 460 :type rolmod: const char * 461 :param content: The "content" portion of the field description string 462 :type content: const char * 463 :param fmt: Contents format string 464 :type fmt: const char * 465 :param efmt: Encoding format string, followed by additional arguments 466 :type efmt: const char * 467 :returns: If XOF_COLUMNS is set, the number of columns used; otherwise the number of bytes emitted 468 :rtype: xo_ssize_t 469 470 :: 471 472 EXAMPLE:: 473 xo_emit_field("T", title, NULL, NULL, NULL); 474 xo_emit_field("T", "Host name is ", NULL, NULL); 475 xo_emit_field("V", "host-name", NULL, NULL, host-name); 476 xo_emit_field(",leaf-list,quotes", "sku", "%s-%u", "%s-000-%u", 477 "gum", 1412); 478 479.. c:function:: xo_ssize_t xo_emit_field_h (xo_handle_t *xop, const char *rolmod, const char *contents, const char *fmt, const char *efmt, ...) 480 481 :param xop: Handle for modify (or NULL for default handle) 482 :type xop: xo_handle_t \* 483 :param rolmod: A comma-separated list of field roles and field modifiers 484 :type rolmod: const char * 485 :param contents: The "contents" portion of the field description string 486 :type contents: const char * 487 :param fmt: Content format string 488 :type fmt: const char * 489 :param efmt: Encoding format string, followed by additional arguments 490 :type efmt: const char * 491 :returns: If XOF_COLUMNS is set, the number of columns used; otherwise the number of bytes emitted 492 :rtype: xo_ssize_t 493 494.. c:function:: xo_ssize_t xo_emit_field_hv (xo_handle_t *xop, const char *rolmod, const char *contents, const char *fmt, const char *efmt, va_list vap) 495 496 :param xop: Handle for modify (or NULL for default handle) 497 :type xop: xo_handle_t \* 498 :param rolmod: A comma-separated list of field roles and field modifiers 499 :type rolmod: const char * 500 :param contents: The "contents" portion of the field description string 501 :type contents: const char * 502 :param fmt: Content format string 503 :type fmt: const char * 504 :param efmt: Encoding format string 505 :type efmt: const char * 506 :param va_list vap: A set of variadic arguments 507 :returns: If XOF_COLUMNS is set, the number of columns used; otherwise the number of bytes emitted 508 :rtype: xo_ssize_t 509 510.. index:: xo_attr 511.. _xo_attr: 512 513Attributes (xo_attr) 514~~~~~~~~~~~~~~~~~~~~ 515 516The functions in this section emit an XML attribute with the given name 517and value. This only affects the XML output style. 518 519The `name` parameter give the name of the attribute to be encoded. The 520`fmt` parameter gives a printf-style format string used to format the 521value of the attribute using any remaining arguments, or the vap 522parameter passed to `xo_attr_hv`. 523 524All attributes recorded via `xo_attr` are placed on the next 525container, instance, leaf, or leaf list that is emitted. 526 527Since attributes are only emitted in XML, their use should be limited 528to meta-data and additional or redundant representations of data 529already emitted in other form. 530 531.. c:function:: xo_ssize_t xo_attr (const char *name, const char *fmt, ...) 532 533 :param name: Attribute name 534 :type name: const char * 535 :param fmt: Attribute value, as variadic arguments 536 :type fmt: const char * 537 :returns: -1 for error, or the number of bytes in the formatted attribute value 538 :rtype: xo_ssize_t 539 540 :: 541 542 EXAMPLE: 543 xo_attr("seconds", "%ld", (unsigned long) login_time); 544 struct tm *tmp = localtime(login_time); 545 strftime(buf, sizeof(buf), "%R", tmp); 546 xo_emit("Logged in at {:login-time}\n", buf); 547 XML: 548 <login-time seconds="1408336270">00:14</login-time> 549 550 551.. c:function:: xo_ssize_t xo_attr_h (xo_handle_t *xop, const char *name, const char *fmt, ...) 552 553 :param xop: Handle for modify (or NULL for default handle) 554 :type xop: xo_handle_t \* 555 556 The `xo_attr_h` function follows the conventions of `xo_attr` but 557 adds an explicit libxo handle. 558 559.. c:function:: xo_ssize_t xo_attr_hv (xo_handle_t *xop, const char *name, const char *fmt, va_list vap) 560 561 The `xo_attr_h` function follows the conventions of `xo_attr_h` 562 but replaced the variadic list with a variadic pointer. 563 564.. index:: xo_flush 565 566Flushing Output (xo_flush) 567~~~~~~~~~~~~~~~~~~~~~~~~~~ 568 569.. c:function:: xo_ssize_t xo_flush (void) 570 571 :returns: -1 for error, or the number of bytes generated 572 :rtype: xo_ssize_t 573 574 libxo buffers data, both for performance and consistency, but also 575 to allow for the proper function of various advanced features. At 576 various times, the caller may wish to flush any data buffered within 577 the library. The `xo_flush` call is used for this. 578 579 Calling `xo_flush` also triggers the flush function associated with 580 the handle. For the default handle, this is equivalent to 581 "fflush(stdio);". 582 583.. c:function:: xo_ssize_t xo_flush_h (xo_handle_t *xop) 584 585 :param xop: Handle for flush (or NULL for default handle) 586 :type xop: xo_handle_t \* 587 :returns: -1 for error, or the number of bytes generated 588 :rtype: xo_ssize_t 589 590 The `xo_flush_h` function follows the conventions of `xo_flush`, 591 but adds an explicit libxo handle. 592 593.. index:: xo_finish 594.. index:: xo_finish_atexit 595.. index:: atexit 596 597Finishing Output (xo_finish) 598~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 599 600When the program is ready to exit or close a handle, a call to 601`xo_finish` or `xo_finish_h` is required. This flushes any buffered 602data, closes open libxo constructs, and completes any pending 603operations. 604 605Calling this function is vital to the proper operation of libxo, 606especially for the non-TEXT output styles. 607 608.. c:function:: xo_ssize_t xo_finish (void) 609 610 :returns: -1 on error, or the number of bytes flushed 611 :rtype: xo_ssize_t 612 613.. c:function:: xo_ssize_t xo_finish_h (xo_handle_t *xop) 614 615 :param xop: Handle for finish (or NULL for default handle) 616 :type xop: xo_handle_t \* 617 :returns: -1 on error, or the number of bytes flushed 618 :rtype: xo_ssize_t 619 620.. c:function:: void xo_finish_atexit (void) 621 622 The `xo_finish_atexit` function is suitable for use with 623 :manpage:`atexit(3)` to ensure that `xo_finish` is called 624 on the default handle when the application exits. 625 626.. index:: UTF-8 627.. index:: xo_open_container 628.. index:: xo_close_container 629 630Emitting Hierarchy 631------------------ 632 633libxo represents two types of hierarchy: containers and lists. A 634container appears once under a given parent where a list consists of 635instances that can appear multiple times. A container is used to hold 636related fields and to give the data organization and scope. 637 638.. index:: YANG 639 640.. admonition:: YANG Terminology 641 642 libxo uses terminology from YANG (:RFC:`7950`), the data modeling 643 language for NETCONF: container, list, leaf, and leaf-list. 644 645For XML and JSON, individual fields appear inside hierarchies which 646provide context and meaning to the fields. Unfortunately, these 647encoding have a basic disconnect between how lists is similar objects 648are represented. 649 650XML encodes lists as set of sequential elements:: 651 652 <user>phil</user> 653 <user>pallavi</user> 654 <user>sjg</user> 655 656JSON encodes lists using a single name and square brackets:: 657 658 "user": [ "phil", "pallavi", "sjg" ] 659 660This means libxo needs three distinct indications of hierarchy: one 661for containers of hierarchy appear only once for any specific parent, 662one for lists, and one for each item in a list. 663 664.. index:: Containers 665 666Containers 667~~~~~~~~~~ 668 669A "*container*" is an element of a hierarchy that appears only once 670under any specific parent. The container has no value, but serves to 671contain and organize other nodes. 672 673To open a container, call xo_open_container() or 674xo_open_container_h(). The former uses the default handle and the 675latter accepts a specific handle. To close a level, use the 676xo_close_container() or xo_close_container_h() functions. 677 678Each open call must have a matching close call. If the XOF_WARN flag 679is set and the name given does not match the name of the currently open 680container, a warning will be generated. 681 682.. c:function:: xo_ssize_t xo_open_container (const char *name) 683 684 :param name: Name of the container 685 :type name: const char * 686 :returns: -1 on error, or the number of bytes generated 687 :rtype: xo_ssize_t 688 689 The `name` parameter gives the name of the container, encoded in 690 UTF-8. Since ASCII is a proper subset of UTF-8, traditional C 691 strings can be used directly. 692 693.. c:function:: xo_ssize_t xo_open_container_h (xo_handle_t *xop, const char *name) 694 695 :param xop: Handle to use (or NULL for default handle) 696 :type xop: xo_handle_t * 697 698 The `xo_open_container_h` function adds a `handle` parameter. 699 700.. c:function:: xo_ssize_t xo_close_container (const char *name) 701 702 :param name: Name of the container 703 :type name: const char * 704 :returns: -1 on error, or the number of bytes generated 705 :rtype: xo_ssize_t 706 707.. c:function:: xo_ssize_t xo_close_container_h (xo_handle_t *xop, const char *name) 708 709 :param xop: Handle to use (or NULL for default handle) 710 :type xop: xo_handle_t * 711 712 The `xo_close_container_h` function adds a `handle` parameter. 713 714Use the :index:`XOF_WARN` flag to generate a warning if the name given 715on the close does not match the current open container. 716 717For TEXT and HTML output, containers are not rendered into output 718text, though for HTML they are used to record an XPath value when the 719:index:`XOF_XPATH` flag is set. 720 721:: 722 723 EXAMPLE: 724 xo_open_container("top"); 725 xo_open_container("system"); 726 xo_emit("{:host-name/%s%s%s}", hostname, 727 domainname ? "." : "", domainname ?: ""); 728 xo_close_container("system"); 729 xo_close_container("top"); 730 TEXT: 731 my-host.example.org 732 XML: 733 <top> 734 <system> 735 <host-name>my-host.example.org</host-name> 736 </system> 737 </top> 738 JSON: 739 "top" : { 740 "system" : { 741 "host-name": "my-host.example.org" 742 } 743 } 744 HTML: 745 <div class="data" 746 data-tag="host-name">my-host.example.org</div> 747 748.. index:: xo_open_instance 749.. index:: xo_close_instance 750.. index:: xo_open_list 751.. index:: xo_close_list 752 753Lists and Instances 754~~~~~~~~~~~~~~~~~~~ 755 756A "*list*" is set of one or more instances that appear under the same 757parent. The instances contain details about a specific object. One 758can think of instances as objects or records. A call is needed to 759open and close the list, while a distinct call is needed to open and 760close each instance of the list. 761 762The name given to all calls must be identical, and it is strongly 763suggested that the name be singular, not plural, as a matter of 764style and usage expectations:: 765 766 EXAMPLE: 767 xo_open_list("item"); 768 769 for (ip = list; ip->i_title; ip++) { 770 xo_open_instance("item"); 771 xo_emit("{L:Item} '{:name/%s}':\n", ip->i_title); 772 xo_close_instance("item"); 773 } 774 775 xo_close_list("item"); 776 777Getting the list and instance calls correct is critical to the proper 778generation of XML and JSON data. 779 780Opening Lists 781+++++++++++++ 782 783.. c:function:: xo_ssize_t xo_open_list (const char *name) 784 785 :param name: Name of the list 786 :type name: const char * 787 :returns: -1 on error, or the number of bytes generated 788 :rtype: xo_ssize_t 789 790 The `xo_open_list` function open a list of instances. 791 792.. c:function:: xo_ssize_t xo_open_list_h (xo_handle_t *xop, const char *name) 793 794 :param xop: Handle to use (or NULL for default handle) 795 :type xop: xo_handle_t * 796 797Closing Lists 798+++++++++++++ 799 800.. c:function:: xo_ssize_t xo_close_list (const char *name) 801 802 :param name: Name of the list 803 :type name: const char * 804 :returns: -1 on error, or the number of bytes generated 805 :rtype: xo_ssize_t 806 807 The `xo_close_list` function closes a list of instances. 808 809.. c:function:: xo_ssize_t xo_close_list_h (xo_handle_t *xop, const char *name) 810 811 :param xop: Handle to use (or NULL for default handle) 812 :type xop: xo_handle_t * 813 814 The `xo_close_container_h` function adds a `handle` parameter. 815 816Opening Instances 817+++++++++++++++++ 818 819.. c:function:: xo_ssize_t xo_open_instance (const char *name) 820 821 :param name: Name of the instance (same as the list name) 822 :type name: const char * 823 :returns: -1 on error, or the number of bytes generated 824 :rtype: xo_ssize_t 825 826 The `xo_open_instance` function open a single instance. 827 828.. c:function:: xo_ssize_t xo_open_instance_h (xo_handle_t *xop, const char *name) 829 830 :param xop: Handle to use (or NULL for default handle) 831 :type xop: xo_handle_t * 832 833 The `xo_open_instance_h` function adds a `handle` parameter. 834 835Closing Instances 836+++++++++++++++++ 837 838.. c:function:: xo_ssize_t xo_close_instance (const char *name) 839 840 :param name: Name of the instance 841 :type name: const char * 842 :returns: -1 on error, or the number of bytes generated 843 :rtype: xo_ssize_t 844 845 The `xo_close_instance` function closes an open instance. 846 847.. c:function:: xo_ssize_t xo_close_instance_h (xo_handle_t *xop, const char *name) 848 849 :param xop: Handle to use (or NULL for default handle) 850 :type xop: xo_handle_t * 851 852 The `xo_close_instance_h` function adds a `handle` parameter. 853 854 :: 855 856 EXAMPLE: 857 xo_open_list("user"); 858 for (i = 0; i < num_users; i++) { 859 xo_open_instance("user"); 860 xo_emit("{k:name}:{:uid/%u}:{:gid/%u}:{:home}\n", 861 pw[i].pw_name, pw[i].pw_uid, 862 pw[i].pw_gid, pw[i].pw_dir); 863 xo_close_instance("user"); 864 } 865 xo_close_list("user"); 866 TEXT: 867 phil:1001:1001:/home/phil 868 pallavi:1002:1002:/home/pallavi 869 XML: 870 <user> 871 <name>phil</name> 872 <uid>1001</uid> 873 <gid>1001</gid> 874 <home>/home/phil</home> 875 </user> 876 <user> 877 <name>pallavi</name> 878 <uid>1002</uid> 879 <gid>1002</gid> 880 <home>/home/pallavi</home> 881 </user> 882 JSON: 883 user: [ 884 { 885 "name": "phil", 886 "uid": 1001, 887 "gid": 1001, 888 "home": "/home/phil", 889 }, 890 { 891 "name": "pallavi", 892 "uid": 1002, 893 "gid": 1002, 894 "home": "/home/pallavi", 895 } 896 ] 897 898Markers 899~~~~~~~ 900 901Markers are used to protect and restore the state of open hierarchy 902constructs (containers, lists, or instances). While a marker is open, 903no other open constructs can be closed. When a marker is closed, all 904constructs open since the marker was opened will be closed. 905 906Markers use names which are not user-visible, allowing the caller to 907choose appropriate internal names. 908 909In this example, the code whiffles through a list of fish, calling a 910function to emit details about each fish. The marker "fish-guts" is 911used to ensure that any constructs opened by the function are closed 912properly:: 913 914 EXAMPLE: 915 for (i = 0; fish[i]; i++) { 916 xo_open_instance("fish"); 917 xo_open_marker("fish-guts"); 918 dump_fish_details(i); 919 xo_close_marker("fish-guts"); 920 } 921 922.. c:function:: xo_ssize_t xo_open_marker(const char *name) 923 924 :param name: Name of the instance 925 :type name: const char * 926 :returns: -1 on error, or the number of bytes generated 927 :rtype: xo_ssize_t 928 929 The `xo_open_marker` function records the current state of open tags 930 in order for `xo_close_marker` to close them at some later point. 931 932.. c:function:: xo_ssize_t xo_open_marker_h(const char *name) 933 934 :param xop: Handle to use (or NULL for default handle) 935 :type xop: xo_handle_t * 936 937 The `xo_open_marker_h` function adds a `handle` parameter. 938 939.. c:function:: xo_ssize_t xo_close_marker(const char *name) 940 941 :param name: Name of the instance 942 :type name: const char * 943 :returns: -1 on error, or the number of bytes generated 944 :rtype: xo_ssize_t 945 946 The `xo_close_marker` function closes any open containers, lists, or 947 instances as needed to return to the state recorded when 948 `xo_open_marker` was called with the matching name. 949 950.. c:function:: xo_ssize_t xo_close_marker(const char *name) 951 952 :param xop: Handle to use (or NULL for default handle) 953 :type xop: xo_handle_t * 954 955 The `xo_close_marker_h` function adds a `handle` parameter. 956 957DTRT Mode 958~~~~~~~~~ 959 960Some users may find tracking the names of open containers, lists, and 961instances inconvenient. libxo offers a "Do The Right Thing" mode, where 962libxo will track the names of open containers, lists, and instances so 963the close function can be called without a name. To enable DTRT mode, 964turn on the XOF_DTRT flag prior to making any other libxo output:: 965 966 xo_set_flags(NULL, XOF_DTRT); 967 968.. index:: XOF_DTRT 969 970Each open and close function has a version with the suffix "_d", which 971will close the open container, list, or instance:: 972 973 xo_open_container_d("top"); 974 ... 975 xo_close_container_d(); 976 977This also works for lists and instances:: 978 979 xo_open_list_d("item"); 980 for (...) { 981 xo_open_instance_d("item"); 982 xo_emit(...); 983 xo_close_instance_d(); 984 } 985 xo_close_list_d(); 986 987.. index:: XOF_WARN 988 989Note that the XOF_WARN flag will also cause libxo to track open 990containers, lists, and instances. A warning is generated when the 991name given to the close function and the name recorded do not match. 992 993Support Functions 994----------------- 995 996.. index:: xo_parse_args 997.. _xo_parse_args: 998 999Parsing Command-line Arguments (xo_parse_args) 1000~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1001 1002.. c:function:: int xo_parse_args (int argc, char **argv) 1003 1004 :param int argc: Number of arguments 1005 :param argv: Array of argument strings 1006 :return: -1 on error, or the number of remaining arguments 1007 :rtype: int 1008 1009 The `xo_parse_args` function is used to process a program's 1010 arguments. libxo-specific options are processed and removed from 1011 the argument list so the calling application does not need to 1012 process them. If successful, a new value for argc is returned. On 1013 failure, a message is emitted and -1 is returned:: 1014 1015 argc = xo_parse_args(argc, argv); 1016 if (argc < 0) 1017 exit(EXIT_FAILURE); 1018 1019 Following the call to xo_parse_args, the application can process the 1020 remaining arguments in a normal manner. See :ref:`options` for a 1021 description of valid arguments. 1022 1023.. index:: xo_set_program 1024 1025xo_set_program 1026~~~~~~~~~~~~~~ 1027 1028.. c:function:: void xo_set_program (const char *name) 1029 1030 :param name: Name to use as the program name 1031 :type name: const char * 1032 :returns: void 1033 1034 The `xo_set_program` function sets the name of the program as 1035 reported by functions like `xo_failure`, `xo_warn`, `xo_err`, etc. 1036 The program name is initialized by `xo_parse_args`, but subsequent 1037 calls to `xo_set_program` can override this value:: 1038 1039 EXAMPLE: 1040 xo_set_program(argv[0]); 1041 1042 Note that the value is not copied, so the memory passed to 1043 `xo_set_program` (and `xo_parse_args`) must be maintained by the 1044 caller. 1045 1046.. index:: xo_set_version 1047 1048xo_set_version 1049~~~~~~~~~~~~~~ 1050 1051.. c:function:: void xo_set_version (const char *version) 1052 1053 :param name: Value to use as the version string 1054 :type name: const char * 1055 :returns: void 1056 1057 The `xo_set_version` function records a version number to be emitted 1058 as part of the data for encoding styles (XML and JSON). This 1059 version number is suitable for tracking changes in the content, 1060 allowing a user of the data to discern which version of the data 1061 model is in use. 1062 1063.. c:function:: void xo_set_version_h (xo_handle_t *xop, const char *version) 1064 1065 :param xop: Handle to use (or NULL for default handle) 1066 :type xop: xo_handle_t * 1067 1068 The `xo_set_version` function adds a `handle` parameter. 1069 1070.. index:: --libxo 1071.. index:: XOF_INFO 1072.. index:: xo_info_t 1073 1074.. _field-information: 1075 1076Field Information (xo_info_t) 1077~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 1079HTML data can include additional information in attributes that 1080begin with "data-". To enable this, three things must occur: 1081 1082First the application must build an array of xo_info_t structures, 1083one per tag. The array must be sorted by name, since libxo uses a 1084binary search to find the entry that matches names from format 1085instructions. 1086 1087Second, the application must inform libxo about this information using 1088the `xo_set_info` call:: 1089 1090 typedef struct xo_info_s { 1091 const char *xi_name; /* Name of the element */ 1092 const char *xi_type; /* Type of field */ 1093 const char *xi_help; /* Description of field */ 1094 } xo_info_t; 1095 1096 void xo_set_info (xo_handle_t *xop, xo_info_t *infop, int count); 1097 1098Like other libxo calls, passing `NULL` for the handle tells libxo to 1099use the default handle. 1100 1101If the count is -1, libxo will count the elements of infop, but there 1102must be an empty element at the end. More typically, the number is 1103known to the application:: 1104 1105 xo_info_t info[] = { 1106 { "in-stock", "number", "Number of items in stock" }, 1107 { "name", "string", "Name of the item" }, 1108 { "on-order", "number", "Number of items on order" }, 1109 { "sku", "string", "Stock Keeping Unit" }, 1110 { "sold", "number", "Number of items sold" }, 1111 }; 1112 int info_count = (sizeof(info) / sizeof(info[0])); 1113 ... 1114 xo_set_info(NULL, info, info_count); 1115 1116Third, the emission of info must be triggered with the `XOF_INFO` flag 1117using either the `xo_set_flags` function or the "`--libxo=info`" 1118command line argument. 1119 1120The type and help values, if present, are emitted as the "data-type" 1121and "data-help" attributes:: 1122 1123 <div class="data" data-tag="sku" data-type="string" 1124 data-help="Stock Keeping Unit">GRO-000-533</div> 1125 1126.. c:function:: void xo_set_info (xo_handle_t *xop, xo_info_t *infop, int count) 1127 1128 :param xop: Handle to use (or NULL for default handle) 1129 :type xop: xo_handle_t * 1130 :param infop: Array of information structures 1131 :type infop: xo_info_t * 1132 :returns: void 1133 1134.. index:: xo_set_allocator 1135.. index:: xo_realloc_func_t 1136.. index:: xo_free_func_t 1137 1138Memory Allocation 1139~~~~~~~~~~~~~~~~~ 1140 1141The `xo_set_allocator` function allows libxo to be used in 1142environments where the standard :manpage:`realloc(3)` and 1143:manpage:`free(3)` functions are not appropriate. 1144 1145.. c:function:: void xo_set_allocator (xo_realloc_func_t realloc_func, xo_free_func_t free_func) 1146 1147 :param xo_realloc_func_t realloc_func: Allocation function 1148 :param xo_free_func_t free_func: Free function 1149 1150 *realloc_func* should expect the same arguments as 1151 :manpage:`realloc(3)` and return a pointer to memory following the 1152 same convention. *free_func* will receive the same argument as 1153 :manpage:`free(3)` and should release it, as appropriate for the 1154 environment. 1155 1156By default, the standard :manpage:`realloc(3)` and :manpage:`free(3)` 1157functions are used. 1158 1159.. index:: --libxo 1160 1161.. _libxo-options: 1162 1163LIBXO_OPTIONS 1164~~~~~~~~~~~~~ 1165 1166The environment variable "LIBXO_OPTIONS" can be set to a subset of 1167libxo options, including: 1168 1169- color 1170- flush 1171- flush-line 1172- no-color 1173- no-humanize 1174- no-locale 1175- no-retain 1176- pretty 1177- retain 1178- underscores 1179- warn 1180 1181For example, warnings can be enabled by:: 1182 1183 % env LIBXO_OPTIONS=warn my-app 1184 1185Since environment variables are inherited, child processes will have 1186the same options, which may be undesirable, making the use of the 1187"`--libxo`" command-line option preferable in most situations. 1188 1189.. index:: xo_warn 1190.. index:: xo_err 1191.. index:: xo_errx 1192.. index:: xo_message 1193 1194Errors, Warnings, and Messages 1195~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1196 1197Many programs make use of the standard library functions 1198:manpage:`err(3)` and :manpage:`warn(3)` to generate errors and 1199warnings for the user. libxo wants to pass that information via the 1200current output style, and provides compatible functions to allow 1201this:: 1202 1203 void xo_warn (const char *fmt, ...); 1204 void xo_warnx (const char *fmt, ...); 1205 void xo_warn_c (int code, const char *fmt, ...); 1206 void xo_warn_hc (xo_handle_t *xop, int code, 1207 const char *fmt, ...); 1208 void xo_err (int eval, const char *fmt, ...); 1209 void xo_errc (int eval, int code, const char *fmt, ...); 1210 void xo_errx (int eval, const char *fmt, ...); 1211 1212:: 1213 1214 void xo_message (const char *fmt, ...); 1215 void xo_message_c (int code, const char *fmt, ...); 1216 void xo_message_hc (xo_handle_t *xop, int code, 1217 const char *fmt, ...); 1218 void xo_message_hcv (xo_handle_t *xop, int code, 1219 const char *fmt, va_list vap); 1220 1221These functions display the program name, a colon, a formatted message 1222based on the arguments, and then optionally a colon and an error 1223message associated with either *errno* or the *code* parameter:: 1224 1225 EXAMPLE: 1226 if (open(filename, O_RDONLY) < 0) 1227 xo_err(1, "cannot open file '%s'", filename); 1228 1229.. index:: xo_error 1230.. index:: xo_error_h 1231.. index:: xo_error_hv 1232.. index:: xo_errorn 1233.. index:: xo_errorn_h 1234.. index:: xo_errorn_hv 1235 1236xo_error 1237~~~~~~~~ 1238 1239.. c:function:: void xo_error (const char *fmt, ...) 1240 1241 :param fmt: Format string 1242 :type fmt: const char * 1243 :returns: void 1244 1245.. c:function:: void xo_error_h (xo_handle_t *xop, const char *fmt, ...) 1246 1247 :param xop: libxo handle pointer 1248 :type xop: xo_handle_t * 1249 :param fmt: Format string 1250 :type fmt: const char * 1251 :returns: void 1252 1253.. c:function:: void xo_error_hv (xo_handle_t *xop, const char *fmt, va_list vap) 1254 1255 :param xop: libxo handle pointer 1256 :type xop: xo_handle_t * 1257 :param fmt: Format string 1258 :type fmt: const char * 1259 :param vap: variadic arguments 1260 :type xop: va_list 1261 :returns: void 1262 1263.. c:function:: void xo_errorn (const char *fmt, ...) 1264 1265 :param fmt: Format string 1266 :type fmt: const char * 1267 :returns: void 1268 1269.. c:function:: void xo_errorn_h (xo_handle_t *xop, const char *fmt, ...) 1270 1271 :param xop: libxo handle pointer 1272 :type xop: xo_handle_t * 1273 :param fmt: Format string 1274 :type fmt: const char * 1275 :returns: void 1276 1277.. c:function:: void xo_errorn_hv (xo_handle_t *xop, int need_newline, const char *fmt, va_list vap) 1278 1279 :param xop: libxo handle pointer 1280 :type xop: xo_handle_t * 1281 :param need_newline: boolean indicating need for trailing newline 1282 :type need_newline: int 1283 :param fmt: Format string 1284 :type fmt: const char * 1285 :param vap: variadic arguments 1286 :type xop: va_list 1287 :returns: void 1288 1289 The `xo_error` function can be used for generic errors that should 1290 be reported over the handle, rather than to stderr. The `xo_error` 1291 function behaves like `xo_err` for TEXT and HTML output styles, but 1292 puts the error into XML or JSON elements:: 1293 1294 EXAMPLE:: 1295 xo_error("Does not %s", "compute"); 1296 XML:: 1297 <error><message>Does not compute</message></error> 1298 JSON:: 1299 "error": { "message": "Does not compute" } 1300 1301 The `xo_error_h` and `xo_error_hv` add a handle object and a 1302 variadic-ized parameter to the signature, respectively. 1303 1304 The `xo_errorn` function supplies a newline at the end the error 1305 message if the format string does not include one. The 1306 `xo_errorn_h` and `xo_errorn_hv` functions add a handle object and 1307 a variadic-ized parameter to the signature, respectively. The 1308 `xo_errorn_hv` function also adds a boolean to indicate the need for 1309 a trailing newline. 1310 1311.. index:: xo_no_setlocale 1312.. index:: Locale 1313 1314xo_no_setlocale 1315~~~~~~~~~~~~~~~ 1316 1317.. c:function:: void xo_no_setlocale (void) 1318 1319 libxo automatically initializes the locale based on setting of the 1320 environment variables LC_CTYPE, LANG, and LC_ALL. The first of this 1321 list of variables is used and if none of the variables, the locale 1322 defaults to "UTF-8". The caller may wish to avoid this behavior, 1323 and can do so by calling the `xo_no_setlocale` function. 1324 1325Emitting syslog Messages 1326------------------------ 1327 1328syslog is the system logging facility used throughout the unix world. 1329Messages are sent from commands, applications, and daemons to a 1330hierarchy of servers, where they are filtered, saved, and forwarded 1331based on configuration behaviors. 1332 1333syslog is an older protocol, originally documented only in source 1334code. By the time :RFC:`3164` published, variation and mutation left the 1335leading "<pri>" string as only common content. :RFC:`5424` defines a new 1336version (version 1) of syslog and introduces structured data into the 1337messages. Structured data is a set of name/value pairs transmitted 1338distinctly alongside the traditional text message, allowing filtering 1339on precise values instead of regular expressions. 1340 1341These name/value pairs are scoped by a two-part identifier; an 1342enterprise identifier names the party responsible for the message 1343catalog and a name identifying that message. `Enterprise IDs`_ are 1344defined by IANA, the Internet Assigned Numbers Authority. 1345 1346.. _Enterprise IDs: 1347 https://www.iana.org/assignments/enterprise-numbers/enterprise-numbers 1348 1349Use the `xo_set_syslog_enterprise_id` function to set the Enterprise 1350ID, as needed. 1351 1352The message name should follow the conventions in 1353:ref:`good-field-names`\ , as should the fields within the message:: 1354 1355 /* Both of these calls are optional */ 1356 xo_set_syslog_enterprise_id(32473); 1357 xo_open_log("my-program", 0, LOG_DAEMON); 1358 1359 /* Generate a syslog message */ 1360 xo_syslog(LOG_ERR, "upload-failed", 1361 "error <%d> uploading file '{:filename}' " 1362 "as '{:target/%s:%s}'", 1363 code, filename, protocol, remote); 1364 1365 xo_syslog(LOG_INFO, "poofd-invalid-state", 1366 "state {:current/%u} is invalid {:connection/%u}", 1367 state, conn); 1368 1369The developer should be aware that the message name may be used in the 1370future to allow access to further information, including 1371documentation. Care should be taken to choose quality, descriptive 1372names. 1373 1374.. _syslog-details: 1375 1376Priority, Facility, and Flags 1377~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 1379The `xo_syslog`, `xo_vsyslog`, and `xo_open_log` functions 1380accept a set of flags which provide the priority of the message, the 1381source facility, and some additional features. These values are OR'd 1382together to create a single integer argument:: 1383 1384 xo_syslog(LOG_ERR | LOG_AUTH, "login-failed", 1385 "Login failed; user '{:user}' from host '{:address}'", 1386 user, addr); 1387 1388These values are defined in <syslog.h>. 1389 1390The priority value indicates the importance and potential impact of 1391each message: 1392 1393 ============= ======================================================= 1394 Priority Description 1395 ============= ======================================================= 1396 LOG_EMERG A panic condition, normally broadcast to all users 1397 LOG_ALERT A condition that should be corrected immediately 1398 LOG_CRIT Critical conditions 1399 LOG_ERR Generic errors 1400 LOG_WARNING Warning messages 1401 LOG_NOTICE Non-error conditions that might need special handling 1402 LOG_INFO Informational messages 1403 LOG_DEBUG Developer-oriented messages 1404 ============= ======================================================= 1405 1406The facility value indicates the source of message, in fairly generic 1407terms: 1408 1409 =============== ======================================================= 1410 Facility Description 1411 =============== ======================================================= 1412 LOG_AUTH The authorization system (e.g. :manpage:`login(1)`) 1413 LOG_AUTHPRIV As LOG_AUTH, but logged to a privileged file 1414 LOG_CRON The cron daemon: :manpage:`cron(8)` 1415 LOG_DAEMON System daemons, not otherwise explicitly listed 1416 LOG_FTP The file transfer protocol daemons 1417 LOG_KERN Messages generated by the kernel 1418 LOG_LPR The line printer spooling system 1419 LOG_MAIL The mail system 1420 LOG_NEWS The network news system 1421 LOG_SECURITY Security subsystems, such as :manpage:`ipfw(4)` 1422 LOG_SYSLOG Messages generated internally by :manpage:`syslogd(8)` 1423 LOG_USER Messages generated by user processes (default) 1424 LOG_UUCP The uucp system 1425 LOG_LOCAL0..7 Reserved for local use 1426 =============== ======================================================= 1427 1428In addition to the values listed above, xo_open_log accepts a set of 1429addition flags requesting specific logging behaviors: 1430 1431 ============ ==================================================== 1432 Flag Description 1433 ============ ==================================================== 1434 LOG_CONS If syslogd fails, attempt to write to /dev/console 1435 LOG_NDELAY Open the connection to :manpage:`syslogd(8)` immediately 1436 LOG_PERROR Write the message also to standard error output 1437 LOG_PID Log the process id with each message 1438 ============ ==================================================== 1439 1440.. index:: xo_syslog 1441 1442xo_syslog 1443~~~~~~~~~ 1444 1445.. c:function:: void xo_syslog (int pri, const char *name, const char *fmt, ...) 1446 1447 :param int pri: syslog priority 1448 :param name: Name of the syslog event 1449 :type name: const char * 1450 :param fmt: Format string, followed by arguments 1451 :type fmt: const char * 1452 :returns: void 1453 1454 Use the `xo_syslog` function to generate syslog messages by calling 1455 it with a log priority and facility, a message name, a format 1456 string, and a set of arguments. The priority/facility argument are 1457 discussed above, as is the message name. 1458 1459 The format string follows the same conventions as `xo_emit`'s format 1460 string, with each field being rendered as an SD-PARAM pair:: 1461 1462 xo_syslog(LOG_ERR, "poofd-missing-file", 1463 "'{:filename}' not found: {:error/%m}", filename); 1464 1465 ... [poofd-missing-file@32473 filename="/etc/poofd.conf" 1466 error="Permission denied"] '/etc/poofd.conf' not 1467 found: Permission denied 1468 1469Support functions 1470~~~~~~~~~~~~~~~~~ 1471 1472.. index:: xo_vsyslog 1473 1474xo_vsyslog 1475++++++++++ 1476 1477.. c:function:: void xo_vsyslog (int pri, const char *name, const char *fmt, va_list vap) 1478 1479 :param int pri: syslog priority 1480 :param name: Name of the syslog event 1481 :type name: const char * 1482 :param fmt: Format string 1483 :type fmt: const char * 1484 :param va_list vap: Variadic argument list 1485 :returns: void 1486 1487 xo_vsyslog is identical in function to xo_syslog, but takes the set of 1488 arguments using a va_list:: 1489 1490 EXAMPLE: 1491 void 1492 my_log (const char *name, const char *fmt, ...) 1493 { 1494 va_list vap; 1495 va_start(vap, fmt); 1496 xo_vsyslog(LOG_ERR, name, fmt, vap); 1497 va_end(vap); 1498 } 1499 1500.. index:: xo_open_log 1501 1502xo_open_log 1503+++++++++++ 1504 1505.. c:function:: void xo_open_log (const char *ident, int logopt, int facility) 1506 1507 :param indent: 1508 :type indent: const char * 1509 :param int logopt: Bit field containing logging options 1510 :param int facility: 1511 :returns: void 1512 1513 xo_open_log functions similar to :manpage:`openlog(3)`, allowing 1514 customization of the program name, the log facility number, and the 1515 additional option flags described in :ref:`syslog-details`. 1516 1517.. index:: xo_close_log 1518 1519xo_close_log 1520++++++++++++ 1521 1522.. c:function:: void xo_close_log (void) 1523 1524 The `xo_close_log` function is similar to :manpage:`closelog(3)`, 1525 closing the log file and releasing any associated resources. 1526 1527.. index:: xo_set_logmask 1528 1529xo_set_logmask 1530++++++++++++++ 1531 1532.. c:function:: int xo_set_logmask (int maskpri) 1533 1534 :param int maskpri: the log priority mask 1535 :returns: The previous log priority mask 1536 1537 The `xo_set_logmask` function is similar to :manpage:`setlogmask(3)`, 1538 restricting the set of generated log event to those whose associated 1539 bit is set in maskpri. Use `LOG_MASK(pri)` to find the appropriate bit, 1540 or `LOG_UPTO(toppri)` to create a mask for all priorities up to and 1541 including toppri:: 1542 1543 EXAMPLE: 1544 setlogmask(LOG_UPTO(LOG_WARN)); 1545 1546.. index:: xo_set_syslog_enterprise_id 1547 1548xo_set_syslog_enterprise_id 1549+++++++++++++++++++++++++++ 1550 1551.. c:function:: void xo_set_syslog_enterprise_id (unsigned short eid) 1552 1553 Use the `xo_set_syslog_enterprise_id` to supply a platform- or 1554 application-specific enterprise id. This value is used in any future 1555 syslog messages. 1556 1557 Ideally, the operating system should supply a default value via the 1558 "kern.syslog.enterprise_id" sysctl value. Lacking that, the 1559 application should provide a suitable value. 1560 1561Enterprise IDs are administered by IANA, the Internet Assigned Number 1562Authority. The complete list is EIDs on their web site:: 1563 1564 https://www.iana.org/assignments/enterprise-numbers/enterprise-numbers 1565 1566New EIDs can be requested from IANA using the following page:: 1567 1568 http://pen.iana.org/pen/PenApplication.page 1569 1570Each software development organization that defines a set of syslog 1571messages should register their own EID and use that value in their 1572software to ensure that messages can be uniquely identified by the 1573combination of EID + message name. 1574 1575Creating Custom Encoders 1576------------------------ 1577 1578The number of encoding schemes in current use is staggering, with new 1579and distinct schemes appearing daily. While libxo provide XML, JSON, 1580HMTL, and text natively, there are requirements for other encodings. 1581 1582Rather than bake support for all possible encoders into libxo, the API 1583allows them to be defined externally. libxo can then interfaces with 1584these encoding modules using a simplistic API. libxo processes all 1585functions calls, handles state transitions, performs all formatting, 1586and then passes the results as operations to a customized encoding 1587function, which implements specific encoding logic as required. This 1588means your encoder doesn't need to detect errors with unbalanced 1589open/close operations but can rely on libxo to pass correct data. 1590 1591By making a simple API, libxo internals are not exposed, insulating the 1592encoder and the library from future or internal changes. 1593 1594The three elements of the API are: 1595 1596- loading 1597- initialization 1598- operations 1599 1600The following sections provide details about these topics. 1601 1602.. index:: CBOR 1603 1604libxo source contains an encoder for Concise Binary Object 1605Representation, aka CBOR (:RFC:`7049`), which can be used as an 1606example for the API for other encoders. 1607 1608Loading Encoders 1609~~~~~~~~~~~~~~~~ 1610 1611Encoders can be registered statically or discovered dynamically. 1612Applications can choose to call the `xo_encoder_register` function 1613to explicitly register encoders, but more typically they are built as 1614shared libraries, placed in the libxo/extensions directory, and loaded 1615based on name. libxo looks for a file with the name of the encoder 1616and an extension of ".enc". This can be a file or a symlink to the 1617shared library file that supports the encoder:: 1618 1619 % ls -1 lib/libxo/extensions/*.enc 1620 lib/libxo/extensions/cbor.enc 1621 lib/libxo/extensions/test.enc 1622 1623Encoder Initialization 1624~~~~~~~~~~~~~~~~~~~~~~ 1625 1626Each encoder must export a symbol used to access the library, which 1627must have the following signature:: 1628 1629 int xo_encoder_library_init (XO_ENCODER_INIT_ARGS); 1630 1631`XO_ENCODER_INIT_ARGS` is a macro defined in "xo_encoder.h" that defines 1632an argument called "arg", a pointer of the type 1633`xo_encoder_init_args_t`. This structure contains two fields: 1634 1635- `xei_version` is the version number of the API as implemented 1636 within libxo. This version is currently as 1 using 1637 `XO_ENCODER_VERSION`. This number can be checked to ensure 1638 compatibility. The working assumption is that all versions should 1639 be backward compatible, but each side may need to accurately know 1640 the version supported by the other side. `xo_encoder_library_init` 1641 can optionally check this value, and must then set it to the version 1642 number used by the encoder, allowing libxo to detect version 1643 differences and react accordingly. For example, if version 2 adds 1644 new operations, then libxo will know that an encoding library that 1645 set `xei_version` to 1 cannot be expected to handle those new 1646 operations. 1647 1648- xei_handler must be set to a pointer to a function of type 1649 `xo_encoder_func_t`, as defined in "xo_encoder.h". This function 1650 takes a set of parameters: 1651 - xop is a pointer to the opaque `xo_handle_t` structure 1652 - op is an integer representing the current operation 1653 - name is a string whose meaning differs by operation 1654 - value is a string whose meaning differs by operation 1655 - private is an opaque structure provided by the encoder 1656 1657Additional arguments may be added in the future, so handler functions 1658should use the `XO_ENCODER_HANDLER_ARGS` macro. An appropriate 1659"extern" declaration is provided to help catch errors. 1660 1661Once the encoder initialization function has completed processing, it 1662should return zero to indicate that no error has occurred. A non-zero 1663return code will cause the handle initialization to fail. 1664 1665Operations 1666~~~~~~~~~~ 1667 1668The encoder API defines a set of operations representing the 1669processing model of libxo. Content is formatted within libxo, and 1670callbacks are made to the encoder's handler function when data is 1671ready to be processed: 1672 1673 ======================= ======================================= 1674 Operation Meaning (Base function) 1675 ======================= ======================================= 1676 XO_OP_CREATE Called when the handle is created 1677 XO_OP_OPEN_CONTAINER Container opened (xo_open_container) 1678 XO_OP_CLOSE_CONTAINER Container closed (xo_close_container) 1679 XO_OP_OPEN_LIST List opened (xo_open_list) 1680 XO_OP_CLOSE_LIST List closed (xo_close_list) 1681 XO_OP_OPEN_LEAF_LIST Leaf list opened (xo_open_leaf_list) 1682 XO_OP_CLOSE_LEAF_LIST Leaf list closed (xo_close_leaf_list) 1683 XO_OP_OPEN_INSTANCE Instance opened (xo_open_instance) 1684 XO_OP_CLOSE_INSTANCE Instance closed (xo_close_instance) 1685 XO_OP_STRING Field with Quoted UTF-8 string 1686 XO_OP_CONTENT Field with content 1687 XO_OP_FINISH Finish any pending output 1688 XO_OP_FLUSH Flush any buffered output 1689 XO_OP_DESTROY Clean up resources 1690 XO_OP_ATTRIBUTE An attribute name/value pair 1691 XO_OP_VERSION A version string 1692 ======================= ======================================= 1693 1694For all the open and close operations, the name parameter holds the 1695name of the construct. For string, content, and attribute operations, 1696the name parameter is the name of the field and the value parameter is 1697the value. "string" are differentiated from "content" to allow differing 1698treatment of true, false, null, and numbers from real strings, though 1699content values are formatted as strings before the handler is called. 1700For version operations, the value parameter contains the version. 1701 1702All strings are encoded in UTF-8. 1703