root/include/crm/common/output_internal.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


   1 /*
   2  * Copyright 2019-2022 the Pacemaker project contributors
   3  *
   4  * The version control history for this file may have further details.
   5  *
   6  * This source code is licensed under the GNU Lesser General Public License
   7  * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
   8  */
   9 
  10 #ifndef PCMK__OUTPUT_INTERNAL__H
  11 #  define PCMK__OUTPUT_INTERNAL__H
  12 
  13 #  include <stdbool.h>
  14 #  include <stdio.h>
  15 #  include <libxml/tree.h>
  16 #  include <libxml/HTMLtree.h>
  17 
  18 #  include <glib.h>
  19 #  include <crm/common/results.h>
  20 
  21 #ifdef __cplusplus
  22 extern "C" {
  23 #endif
  24 
  25 /**
  26  * \file
  27  * \brief Formatted output for pacemaker tools
  28  */
  29 
  30 
  31 #  define PCMK__API_VERSION "2.25"
  32 
  33 #if defined(PCMK__WITH_ATTRIBUTE_OUTPUT_ARGS)
  34 #  define PCMK__OUTPUT_ARGS(ARGS...) __attribute__((output_args(ARGS)))
  35 #else
  36 #  define PCMK__OUTPUT_ARGS(ARGS...)
  37 #endif
  38 
  39 typedef struct pcmk__output_s pcmk__output_t;
  40 
  41 /*!
  42  * \internal
  43  * \brief The type of a function that creates a ::pcmk__output_t.
  44  *
  45  * Instances of this type are passed to pcmk__register_format(), stored in an
  46  * internal data structure, and later accessed by pcmk__output_new().  For 
  47  * examples, see pcmk__mk_xml_output() and pcmk__mk_text_output().
  48  *
  49  * \param[in] argv The list of command line arguments.
  50  */
  51 typedef pcmk__output_t * (*pcmk__output_factory_t)(char **argv);
  52 
  53 /*!
  54  * \internal
  55  * \brief The type of a custom message formatting function.
  56  *
  57  * These functions are defined by various libraries to support formatting of
  58  * types aside from the basic types provided by a ::pcmk__output_t.
  59  *
  60  * The meaning of the return value will be different for each message.
  61  * In general, however, 0 should be returned on success and a positive value
  62  * on error.
  63  *
  64  * \param[in,out] out   Output object to use to display message
  65  * \param[in,out] args  Message-specific arguments needed
  66  *
  67  * \note These functions must not call va_start or va_end - that is done
  68  *       automatically before the custom formatting function is called.
  69  */
  70 typedef int (*pcmk__message_fn_t)(pcmk__output_t *out, va_list args);
  71 
  72 /*!
  73  * \internal
  74  * \brief Internal type for tracking custom messages.
  75  *
  76  * Each library can register functions that format custom message types.  These
  77  * are commonly used to handle some library-specific type.  Registration is
  78  * done by first defining a table of ::pcmk__message_entry_t structures and
  79  * then passing that table to pcmk__register_messages().  Separate handlers
  80  * can be defined for the same message, but for different formats (xml vs.
  81  * text).  Unknown formats will be ignored.
  82  *
  83  * Additionally, a "default" value for fmt_table can be used.  In this case,
  84  * fn will be registered for all supported formats.  It is also possible to
  85  * register a default and then override that registration with a format-specific
  86  * function if necessary.
  87  *
  88  * \note The ::pcmk__message_entry_t table is processed in one pass, in order,
  89  * from top to bottom.  This means later entries with the same message_id will
  90  * override previous ones.  Thus, any default entry must come before any
  91  * format-specific entries for the same message_id.
  92  */
  93 typedef struct pcmk__message_entry_s {
  94     /*!
  95      * \brief The message to be handled.
  96      *
  97      * This must be the same ID that is passed to the message function of
  98      * a ::pcmk__output_t.  Unknown message IDs will be ignored.
  99      */
 100     const char *message_id;
 101 
 102     /*!
 103      * \brief The format type this handler is for.
 104      *
 105      * This name must match the fmt_name of the currently active formatter in
 106      * order for the registered function to be called.  It is valid to have
 107      * multiple entries for the same message_id but with different fmt_name
 108      * values.
 109      */
 110     const char *fmt_name;
 111 
 112     /*!
 113      * \brief The function to be called for message_id given a match on
 114      *        fmt_name.  See comments on ::pcmk__message_fn_t.
 115      */
 116     pcmk__message_fn_t fn;
 117 } pcmk__message_entry_t;
 118 
 119 /*!
 120  * \internal
 121  * \brief This structure contains everything needed to add support for a
 122  *        single output formatter to a command line program.
 123  */
 124 typedef struct pcmk__supported_format_s {
 125     /*!
 126      * \brief The name of this output formatter, which should match the
 127      *        fmt_name parameter in some ::pcmk__output_t structure.
 128      */
 129     const char *name;
 130 
 131     /*!
 132      * \brief A function that creates a ::pcmk__output_t.
 133      */
 134     pcmk__output_factory_t create;
 135 
 136     /*!
 137      * \brief Format-specific command line options.  This can be NULL if
 138      *        no command line options should be supported.
 139      */
 140     GOptionEntry *options;
 141 } pcmk__supported_format_t;
 142 
 143 /* The following three blocks need to be updated each time a new base formatter
 144  * is added.
 145  */
 146 
 147 extern GOptionEntry pcmk__html_output_entries[];
 148 extern GOptionEntry pcmk__log_output_entries[];
 149 extern GOptionEntry pcmk__none_output_entries[];
 150 extern GOptionEntry pcmk__text_output_entries[];
 151 extern GOptionEntry pcmk__xml_output_entries[];
 152 
 153 pcmk__output_t *pcmk__mk_html_output(char **argv);
 154 pcmk__output_t *pcmk__mk_log_output(char **argv);
 155 pcmk__output_t *pcmk__mk_none_output(char **argv);
 156 pcmk__output_t *pcmk__mk_text_output(char **argv);
 157 pcmk__output_t *pcmk__mk_xml_output(char **argv);
 158 
 159 #define PCMK__SUPPORTED_FORMAT_HTML { "html", pcmk__mk_html_output, pcmk__html_output_entries }
 160 #define PCMK__SUPPORTED_FORMAT_LOG  { "log", pcmk__mk_log_output, pcmk__log_output_entries }
 161 #define PCMK__SUPPORTED_FORMAT_NONE { PCMK__VALUE_NONE, pcmk__mk_none_output,   \
 162                                       pcmk__none_output_entries }
 163 #define PCMK__SUPPORTED_FORMAT_TEXT { "text", pcmk__mk_text_output, pcmk__text_output_entries }
 164 #define PCMK__SUPPORTED_FORMAT_XML  { "xml", pcmk__mk_xml_output, pcmk__xml_output_entries }
 165 
 166 /*!
 167  * \brief This structure contains everything that makes up a single output
 168  *        formatter.
 169  *
 170  * Instances of this structure may be created by calling pcmk__output_new()
 171  * with the name of the desired formatter.  They should later be freed with
 172  * pcmk__output_free().
 173  */
 174 struct pcmk__output_s {
 175     /*!
 176      * \brief The name of this output formatter.
 177      */
 178     const char *fmt_name;
 179 
 180     /*!
 181      * \brief Should this formatter supress most output?
 182      *
 183      * \note This setting is not respected by all formatters.  In general,
 184      *       machine-readable output formats will not support this while
 185      *       user-oriented formats will.  Callers should use is_quiet()
 186      *       to test whether to print or not.
 187      */
 188     bool quiet;
 189 
 190     /*!
 191      * \brief A copy of the request that generated this output.
 192      *
 193      * In the case of command line usage, this would be the command line
 194      * arguments.  For other use cases, it could be different.
 195      */
 196     gchar *request;
 197 
 198     /*!
 199      * \brief Where output should be written.
 200      *
 201      * This could be a file handle, or stdout or stderr.  This is really only
 202      * useful internally.
 203      */
 204     FILE *dest;
 205 
 206     /*!
 207      * \brief Custom messages that are currently registered on this formatter.
 208      *
 209      * Keys are the string message IDs, values are ::pcmk__message_fn_t function
 210      * pointers.
 211      */
 212     GHashTable *messages;
 213 
 214     /*!
 215      * \brief Implementation-specific private data.
 216      *
 217      * Each individual formatter may have some private data useful in its
 218      * implementation.  This points to that data.  Callers should not rely on
 219      * its contents or structure.
 220      */
 221     void *priv;
 222 
 223     /*!
 224      * \internal
 225      * \brief Take whatever actions are necessary to prepare out for use.  This is
 226      *        called by pcmk__output_new().  End users should not need to call this.
 227      *
 228      * \note For formatted output implementers - This function should be written in
 229      *       such a way that it can be called repeatedly on an already initialized
 230      *       object without causing problems, or on a previously finished object
 231      *       without crashing.
 232      *
 233      * \param[in,out] out The output functions structure.
 234      *
 235      * \return true on success, false on error.
 236      */
 237     bool (*init) (pcmk__output_t *out);
 238 
 239     /*!
 240      * \internal
 241      * \brief Free the private formatter-specific data.
 242      *
 243      * This is called from pcmk__output_free() and does not typically need to be
 244      * called directly.
 245      *
 246      * \param[in,out] out The output functions structure.
 247      */
 248     void (*free_priv) (pcmk__output_t *out);
 249 
 250     /*!
 251      * \internal
 252      * \brief Take whatever actions are necessary to end formatted output.
 253      *
 254      * This could include flushing output to a file, but does not include freeing
 255      * anything.  The finish method can potentially be fairly complicated, adding
 256      * additional information to the internal data structures or doing whatever
 257      * else.  It is therefore suggested that finish only be called once.
 258      *
 259      * \note The print parameter will only affect those formatters that do all
 260      *       their output at the end.  Console-oriented formatters typically print
 261      *       a line at a time as they go, so this parameter will not affect them.
 262      *       Structured formatters will honor it, however.
 263      *
 264      * \note The copy_dest parameter does not apply to all formatters.  Console-
 265      *       oriented formatters do not build up a structure as they go, and thus
 266      *       do not have anything to return.  Structured formatters will honor it,
 267      *       however.  Note that each type of formatter will return a different
 268      *       type of value in this parameter.  To use this parameter, call this
 269      *       function like so:
 270      *
 271      * \code
 272      * xmlNode *dest = NULL;
 273      * out->finish(out, exit_code, false, (void **) &dest);
 274      * \endcode
 275      *
 276      * \param[in,out] out         The output functions structure.
 277      * \param[in]     exit_status The exit value of the whole program.
 278      * \param[in]     print       Whether this function should write any output.
 279      * \param[out]    copy_dest   A destination to store a copy of the internal
 280      *                            data structure for this output, or NULL if no
 281      *                            copy is required.  The caller should free this
 282      *                            memory when done with it.
 283      */
 284     void (*finish) (pcmk__output_t *out, crm_exit_t exit_status, bool print,
 285                     void **copy_dest);
 286 
 287     /*!
 288      * \internal
 289      * \brief Finalize output and then immediately set back up to start a new set
 290      *        of output.
 291      *
 292      * This is conceptually the same as calling finish and then init, though in
 293      * practice more be happening behind the scenes.
 294      *
 295      * \note This function differs from finish in that no exit_status is added.
 296      *       The idea is that the program is not shutting down, so there is not
 297      *       yet a final exit code.  Call finish on the last time through if this
 298      *       is needed.
 299      *
 300      * \param[in,out] out The output functions structure.
 301      */
 302     void (*reset) (pcmk__output_t *out);
 303 
 304     /*!
 305      * \internal
 306      * \brief Register a custom message.
 307      *
 308      * \param[in,out] out        The output functions structure.
 309      * \param[in]     message_id The name of the message to register.  This name
 310      *                           will be used as the message_id parameter to the
 311      *                           message function in order to call the custom
 312      *                           format function.
 313      * \param[in]     fn         The custom format function to call for message_id.
 314      */
 315     void (*register_message) (pcmk__output_t *out, const char *message_id,
 316                               pcmk__message_fn_t fn);
 317 
 318     /*!
 319      * \internal
 320      * \brief Call a previously registered custom message.
 321      *
 322      * \param[in,out] out        The output functions structure.
 323      * \param[in]     message_id The name of the message to call.  This name must
 324      *                           be the same as the message_id parameter of some
 325      *                           previous call to register_message.
 326      * \param[in] ...            Arguments to be passed to the registered function.
 327      *
 328      * \return A standard Pacemaker return code.  Generally: 0 if a function was
 329      *         registered for the message, that function was called, and returned
 330      *         successfully; EINVAL if no function was registered; or pcmk_rc_no_output
 331      *         if a function was called but produced no output.
 332      */
 333     int (*message) (pcmk__output_t *out, const char *message_id, ...);
 334 
 335     /*!
 336      * \internal
 337      * \brief Format the output of a completed subprocess.
 338      *
 339      * \param[in,out] out         The output functions structure.
 340      * \param[in]     exit_status The exit value of the subprocess.
 341      * \param[in]     proc_stdout stdout from the completed subprocess.
 342      * \param[in]     proc_stderr stderr from the completed subprocess.
 343      */
 344     void (*subprocess_output) (pcmk__output_t *out, int exit_status,
 345                                const char *proc_stdout, const char *proc_stderr);
 346 
 347     /*!
 348      * \internal
 349      * \brief Format version information.  This is useful for the --version
 350      *        argument of command line tools.
 351      *
 352      * \param[in,out] out      The output functions structure.
 353      * \param[in]     extended Add additional version information.
 354      */
 355     void (*version) (pcmk__output_t *out, bool extended);
 356 
 357     /*!
 358      * \internal
 359      * \brief Format an informational message that should be shown to
 360      *        to an interactive user.  Not all formatters will do this.
 361      *
 362      * \note A newline will automatically be added to the end of the format
 363      *       string, so callers should not include a newline.
 364      *
 365      * \note It is possible for a formatter that supports this method to
 366      *       still not print anything out if is_quiet returns true.
 367      *
 368      * \param[in,out] out The output functions structure.
 369      * \param[in]     buf The message to be printed.
 370      * \param[in]     ... Arguments to be formatted.
 371      *
 372      * \return A standard Pacemaker return code.  Generally: pcmk_rc_ok
 373      *         if output was produced and pcmk_rc_no_output if it was not.
 374      *         As not all formatters implement this function, those that
 375      *         do not will always just return pcmk_rc_no_output.
 376      */
 377     int (*info) (pcmk__output_t *out, const char *format, ...) G_GNUC_PRINTF(2, 3);
 378 
 379     /*!
 380      * \internal
 381      * \brief Format an error message that should be shown to an interactive
 382      *        user.  Not all formatters will do this.
 383      *
 384      * \note A newline will automatically be added to the end of the format
 385      *       string, so callers should not include a newline.
 386      *
 387      * \note Formatters that support this method should always generate output,
 388      *       even if is_quiet returns true.
 389      *
 390      * \param[in,out] out The output functions structure.
 391      * \param[in]     buf The message to be printed.
 392      * \param[in]     ... Arguments to be formatted.
 393      */
 394     void (*err) (pcmk__output_t *out, const char *format, ...) G_GNUC_PRINTF(2, 3);
 395 
 396     /*!
 397      * \internal
 398      * \brief Format already formatted XML.
 399      *
 400      * \param[in,out] out  The output functions structure.
 401      * \param[in]     name A name to associate with the XML.
 402      * \param[in]     buf  The XML in a string.
 403      */
 404     void (*output_xml) (pcmk__output_t *out, const char *name, const char *buf);
 405 
 406     /*!
 407      * \internal
 408      * \brief Start a new list of items.
 409      *
 410      * \note For text output, this corresponds to another level of indentation.  For
 411      *       XML output, this corresponds to wrapping any following output in another
 412      *       layer of tags.
 413      *
 414      * \note If singular_noun and plural_noun are non-NULL, calling end_list will
 415      *       result in a summary being added.
 416      *
 417      * \param[in,out] out           The output functions structure.
 418      * \param[in]     singular_noun When outputting the summary for a list with
 419      *                              one item, the noun to use.
 420      * \param[in]     plural_noun   When outputting the summary for a list with
 421      *                              more than one item, the noun to use.
 422      * \param[in]     format        The format string.
 423      * \param[in]     ...           Arguments to be formatted.
 424      */
 425     void (*begin_list) (pcmk__output_t *out, const char *singular_noun,
 426                         const char *plural_noun, const char *format, ...)
 427                         G_GNUC_PRINTF(4, 5);
 428 
 429     /*!
 430      * \internal
 431      * \brief Format a single item in a list.
 432      *
 433      * \param[in,out] out     The output functions structure.
 434      * \param[in]     name    A name to associate with this item.
 435      * \param[in]     format  The format string.
 436      * \param[in]     ...     Arguments to be formatted.
 437      */
 438     void (*list_item) (pcmk__output_t *out, const char *name, const char *format, ...)
 439                       G_GNUC_PRINTF(3, 4);
 440 
 441     /*!
 442      * \internal
 443      * \brief Increment the internal counter of the current list's length.
 444      *
 445      * Typically, this counter is maintained behind the scenes as a side effect
 446      * of calling list_item().  However, custom functions that maintain lists
 447      * some other way will need to manage this counter manually.  This is
 448      * useful for implementing custom message functions and should not be
 449      * needed otherwise.
 450      *
 451      * \param[in,out] out The output functions structure.
 452      */
 453     void (*increment_list) (pcmk__output_t *out);
 454 
 455     /*!
 456      * \internal
 457      * \brief Conclude a list.
 458      *
 459      * \note If begin_list was called with non-NULL for both the singular_noun
 460      *       and plural_noun arguments, this function will output a summary.
 461      *       Otherwise, no summary will be added.
 462      *
 463      * \param[in,out] out The output functions structure.
 464      */
 465     void (*end_list) (pcmk__output_t *out);
 466 
 467     /*!
 468      * \internal
 469      * \brief Should anything be printed to the user?
 470      *
 471      * \note This takes into account both the \p quiet value as well as the
 472      *       current formatter.
 473      *
 474      * \param[in,out] out The output functions structure.
 475      *
 476      * \return true if output should be supressed, false otherwise.
 477      */
 478     bool (*is_quiet) (pcmk__output_t *out);
 479 
 480     /*!
 481      * \internal
 482      * \brief Output a spacer.  Not all formatters will do this.
 483      *
 484      * \param[in,out] out The output functions structure.
 485      */
 486     void (*spacer) (pcmk__output_t *out);
 487 
 488     /*!
 489      * \internal
 490      * \brief Output a progress indicator.  This is likely only useful for
 491      *        plain text, console based formatters.
 492      *
 493      * \param[in,out] out  The output functions structure
 494      * \param[in]     end  If true, output a newline afterwards (this should
 495      *                     only be used the last time this function is called)
 496      *
 497      */
 498     void (*progress) (pcmk__output_t *out, bool end);
 499 
 500     /*!
 501      * \internal
 502      * \brief Prompt the user for input.  Not all formatters will do this.
 503      *
 504      * \note This function is part of pcmk__output_t, but unlike all other
 505      *       function it does not take that as an argument.  In general, a
 506      *       prompt will go directly to the screen and therefore bypass any
 507      *       need to use the formatted output code to decide where and how
 508      *       to display.
 509      *
 510      * \param[in]  prompt The prompt to display.  This is required.
 511      * \param[in]  echo   If true, echo the user's input to the screen.  Set
 512      *                    to false for password entry.
 513      * \param[out] dest   Where to store the user's response.  This is
 514      *                    required.
 515      */
 516     void (*prompt) (const char *prompt, bool echo, char **dest);
 517 };
 518 
 519 /*!
 520  * \internal
 521  * \brief Call a formatting function for a previously registered message.
 522  *
 523  * \note This function is for implementing custom formatters.  It should not
 524  *       be called directly.  Instead, call out->message.
 525  *
 526  * \param[in,out] out        The output functions structure.
 527  * \param[in]     message_id The message to be handled.  Unknown messages
 528  *                           will be ignored.
 529  * \param[in]     ...        Arguments to be passed to the registered function.
 530  */
 531 int
 532 pcmk__call_message(pcmk__output_t *out, const char *message_id, ...);
 533 
 534 /*!
 535  * \internal
 536  * \brief Free a ::pcmk__output_t structure that was previously created by
 537  *        pcmk__output_new().
 538  *
 539  * \note While the create and finish functions are designed in such a way that
 540  *       they can be called repeatedly, this function will completely free the
 541  *       memory of the object.  Once this function has been called, producing
 542  *       more output requires starting over from pcmk__output_new().
 543  *
 544  * \param[in,out] out         The output structure.
 545  */
 546 void pcmk__output_free(pcmk__output_t *out);
 547 
 548 /*!
 549  * \internal
 550  * \brief Create a new ::pcmk__output_t structure.
 551  *
 552  * \param[in,out] out      The destination of the new ::pcmk__output_t.
 553  * \param[in]     fmt_name How should output be formatted?
 554  * \param[in]     filename Where should formatted output be written to?  This
 555  *                         can be a filename (which will be overwritten if it
 556  *                         already exists), or NULL or "-" for stdout.  For no
 557  *                         output, pass a filename of "/dev/null".
 558  * \param[in]     argv     The list of command line arguments.
 559  *
 560  * \return Standard Pacemaker return code
 561  */
 562 int pcmk__output_new(pcmk__output_t **out, const char *fmt_name,
 563                      const char *filename, char **argv);
 564 
 565 /*!
 566  * \internal
 567  * \brief Register a new output formatter, making it available for use
 568  *        the same as a base formatter.
 569  *
 570  * \param[in,out] group   A ::GOptionGroup that formatted output related command
 571  *                        line arguments should be added to.  This can be NULL
 572  *                        for use outside of command line programs.
 573  * \param[in]     name    The name of the format.  This will be used to select a
 574  *                        format from command line options and for displaying help.
 575  * \param[in]     create  A function that creates a ::pcmk__output_t.
 576  * \param[in]     options Format-specific command line options.  These will be
 577  *                        added to the context.  This argument can also be NULL.
 578  *
 579  * \return Standard Pacemaker return code
 580  */
 581 int
 582 pcmk__register_format(GOptionGroup *group, const char *name,
 583                       pcmk__output_factory_t create,
 584                       const GOptionEntry *options);
 585 
 586 /*!
 587  * \internal
 588  * \brief Register an entire table of output formatters at once.
 589  *
 590  * \param[in,out] group A ::GOptionGroup that formatted output related command
 591  *                      line arguments should be added to.  This can be NULL
 592  *                      for use outside of command line programs.
 593  * \param[in]     table An array of ::pcmk__supported_format_t which should
 594  *                      all be registered.  This array must be NULL-terminated.
 595  *
 596  */
 597 void
 598 pcmk__register_formats(GOptionGroup *group,
 599                        const pcmk__supported_format_t *table);
 600 
 601 /*!
 602  * \internal
 603  * \brief Unregister a previously registered table of custom formatting
 604  *        functions and destroy the internal data structures associated with them.
 605  */
 606 void
 607 pcmk__unregister_formats(void);
 608 
 609 /*!
 610  * \internal
 611  * \brief Register a function to handle a custom message.
 612  *
 613  * \note This function is for implementing custom formatters.  It should not
 614  *       be called directly.  Instead, call out->register_message.
 615  *
 616  * \param[in,out] out        The output functions structure.
 617  * \param[in]     message_id The message to be handled.
 618  * \param[in]     fn         The custom format function to call for message_id.
 619  */
 620 void
 621 pcmk__register_message(pcmk__output_t *out, const char *message_id,
 622                        pcmk__message_fn_t fn);
 623 
 624 /*!
 625  * \internal
 626  * \brief Register an entire table of custom formatting functions at once.
 627  *
 628  * This table can contain multiple formatting functions for the same message ID
 629  * if they are for different format types.
 630  *
 631  * \param[in,out] out   The output functions structure.
 632  * \param[in]     table An array of ::pcmk__message_entry_t values which should
 633  *                      all be registered.  This array must be NULL-terminated.
 634  */
 635 void
 636 pcmk__register_messages(pcmk__output_t *out,
 637                         const pcmk__message_entry_t *table);
 638 
 639 /* Functions that are useful for implementing custom message formatters */
 640 
 641 /*!
 642  * \internal
 643  * \brief A printf-like function.
 644  *
 645  * This function writes to out->dest and indents the text to the current level
 646  * of the text formatter's nesting.  This function should be used when implementing
 647  * custom message functions for the text output format.  It should not be used
 648  * for any other purpose.
 649  *
 650  * Typically, this function should be used instead of printf.
 651  *
 652  * \param[in,out] out    The output functions structure.
 653  * \param[in]     format The format string.
 654  * \param[in]     ...    Arguments to be passed to the format string.
 655  */
 656 void
 657 pcmk__indented_printf(pcmk__output_t *out, const char *format, ...) G_GNUC_PRINTF(2, 3);
 658 
 659 /*!
 660  * \internal
 661  * \brief A vprintf-like function.
 662  *
 663  * This function is like pcmk__indented_printf(), except it takes a va_list instead
 664  * of a list of arguments.  This function should be used when implementing custom
 665  * functions for the text output format.  It should not be used for any other purpose.
 666  *
 667  * Typically, this function should be used instead of vprintf.
 668  *
 669  * \param[in,out] out    The output functions structure.
 670  * \param[in]     format The format string.
 671  * \param[in]     args   A list of arguments to apply to the format string.
 672  */
 673 void
 674 pcmk__indented_vprintf(pcmk__output_t *out, const char *format, va_list args) G_GNUC_PRINTF(2, 0);
 675 
 676 
 677 /*!
 678  * \internal
 679  * \brief A printf-like function.
 680  *
 681  * This function writes to out->dest without indenting the text.  This function
 682  * should be used when implementing custom message functions for the text output
 683  * format.  It should not be used for any other purpose.
 684  *
 685  * \param[in,out] out    The output functions structure.
 686  * \param[in]     format The format string.
 687  * \param[in]     ...    Arguments to be passed to the format string.
 688  */
 689 void
 690 pcmk__formatted_printf(pcmk__output_t *out, const char *format, ...) G_GNUC_PRINTF(2, 3);
 691 
 692 /*!
 693  * \internal
 694  * \brief A vprintf-like function.
 695  *
 696  * This function is like pcmk__formatted_printf(), except it takes a va_list instead
 697  * of a list of arguments.  This function should be used when implementing custom
 698  * message functions for the text output format.  It should not be used for any
 699  * other purpose.
 700  *
 701  * \param[in,out] out    The output functions structure.
 702  * \param[in]     format The format string.
 703  * \param[in]     args   A list of arguments to apply to the format string.
 704  */
 705 void
 706 pcmk__formatted_vprintf(pcmk__output_t *out, const char *format, va_list args) G_GNUC_PRINTF(2, 0);
 707 
 708 /*!
 709  * \internal
 710  * \brief Prompt the user for input.
 711  *
 712  * \param[in]  prompt The prompt to display
 713  * \param[in]  echo   If true, echo the user's input to the screen.  Set
 714  *                    to false for password entry.
 715  * \param[out] dest   Where to store the user's response.
 716  */
 717 void
 718 pcmk__text_prompt(const char *prompt, bool echo, char **dest);
 719 
 720 /*!
 721  * \internal
 722  * \brief Set the log level used by the formatted output logger.
 723  *
 724  * \param[in,out] out       The output functions structure.
 725  * \param[in]     log_level The log level constant (LOG_INFO, LOG_ERR, etc.)
 726  *                          to use.
 727  *
 728  * \note By default, LOG_INFO is used.
 729  * \note Almost all formatted output messages will respect this setting.
 730  *       However, out->err will always log at LOG_ERR.
 731  */
 732 void
 733 pcmk__output_set_log_level(pcmk__output_t *out, int log_level);
 734 
 735 /*!
 736  * \internal
 737  * \brief Create and return a new XML node with the given name, as a child of the
 738  *        current list parent.  The new node is then added as the new list parent,
 739  *        meaning all subsequent nodes will be its children.  This is used when
 740  *        implementing custom functions.
 741  *
 742  * \param[in,out] out  The output functions structure.
 743  * \param[in]     name The name of the node to be created.
 744  * \param[in]     ...     Name/value pairs to set as XML properties.
 745  */
 746 xmlNodePtr
 747 pcmk__output_xml_create_parent(pcmk__output_t *out, const char *name, ...)
 748 G_GNUC_NULL_TERMINATED;
 749 
 750 /*!
 751  * \internal
 752  * \brief Add the given node as a child of the current list parent.  This is
 753  *        used when implementing custom message functions.
 754  *
 755  * \param[in,out] out  The output functions structure.
 756  * \param[in]     node An XML node to be added as a child.
 757  */
 758 void
 759 pcmk__output_xml_add_node(pcmk__output_t *out, xmlNodePtr node);
 760 
 761 /*!
 762  * \internal
 763  * \brief Create and return a new XML node with the given name, as a child of the
 764  *        current list parent.  This is used when implementing custom functions.
 765  *
 766  * \param[in,out] out  The output functions structure.
 767  * \param[in]     name The name of the node to be created.
 768  * \param[in]     ...     Name/value pairs to set as XML properties.
 769  */
 770 xmlNodePtr
 771 pcmk__output_create_xml_node(pcmk__output_t *out, const char *name, ...)
 772 G_GNUC_NULL_TERMINATED;
 773 
 774 /*!
 775  * \internal
 776  * \brief Like pcmk__output_create_xml_node(), but add the given text content to the
 777  *        new node.
 778  *
 779  * \param[in,out] out     The output functions structure.
 780  * \param[in]     name    The name of the node to be created.
 781  * \param[in]     content The text content of the node.
 782  */
 783 xmlNodePtr
 784 pcmk__output_create_xml_text_node(pcmk__output_t *out, const char *name, const char *content);
 785 
 786 /*!
 787  * \internal
 788  * \brief Push a parent XML node onto the stack.  This is used when implementing
 789  *        custom message functions.
 790  *
 791  * The XML output formatter maintains an internal stack to keep track of which nodes
 792  * are parents in order to build up the tree structure.  This function can be used
 793  * to temporarily push a new node onto the stack.  After calling this function, any
 794  * other formatting functions will have their nodes added as children of this new
 795  * parent.
 796  *
 797  * \param[in,out] out     The output functions structure
 798  * \param[in]     parent  XML node to add
 799  */
 800 void
 801 pcmk__output_xml_push_parent(pcmk__output_t *out, xmlNodePtr parent);
 802 
 803 /*!
 804  * \internal
 805  * \brief Pop a parent XML node onto the stack.  This is used when implementing
 806  *        custom message functions.
 807  *
 808  * This function removes a parent node from the stack.  See pcmk__xml_push_parent()
 809  * for more details.
 810  *
 811  * \note Little checking is done with this function.  Be sure you only pop parents
 812  * that were previously pushed.  In general, it is best to keep the code between
 813  * push and pop simple.
 814  *
 815  * \param[in,out] out The output functions structure.
 816  */
 817 void
 818 pcmk__output_xml_pop_parent(pcmk__output_t *out);
 819 
 820 /*!
 821  * \internal
 822  * \brief Peek a parent XML node onto the stack.  This is used when implementing
 823  *        custom message functions.
 824  *
 825  * This function peeks a parent node on stack.  See pcmk__xml_push_parent()
 826  * for more details. It has no side-effect and can be called for an empty stack.
 827  *
 828  * \note Little checking is done with this function.
 829  *
 830  * \param[in,out] out The output functions structure.
 831  *
 832  * \return NULL if stack is empty, otherwise the parent of the stack.
 833  */
 834 xmlNodePtr
 835 pcmk__output_xml_peek_parent(pcmk__output_t *out);
 836 
 837 /*!
 838  * \internal
 839  * \brief Create a new XML node consisting of the provided text inside an HTML
 840  *        element node of the given name.
 841  *
 842  * \param[in,out] out          The output functions structure.
 843  * \param[in]     element_name The name of the new HTML element.
 844  * \param[in]     id           The CSS ID selector to apply to this element.
 845  *                             If NULL, no ID is added.
 846  * \param[in]     class_name   The CSS class selector to apply to this element.
 847  *                             If NULL, no class is added.
 848  * \param[in]     text         The text content of the node.
 849  */
 850 xmlNodePtr
 851 pcmk__output_create_html_node(pcmk__output_t *out, const char *element_name, const char *id,
 852                               const char *class_name, const char *text);
 853 
 854 /*!
 855  * \internal
 856  * \brief Add an HTML tag to the <head> section.
 857  *
 858  * The arguments after name are a NULL-terminated list of keys and values,
 859  * all of which will be added as attributes to the given tag.  For instance,
 860  * the following code would generate the tag "<meta http-equiv='refresh' content='19'>":
 861  *
 862  * \code
 863  * pcmk__html_add_header("meta", "http-equiv", "refresh", "content", "19", NULL);
 864  * \endcode
 865  *
 866  * \param[in]     name   The HTML tag for the new node.
 867  * \param[in]     ...    A NULL-terminated key/value list of attributes.
 868  */
 869 void
 870 pcmk__html_add_header(const char *name, ...)
 871 G_GNUC_NULL_TERMINATED;
 872 
 873 /*!
 874  * \internal
 875  * \brief Handle end-of-program error reporting
 876  *
 877  * \param[in,out] error A GError object potentially containing some error.
 878  *                      If NULL, do nothing.
 879  * \param[in,out] out   The output functions structure.  If NULL, any errors
 880  *                      will simply be printed to stderr.
 881  */
 882 void pcmk__output_and_clear_error(GError *error, pcmk__output_t *out);
 883 
 884 int pcmk__xml_output_new(pcmk__output_t **out, xmlNodePtr *xml);
 885 void pcmk__xml_output_finish(pcmk__output_t *out, xmlNodePtr *xml);
 886 int pcmk__log_output_new(pcmk__output_t **out);
 887 
 888 #if defined(PCMK__UNIT_TESTING)
 889 /* If we are building libcrmcommon_test.a, add this accessor function so we can
 890  * inspect the internal formatters hash table.
 891  */
 892 GHashTable *pcmk__output_formatters(void);
 893 #endif
 894 
 895 #define PCMK__OUTPUT_SPACER_IF(out_obj, cond)   \
 896     if (cond) {                                 \
 897         out->spacer(out);                       \
 898     }
 899 
 900 #define PCMK__OUTPUT_LIST_HEADER(out_obj, cond, retcode, title...)  \
 901     if (retcode == pcmk_rc_no_output) {                             \
 902         PCMK__OUTPUT_SPACER_IF(out_obj, cond);                      \
 903         retcode = pcmk_rc_ok;                                       \
 904         out_obj->begin_list(out_obj, NULL, NULL, title);            \
 905     }
 906 
 907 #define PCMK__OUTPUT_LIST_FOOTER(out_obj, retcode)  \
 908     if (retcode == pcmk_rc_ok) {                    \
 909         out_obj->end_list(out_obj);                 \
 910     }
 911 
 912 #ifdef __cplusplus
 913 }
 914 #endif
 915 
 916 #endif

/* [previous][next][first][last][top][bottom][index][help] */