diff --git a/lib/common/output_text.c b/lib/common/output_text.c index 084a0ae44f..e183d0d17c 100644 --- a/lib/common/output_text.c +++ b/lib/common/output_text.c @@ -1,259 +1,259 @@ /* * Copyright 2019 the Pacemaker project contributors * * The version control history for this file may have further details. * * This source code is licensed under the GNU Lesser General Public License * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY. */ #include #include #include #include /* Disabled for the moment, but we can enable it (or remove it entirely) * when we make a decision on whether this is preferred output. */ #define FANCY_TEXT_OUTPUT 0 GOptionEntry pcmk__text_output_entries[] = { { NULL } }; typedef struct text_list_data_s { unsigned int len; char *singular_noun; char *plural_noun; } text_list_data_t; -typedef struct text_private_s { +typedef struct private_data_s { GQueue *parent_q; -} text_private_t; +} private_data_t; static void text_free_priv(pcmk__output_t *out) { - text_private_t *priv = out->priv; + private_data_t *priv = out->priv; if (priv == NULL) { return; } g_queue_free(priv->parent_q); free(priv); } static bool text_init(pcmk__output_t *out) { - text_private_t *priv = NULL; + private_data_t *priv = NULL; /* If text_init was previously called on this output struct, just return. */ if (out->priv != NULL) { return true; } else { - out->priv = calloc(1, sizeof(text_private_t)); + out->priv = calloc(1, sizeof(private_data_t)); if (out->priv == NULL) { return false; } priv = out->priv; } priv->parent_q = g_queue_new(); return true; } static void text_finish(pcmk__output_t *out, crm_exit_t exit_status) { /* This function intentionally left blank */ } static void text_reset(pcmk__output_t *out) { CRM_ASSERT(out->priv != NULL); text_free_priv(out); text_init(out); } static void text_subprocess_output(pcmk__output_t *out, int exit_status, const char *proc_stdout, const char *proc_stderr) { if (proc_stdout != NULL) { fprintf(out->dest, "%s\n", proc_stdout); } if (proc_stderr != NULL) { fprintf(out->dest, "%s\n", proc_stderr); } } static void text_version(pcmk__output_t *out, bool extended) { if (extended) { fprintf(out->dest, "Pacemaker %s (Build: %s): %s\n", PACEMAKER_VERSION, BUILD_VERSION, CRM_FEATURES); } else { fprintf(out->dest, "Pacemaker %s\n", PACEMAKER_VERSION); fprintf(out->dest, "Written by Andrew Beekhof\n"); } } G_GNUC_PRINTF(2, 3) static void text_err(pcmk__output_t *out, const char *format, ...) { va_list ap; int len = 0; va_start(ap, format); /* Informational output does not get indented, to separate it from other * potentially indented list output. */ len = vfprintf(stderr, format, ap); CRM_ASSERT(len > 0); va_end(ap); /* Add a newline. */ fprintf(stderr, "\n"); } G_GNUC_PRINTF(2, 3) static void text_info(pcmk__output_t *out, const char *format, ...) { va_list ap; int len = 0; va_start(ap, format); /* Informational output does not get indented, to separate it from other * potentially indented list output. */ len = vfprintf(out->dest, format, ap); CRM_ASSERT(len > 0); va_end(ap); /* Add a newline. */ fprintf(out->dest, "\n"); } static void text_output_xml(pcmk__output_t *out, const char *name, const char *buf) { - text_private_t *priv = out->priv; + private_data_t *priv = out->priv; CRM_ASSERT(priv != NULL); pcmk__indented_printf(out, "%s", buf); } static void text_begin_list(pcmk__output_t *out, const char *name, const char *singular_noun, const char *plural_noun) { - text_private_t *priv = out->priv; + private_data_t *priv = out->priv; text_list_data_t *new_list = NULL; CRM_ASSERT(priv != NULL); #if FANCY_TEXT_OUTPUT > 0 pcmk__indented_printf(out, "%s:\n", name); #endif new_list = calloc(1, sizeof(text_list_data_t)); new_list->len = 0; new_list->singular_noun = singular_noun == NULL ? NULL : strdup(singular_noun); new_list->plural_noun = plural_noun == NULL ? NULL : strdup(plural_noun); g_queue_push_tail(priv->parent_q, new_list); } static void text_list_item(pcmk__output_t *out, const char *id, const char *content) { - text_private_t *priv = out->priv; + private_data_t *priv = out->priv; CRM_ASSERT(priv != NULL); #if FANCY_TEXT_OUTPUT > 0 if (id != NULL) { pcmk__indented_printf(out, "* %s: %s\n", id, content); } else { pcmk__indented_printf(out, "* %s\n", content); } #else fprintf(out->dest, "%s\n", content); #endif ((text_list_data_t *) g_queue_peek_tail(priv->parent_q))->len++; } static void text_end_list(pcmk__output_t *out) { - text_private_t *priv = out->priv; + private_data_t *priv = out->priv; text_list_data_t *node = NULL; CRM_ASSERT(priv != NULL); node = g_queue_pop_tail(priv->parent_q); if (node->singular_noun != NULL && node->plural_noun != NULL) { if (node->len == 1) { pcmk__indented_printf(out, "%d %s found\n", node->len, node->singular_noun); } else { pcmk__indented_printf(out, "%d %s found\n", node->len, node->plural_noun); } } free(node); } pcmk__output_t * pcmk__mk_text_output(char **argv) { pcmk__output_t *retval = calloc(1, sizeof(pcmk__output_t)); if (retval == NULL) { return NULL; } retval->request = g_strjoinv(" ", argv); retval->supports_quiet = true; retval->init = text_init; retval->free_priv = text_free_priv; retval->finish = text_finish; retval->reset = text_reset; retval->register_message = pcmk__register_message; retval->message = pcmk__call_message; retval->subprocess_output = text_subprocess_output; retval->version = text_version; retval->info = text_info; retval->err = text_err; retval->output_xml = text_output_xml; retval->begin_list = text_begin_list; retval->list_item = text_list_item; retval->end_list = text_end_list; return retval; } G_GNUC_PRINTF(2, 3) void pcmk__indented_printf(pcmk__output_t *out, const char *format, ...) { va_list ap; int len = 0; #if FANCY_TEXT_OUTPUT > 0 int level = 0; - text_private_t *priv = out->priv; + private_data_t *priv = out->priv; CRM_ASSERT(priv != NULL); level = g_queue_get_length(priv->parent_q); for (int i = 0; i < level; i++) { putc('\t', out->dest); } #endif va_start(ap, format); len = vfprintf(out->dest, format, ap); CRM_ASSERT(len > 0); va_end(ap); } diff --git a/lib/common/output_xml.c b/lib/common/output_xml.c index da18f61398..68a8ad802b 100644 --- a/lib/common/output_xml.c +++ b/lib/common/output_xml.c @@ -1,322 +1,322 @@ /* * Copyright 2019 the Pacemaker project contributors * * The version control history for this file may have further details. * * This source code is licensed under the GNU Lesser General Public License * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE #endif #include #include #include #include #include #include #include #include GOptionEntry pcmk__xml_output_entries[] = { { NULL } }; -typedef struct xml_private_s { +typedef struct private_data_s { xmlNode *root; GQueue *parent_q; GSList *errors; -} xml_private_t; +} private_data_t; static void xml_free_priv(pcmk__output_t *out) { - xml_private_t *priv = out->priv; + private_data_t *priv = out->priv; if (priv == NULL) { return; } xmlFreeNode(priv->root); g_queue_free(priv->parent_q); g_slist_free(priv->errors); free(priv); } static bool xml_init(pcmk__output_t *out) { - xml_private_t *priv = NULL; + private_data_t *priv = NULL; /* If xml_init was previously called on this output struct, just return. */ if (out->priv != NULL) { return true; } else { - out->priv = calloc(1, sizeof(xml_private_t)); + out->priv = calloc(1, sizeof(private_data_t)); if (out->priv == NULL) { return false; } priv = out->priv; } priv->root = create_xml_node(NULL, "pacemaker-result"); xmlSetProp(priv->root, (pcmkXmlStr) "api-version", (pcmkXmlStr) PCMK__API_VERSION); if (out->request != NULL) { xmlSetProp(priv->root, (pcmkXmlStr) "request", (pcmkXmlStr) out->request); } priv->parent_q = g_queue_new(); priv->errors = NULL; g_queue_push_tail(priv->parent_q, priv->root); return true; } static void add_error_node(gpointer data, gpointer user_data) { char *str = (char *) data; xmlNodePtr node = (xmlNodePtr) user_data; xmlNewTextChild(node, NULL, (pcmkXmlStr) "error", (pcmkXmlStr) str); } static void xml_finish(pcmk__output_t *out, crm_exit_t exit_status) { xmlNodePtr node; char *rc_as_str = NULL; char *buf = NULL; - xml_private_t *priv = out->priv; + private_data_t *priv = out->priv; /* If root is NULL, xml_init failed and we are being called from pcmk__output_free * in the pcmk__output_new path. */ if (priv->root == NULL) { return; } rc_as_str = crm_itoa(exit_status); node = xmlNewChild(priv->root, NULL, (pcmkXmlStr) "status", NULL); xmlSetProp(node, (pcmkXmlStr) "code", (pcmkXmlStr) rc_as_str); xmlSetProp(node, (pcmkXmlStr) "message", (pcmkXmlStr) crm_exit_str(exit_status)); if (g_slist_length(priv->errors) > 0) { xmlNodePtr errors_node = xmlNewChild(node, NULL, (pcmkXmlStr) "errors", NULL); g_slist_foreach(priv->errors, add_error_node, (gpointer) errors_node); } buf = dump_xml_formatted_with_text(priv->root); fprintf(out->dest, "%s", buf); free(rc_as_str); free(buf); } static void xml_reset(pcmk__output_t *out) { char *buf = NULL; - xml_private_t *priv = out->priv; + private_data_t *priv = out->priv; CRM_ASSERT(priv != NULL); buf = dump_xml_formatted_with_text(priv->root); fprintf(out->dest, "%s", buf); free(buf); xml_free_priv(out); xml_init(out); } static void xml_subprocess_output(pcmk__output_t *out, int exit_status, const char *proc_stdout, const char *proc_stderr) { xmlNodePtr node, child_node; char *rc_as_str = NULL; - xml_private_t *priv = out->priv; + private_data_t *priv = out->priv; CRM_ASSERT(priv != NULL); rc_as_str = crm_itoa(exit_status); node = xmlNewNode(g_queue_peek_tail(priv->parent_q), (pcmkXmlStr) "command"); xmlSetProp(node, (pcmkXmlStr) "code", (pcmkXmlStr) rc_as_str); if (proc_stdout != NULL) { child_node = xmlNewTextChild(node, NULL, (pcmkXmlStr) "output", (pcmkXmlStr) proc_stdout); xmlSetProp(child_node, (pcmkXmlStr) "source", (pcmkXmlStr) "stdout"); } if (proc_stderr != NULL) { child_node = xmlNewTextChild(node, NULL, (pcmkXmlStr) "output", (pcmkXmlStr) proc_stderr); xmlSetProp(child_node, (pcmkXmlStr) "source", (pcmkXmlStr) "stderr"); } pcmk__xml_add_node(out, node); free(rc_as_str); } static void xml_version(pcmk__output_t *out, bool extended) { xmlNodePtr node; - xml_private_t *priv = out->priv; + private_data_t *priv = out->priv; CRM_ASSERT(priv != NULL); node = xmlNewChild(g_queue_peek_tail(priv->parent_q), NULL, (pcmkXmlStr) "version", NULL); xmlSetProp(node, (pcmkXmlStr) "program", (pcmkXmlStr) "Pacemaker"); xmlSetProp(node, (pcmkXmlStr) "version", (pcmkXmlStr) PACEMAKER_VERSION); xmlSetProp(node, (pcmkXmlStr) "author", (pcmkXmlStr) "Andrew Beekhof"); xmlSetProp(node, (pcmkXmlStr) "build", (pcmkXmlStr) BUILD_VERSION); xmlSetProp(node, (pcmkXmlStr) "features", (pcmkXmlStr) CRM_FEATURES); } G_GNUC_PRINTF(2, 3) static void xml_err(pcmk__output_t *out, const char *format, ...) { - xml_private_t *priv = out->priv; + private_data_t *priv = out->priv; int len = 0; char *buf = NULL; va_list ap; CRM_ASSERT(priv != NULL); va_start(ap, format); len = vasprintf(&buf, format, ap); CRM_ASSERT(len > 0); va_end(ap); priv->errors = g_slist_append(priv->errors, buf); } G_GNUC_PRINTF(2, 3) static void xml_info(pcmk__output_t *out, const char *format, ...) { /* This function intentially left blank */ } static void xml_output_xml(pcmk__output_t *out, const char *name, const char *buf) { xmlNodePtr parent = NULL; xmlNodePtr cdata_node = NULL; - xml_private_t *priv = out->priv; + private_data_t *priv = out->priv; CRM_ASSERT(priv != NULL); parent = xmlNewChild(g_queue_peek_tail(priv->parent_q), NULL, (pcmkXmlStr) name, NULL); cdata_node = xmlNewCDataBlock(getDocPtr(parent), (pcmkXmlStr) buf, strlen(buf)); xmlAddChild(parent, cdata_node); } static void xml_begin_list(pcmk__output_t *out, const char *name, const char *singular_noun, const char *plural_noun) { xmlNodePtr list_node = NULL; - xml_private_t *priv = out->priv; + private_data_t *priv = out->priv; CRM_ASSERT(priv != NULL); list_node = create_xml_node(g_queue_peek_tail(priv->parent_q), "list"); xmlSetProp(list_node, (pcmkXmlStr) "name", (pcmkXmlStr) name); g_queue_push_tail(priv->parent_q, list_node); } static void xml_list_item(pcmk__output_t *out, const char *name, const char *content) { - xml_private_t *priv = out->priv; + private_data_t *priv = out->priv; xmlNodePtr item_node = NULL; CRM_ASSERT(priv != NULL); item_node = xmlNewChild(g_queue_peek_tail(priv->parent_q), NULL, (pcmkXmlStr) "item", (pcmkXmlStr) content); xmlSetProp(item_node, (pcmkXmlStr) "name", (pcmkXmlStr) name); } static void xml_end_list(pcmk__output_t *out) { char *buf = NULL; - xml_private_t *priv = out->priv; + private_data_t *priv = out->priv; xmlNodePtr node; CRM_ASSERT(priv != NULL); node = g_queue_pop_tail(priv->parent_q); buf = crm_strdup_printf("%lu", xmlChildElementCount(node)); xmlSetProp(node, (pcmkXmlStr) "count", (pcmkXmlStr) buf); free(buf); } pcmk__output_t * pcmk__mk_xml_output(char **argv) { pcmk__output_t *retval = calloc(1, sizeof(pcmk__output_t)); if (retval == NULL) { return NULL; } retval->request = g_strjoinv(" ", argv); retval->supports_quiet = false; retval->init = xml_init; retval->free_priv = xml_free_priv; retval->finish = xml_finish; retval->reset = xml_reset; retval->register_message = pcmk__register_message; retval->message = pcmk__call_message; retval->subprocess_output = xml_subprocess_output; retval->version = xml_version; retval->info = xml_info; retval->err = xml_err; retval->output_xml = xml_output_xml; retval->begin_list = xml_begin_list; retval->list_item = xml_list_item; retval->end_list = xml_end_list; return retval; } void pcmk__xml_add_node(pcmk__output_t *out, xmlNodePtr node) { - xml_private_t *priv = out->priv; + private_data_t *priv = out->priv; CRM_ASSERT(priv != NULL); CRM_ASSERT(node != NULL); xmlAddChild(g_queue_peek_tail(priv->parent_q), node); } void pcmk__xml_push_parent(pcmk__output_t *out, xmlNodePtr parent) { - xml_private_t *priv = out->priv; + private_data_t *priv = out->priv; CRM_ASSERT(priv != NULL); CRM_ASSERT(parent != NULL); g_queue_push_tail(priv->parent_q, parent); } void pcmk__xml_pop_parent(pcmk__output_t *out) { - xml_private_t *priv = out->priv; + private_data_t *priv = out->priv; CRM_ASSERT(priv != NULL); CRM_ASSERT(g_queue_get_length(priv->parent_q) > 0); g_queue_pop_tail(priv->parent_q); } xmlNodePtr pcmk__xml_peek_parent(pcmk__output_t *out) { - xml_private_t *priv = out->priv; + private_data_t *priv = out->priv; CRM_ASSERT(priv != NULL); /* If queue is empty NULL will be returned */ return g_queue_peek_tail(priv->parent_q); }