diff --git a/include/crm/common/output_internal.h b/include/crm/common/output_internal.h index 1923c1a..4bf6b3d 100644 --- a/include/crm/common/output_internal.h +++ b/include/crm/common/output_internal.h @@ -626,9 +626,11 @@ pcmk__indented_vprintf(pcmk__output_t *out, const char *format, va_list args) G_ * * \param[in,out] out The output functions structure. * \param[in] name The name of the node to be created. + * \param[in] ... Name/value pairs to set as XML properties. */ xmlNodePtr -pcmk__output_xml_create_parent(pcmk__output_t *out, const char *name); +pcmk__output_xml_create_parent(pcmk__output_t *out, const char *name, ...) +G_GNUC_NULL_TERMINATED; /*! * \internal diff --git a/lib/common/output_html.c b/lib/common/output_html.c index 5daf831..cf51af4 100644 --- a/lib/common/output_html.c +++ b/lib/common/output_html.c @@ -102,7 +102,7 @@ html_init(pcmk__output_t *out) { g_queue_push_tail(priv->parent_q, priv->root); priv->errors = NULL; - pcmk__output_xml_create_parent(out, "body"); + pcmk__output_xml_create_parent(out, "body", NULL); return true; } @@ -294,7 +294,7 @@ html_begin_list(pcmk__output_t *out, const char *singular_noun, */ q_len = g_queue_get_length(priv->parent_q); if (q_len > 2) { - pcmk__output_xml_create_parent(out, "li"); + pcmk__output_xml_create_parent(out, "li", NULL); } if (format != NULL) { @@ -316,7 +316,7 @@ html_begin_list(pcmk__output_t *out, const char *singular_noun, free(buf); } - node = pcmk__output_xml_create_parent(out, "ul"); + node = pcmk__output_xml_create_parent(out, "ul", NULL); g_queue_push_tail(priv->parent_q, node); } diff --git a/lib/common/output_xml.c b/lib/common/output_xml.c index 133b892..6d92625 100644 --- a/lib/common/output_xml.c +++ b/lib/common/output_xml.c @@ -217,8 +217,9 @@ xml_subprocess_output(pcmk__output_t *out, int exit_status, rc_as_str = crm_itoa(exit_status); - node = pcmk__output_xml_create_parent(out, "command"); - xmlSetProp(node, (pcmkXmlStr) "code", (pcmkXmlStr) rc_as_str); + node = pcmk__output_xml_create_parent(out, "command", + "code", rc_as_str, + NULL); if (proc_stdout != NULL) { child_node = pcmk_create_xml_text_node(node, "output", proc_stdout); @@ -312,12 +313,11 @@ xml_begin_list(pcmk__output_t *out, const char *singular_noun, const char *plura } if (legacy_xml || simple_list) { - pcmk__output_xml_create_parent(out, name); + pcmk__output_xml_create_parent(out, name, NULL); } else { - xmlNodePtr list_node = NULL; - - list_node = pcmk__output_xml_create_parent(out, "list"); - xmlSetProp(list_node, (pcmkXmlStr) "name", (pcmkXmlStr) name); + pcmk__output_xml_create_parent(out, "list", + "name", name, + NULL); } g_free(name); @@ -420,8 +420,14 @@ pcmk__mk_xml_output(char **argv) { } xmlNodePtr -pcmk__output_xml_create_parent(pcmk__output_t *out, const char *name) { +pcmk__output_xml_create_parent(pcmk__output_t *out, const char *name, ...) { + va_list args; xmlNodePtr node = pcmk__output_create_xml_node(out, name, NULL); + + va_start(args, name); + pcmk__xe_set_propv(node, args); + va_end(args); + pcmk__output_xml_push_parent(out, node); return node; } diff --git a/lib/lrmd/lrmd_output.c b/lib/lrmd/lrmd_output.c index 7dc0709..c01cc5e 100644 --- a/lib/lrmd/lrmd_output.c +++ b/lib/lrmd/lrmd_output.c @@ -46,9 +46,9 @@ lrmd__alternatives_list_xml(pcmk__output_t *out, va_list args) { lrmd_list_t *list = va_arg(args, lrmd_list_t *); const char *agent_spec = va_arg(args, const char *); - xmlNodePtr node = pcmk__output_xml_create_parent(out, "providers"); - - xmlSetProp(node, (pcmkXmlStr) "for", (pcmkXmlStr) agent_spec); + pcmk__output_xml_create_parent(out, "providers", + "for", agent_spec, + NULL); return xml_list(out, list, "provider"); } @@ -68,8 +68,9 @@ lrmd__agents_list_xml(pcmk__output_t *out, va_list args) { const char *agent_spec = va_arg(args, const char *); char *provider = va_arg(args, char *); - xmlNodePtr node = pcmk__output_xml_create_parent(out, "agents"); - xmlSetProp(node, (pcmkXmlStr) "standard", (pcmkXmlStr) agent_spec); + xmlNodePtr node = pcmk__output_xml_create_parent(out, "agents", + "standard", agent_spec, + NULL); if (!pcmk__str_empty(provider)) { xmlSetProp(node, (pcmkXmlStr) "provider", (pcmkXmlStr) provider); @@ -99,9 +100,9 @@ lrmd__providers_list_xml(pcmk__output_t *out, va_list args) { lrmd_list_t *list = va_arg(args, lrmd_list_t *); const char *agent_spec = va_arg(args, const char *); - xmlNodePtr node = pcmk__output_xml_create_parent(out, "providers"); - - xmlSetProp(node, (pcmkXmlStr) "standard", (pcmkXmlStr) "ocf"); + xmlNodePtr node = pcmk__output_xml_create_parent(out, "providers", + "standard", "ocf", + NULL); if (agent_spec != NULL) { xmlSetProp(node, (pcmkXmlStr) "agent", (pcmkXmlStr) agent_spec); diff --git a/lib/pacemaker/pcmk_output.c b/lib/pacemaker/pcmk_output.c index 08753fb..74a7c59 100644 --- a/lib/pacemaker/pcmk_output.c +++ b/lib/pacemaker/pcmk_output.c @@ -158,7 +158,7 @@ static int colocations_list_xml(pcmk__output_t *out, va_list args) { if (pcmk_is_set(peer->flags, pe_rsc_allocating)) { if (dependents == FALSE) { if (!printed_header) { - pcmk__output_xml_create_parent(out, "colocations"); + pcmk__output_xml_create_parent(out, "colocations", NULL); printed_header = true; } @@ -172,7 +172,7 @@ static int colocations_list_xml(pcmk__output_t *out, va_list args) { if (dependents && recursive) { if (!printed_header) { - pcmk__output_xml_create_parent(out, "colocations"); + pcmk__output_xml_create_parent(out, "colocations", NULL); printed_header = true; } @@ -180,7 +180,7 @@ static int colocations_list_xml(pcmk__output_t *out, va_list args) { } if (!printed_header) { - pcmk__output_xml_create_parent(out, "colocations"); + pcmk__output_xml_create_parent(out, "colocations", NULL); printed_header = true; } @@ -252,7 +252,7 @@ static int locations_list_xml(pcmk__output_t *out, va_list args) { GListPtr lpc = NULL; GListPtr list = rsc->rsc_location; - pcmk__output_xml_create_parent(out, "locations"); + pcmk__output_xml_create_parent(out, "locations", NULL); for (lpc = list; lpc != NULL; lpc = lpc->next) { pe__location_t *cons = lpc->data; @@ -323,7 +323,6 @@ stacks_and_constraints_xml(pcmk__output_t *out, va_list args) { gboolean recursive = va_arg(args, gboolean); GListPtr lpc = NULL; - xmlNodePtr node = NULL; xmlNode *cib_constraints = get_object_root(XML_CIB_TAG_CONSTRAINTS, data_set->input); @@ -338,12 +337,13 @@ stacks_and_constraints_xml(pcmk__output_t *out, va_list args) { pe__clear_resource_flags(r, pe_rsc_allocating); } - pcmk__output_xml_create_parent(out, "constraints"); + pcmk__output_xml_create_parent(out, "constraints", NULL); out->message(out, "colocations-list", rsc, TRUE, recursive); - node = pcmk__output_xml_create_parent(out, "resource"); - xmlSetProp(node, (pcmkXmlStr) "id", (pcmkXmlStr) rsc->id); + pcmk__output_xml_create_parent(out, "resource", + "id", rsc->id, + NULL); out->message(out, "locations-list", rsc); pcmk__output_xml_pop_parent(out); diff --git a/lib/pengine/bundle.c b/lib/pengine/bundle.c index 8a17aad..543f5dc 100644 --- a/lib/pengine/bundle.c +++ b/lib/pengine/bundle.c @@ -1672,7 +1672,7 @@ pe__bundle_html(pcmk__output_t *out, va_list args) pcmk_is_set(rsc->flags, pe_rsc_unique) ? " (unique)" : "", pcmk_is_set(rsc->flags, pe_rsc_managed) ? "" : " (unmanaged)"); - pcmk__output_xml_create_parent(out, "li"); + pcmk__output_xml_create_parent(out, "li", NULL); if (pcmk__list_of_multiple(bundle_data->replicas)) { snprintf(buffer, LINE_MAX, " Replica[%d]", replica->offset); diff --git a/lib/pengine/pe_output.c b/lib/pengine/pe_output.c index 294f6e1..470b025 100644 --- a/lib/pengine/pe_output.c +++ b/lib/pengine/pe_output.c @@ -1214,8 +1214,9 @@ pe__node_xml(pcmk__output_t *out, va_list args) { out->end_list(out); } else { - xmlNodePtr parent = pcmk__output_xml_create_parent(out, "node"); - xmlSetProp(parent, (pcmkXmlStr) "name", (pcmkXmlStr) node->details->uname); + pcmk__output_xml_create_parent(out, "node", + "name", node->details->uname, + NULL); } return pcmk_rc_ok; @@ -1728,8 +1729,9 @@ pe__resource_history_xml(pcmk__output_t *out, va_list args) { time_t last_failure = va_arg(args, int); gboolean as_header = va_arg(args, gboolean); - xmlNodePtr node = pcmk__output_xml_create_parent(out, "resource_history"); - xmlSetProp(node, (pcmkXmlStr) "id", (pcmkXmlStr) rsc_id); + xmlNodePtr node = pcmk__output_xml_create_parent(out, "resource_history", + "id", rsc_id, + NULL); if (rsc == NULL) { xmlSetProp(node, (pcmkXmlStr) "orphan", (pcmkXmlStr) "true"); diff --git a/tools/crm_resource_print.c b/tools/crm_resource_print.c index ca8bee2..a33356f 100644 --- a/tools/crm_resource_print.c +++ b/tools/crm_resource_print.c @@ -324,9 +324,9 @@ resource_search_xml(pcmk__output_t *out, va_list args) pe_resource_t *rsc = va_arg(args, pe_resource_t *); gchar *requested_name = va_arg(args, gchar *); - xmlNode *xml_node = pcmk__output_xml_create_parent(out, "nodes"); - - xmlSetProp(xml_node, (pcmkXmlStr) "resource", (pcmkXmlStr) requested_name); + pcmk__output_xml_create_parent(out, "nodes", + "resource", requested_name, + NULL); for (GListPtr lpc = nodes; lpc != NULL; lpc = lpc->next) { pe_node_t *node = (pe_node_t *) lpc->data; @@ -435,24 +435,23 @@ resource_why_xml(pcmk__output_t *out, va_list args) const char *host_uname = (node == NULL)? NULL : node->details->uname; - xmlNode *xml_node = pcmk__output_xml_create_parent(out, "reason"); + xmlNode *xml_node = pcmk__output_xml_create_parent(out, "reason", NULL); if ((rsc == NULL) && (host_uname == NULL)) { GListPtr lpc = NULL; GListPtr hosts = NULL; - pcmk__output_xml_create_parent(out, "resources"); + pcmk__output_xml_create_parent(out, "resources", NULL); for (lpc = resources; lpc != NULL; lpc = lpc->next) { pe_resource_t *rsc = (pe_resource_t *) lpc->data; - xmlNode *rsc_node = NULL; rsc->fns->location(rsc, &hosts, TRUE); - rsc_node = pcmk__output_xml_create_parent(out, "resource"); - xmlSetProp(rsc_node, (pcmkXmlStr) "id", (pcmkXmlStr) rsc->id); - xmlSetProp(rsc_node, (pcmkXmlStr) "running", - (pcmkXmlStr) pcmk__btoa(hosts != NULL)); + pcmk__output_xml_create_parent(out, "resource", + "id", rsc->id, + "running", pcmk__btoa(hosts != NULL), + NULL); cli_resource_check(out, cib_conn, rsc); pcmk__output_xml_pop_parent(out); @@ -476,16 +475,16 @@ resource_why_xml(pcmk__output_t *out, va_list args) GListPtr unactiveResources = pcmk__subtract_lists(allResources, activeResources, (GCompareFunc) strcmp); GListPtr lpc = NULL; - pcmk__output_xml_create_parent(out, "resources"); + pcmk__output_xml_create_parent(out, "resources", NULL); for (lpc = activeResources; lpc != NULL; lpc = lpc->next) { pe_resource_t *rsc = (pe_resource_t *) lpc->data; - xmlNode *rsc_node = NULL; - rsc_node = pcmk__output_xml_create_parent(out, "resource"); - xmlSetProp(rsc_node, (pcmkXmlStr) "id", (pcmkXmlStr) rsc->id); - xmlSetProp(rsc_node, (pcmkXmlStr) "running", (pcmkXmlStr) "true"); - xmlSetProp(rsc_node, (pcmkXmlStr) "host", (pcmkXmlStr) host_uname); + pcmk__output_xml_create_parent(out, "resource", + "id", rsc->id, + "running", "true", + "host", host_uname, + NULL); cli_resource_check(out, cib_conn, rsc); pcmk__output_xml_pop_parent(out); @@ -493,12 +492,12 @@ resource_why_xml(pcmk__output_t *out, va_list args) for(lpc = unactiveResources; lpc != NULL; lpc = lpc->next) { pe_resource_t *rsc = (pe_resource_t *) lpc->data; - xmlNode *rsc_node = NULL; - rsc_node = pcmk__output_xml_create_parent(out, "resource"); - xmlSetProp(rsc_node, (pcmkXmlStr) "id", (pcmkXmlStr) rsc->id); - xmlSetProp(rsc_node, (pcmkXmlStr) "running", (pcmkXmlStr) "false"); - xmlSetProp(rsc_node, (pcmkXmlStr) "host", (pcmkXmlStr) host_uname); + pcmk__output_xml_create_parent(out, "resource", + "id", rsc->id, + "running", "false", + "host", host_uname, + NULL); cli_resource_check(out, cib_conn, rsc); pcmk__output_xml_pop_parent(out);