Page Menu
Home
ClusterLabs Projects
Search
Configure Global Search
Log In
Files
F7609964
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
16 KB
Referenced Files
None
Subscribers
None
View Options
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 <stdlib.h>
#include <crm/crm.h>
#include <crm/common/output.h>
#include <glib.h>
/* 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 <ctype.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <crm/crm.h>
#include <crm/common/output.h>
#include <crm/common/xml.h>
#include <glib.h>
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);
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Thu, Oct 16, 12:27 AM (9 h, 24 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2530865
Default Alt Text
(16 KB)
Attached To
Mode
rP Pacemaker
Attached
Detach File
Event Timeline
Log In to Comment