From 148bbcf472630d00b028c52b16f4bdb2d4e128ea Mon Sep 17 00:00:00 2001 From: Chris Lumens Date: Feb 05 2021 06:22:58 +0000 Subject: Refactor: libs: Set multiple XML properties at once. This just wraps pcmk__xe_set_propv with another function that takes arguments directly, and then uses that function throughout the libraries wherever multiple properties are set at once. --- diff --git a/include/crm/common/xml_internal.h b/include/crm/common/xml_internal.h index c60fa51..13157c6 100644 --- a/include/crm/common/xml_internal.h +++ b/include/crm/common/xml_internal.h @@ -235,7 +235,24 @@ pcmk__xe_next(const xmlNode *child) return next; } +/*! + * \internal + * \brief Like pcmk__xe_set_props, but takes a va_list instead of + * arguments directly. + */ void pcmk__xe_set_propv(xmlNodePtr node, va_list pairs); +/*! + * \internal + * \brief Add a NULL-terminated list of name/value pairs to the given + * XML node as properties. + * + * \param[in,out] node XML node to add properties to + * \param[in] ... NULL-terminated list of name/value pairs + */ +void +pcmk__xe_set_props(xmlNodePtr node, ...) +G_GNUC_NULL_TERMINATED; + #endif // PCMK__XML_INTERNAL__H diff --git a/lib/common/output_html.c b/lib/common/output_html.c index 77a5410..5daf831 100644 --- a/lib/common/output_html.c +++ b/lib/common/output_html.c @@ -20,6 +20,7 @@ #include #include #include +#include static const char *stylesheet_default = ".bold { font-weight: bold }\n" @@ -153,8 +154,9 @@ finish_reset_common(pcmk__output_t *out, crm_exit_t exit_status, bool print) { if (stylesheet_link != NULL) { htmlNodePtr link_node = create_xml_node(head_node, "link"); - xmlSetProp(link_node, (pcmkXmlStr) "rel", (pcmkXmlStr) "stylesheet"); - xmlSetProp(link_node, (pcmkXmlStr) "href", (pcmkXmlStr) stylesheet_link); + pcmk__xe_set_props(link_node, "rel", "stylesheet", + "href", stylesheet_link, + NULL); } xmlAddPrevSibling(priv->root->children, head_node); diff --git a/lib/common/output_xml.c b/lib/common/output_xml.c index 80ee2de..133b892 100644 --- a/lib/common/output_xml.c +++ b/lib/common/output_xml.c @@ -157,8 +157,9 @@ finish_reset_common(pcmk__output_t *out, crm_exit_t exit_status, bool print) { char *rc_as_str = crm_itoa(exit_status); node = create_xml_node(priv->root, "status"); - xmlSetProp(node, (pcmkXmlStr) "code", (pcmkXmlStr) rc_as_str); - xmlSetProp(node, (pcmkXmlStr) "message", (pcmkXmlStr) crm_exit_str(exit_status)); + pcmk__xe_set_props(node, "code", rc_as_str, + "message", crm_exit_str(exit_status), + NULL); if (g_slist_length(priv->errors) > 0) { xmlNodePtr errors_node = create_xml_node(node, "errors"); diff --git a/lib/common/xml.c b/lib/common/xml.c index 61cac9f..e5de0d4 100644 --- a/lib/common/xml.c +++ b/lib/common/xml.c @@ -2955,6 +2955,15 @@ pcmk__xe_set_propv(xmlNodePtr node, va_list pairs) } } +void +pcmk__xe_set_props(xmlNodePtr node, ...) +{ + va_list pairs; + va_start(pairs, node); + pcmk__xe_set_propv(node, pairs); + va_end(pairs); +} + // Deprecated functions kept only for backward API compatibility xmlNode *find_entity(xmlNode *parent, const char *node_name, const char *id); diff --git a/lib/fencing/st_output.c b/lib/fencing/st_output.c index 82520ee..65f8ec9 100644 --- a/lib/fencing/st_output.c +++ b/lib/fencing/st_output.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -339,8 +340,9 @@ stonith__event_xml(pcmk__output_t *out, va_list args) { default: { char *state = crm_itoa(event->state); - xmlSetProp(node, (pcmkXmlStr) "status", (pcmkXmlStr) "pending"); - xmlSetProp(node, (pcmkXmlStr) "extended-status", (pcmkXmlStr) state); + pcmk__xe_set_props(node, "status", "pending", + "extended-status", state, + NULL); free(state); break; } diff --git a/lib/pengine/pe_output.c b/lib/pengine/pe_output.c index a6f5970..294f6e1 100644 --- a/lib/pengine/pe_output.c +++ b/lib/pengine/pe_output.c @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -994,14 +995,12 @@ pe__failed_action_xml(pcmk__output_t *out, va_list args) { crm_time_set_timet(crm_when, &when); rc_change = crm_time_as_string(crm_when, crm_time_log_date | crm_time_log_timeofday | crm_time_log_with_timezone); - xmlSetProp(node, (pcmkXmlStr) XML_RSC_OP_LAST_CHANGE, (pcmkXmlStr) rc_change); - xmlSetProp(node, (pcmkXmlStr) "queued", - (pcmkXmlStr) crm_element_value(xml_op, XML_RSC_OP_T_QUEUE)); - xmlSetProp(node, (pcmkXmlStr) "exec", - (pcmkXmlStr) crm_element_value(xml_op, XML_RSC_OP_T_EXEC)); - xmlSetProp(node, (pcmkXmlStr) "interval", (pcmkXmlStr) s); - xmlSetProp(node, (pcmkXmlStr) "task", - (pcmkXmlStr) crm_element_value(xml_op, XML_LRM_ATTR_TASK)); + pcmk__xe_set_props(node, XML_RSC_OP_LAST_CHANGE, rc_change, + "queued", crm_element_value(xml_op, XML_RSC_OP_T_QUEUE), + "exec", crm_element_value(xml_op, XML_RSC_OP_T_EXEC), + "interval", s, + "task", crm_element_value(xml_op, XML_LRM_ATTR_TASK), + NULL); free(s); free(rc_change); @@ -1364,22 +1363,17 @@ pe__node_and_op_xml(pcmk__output_t *out, va_list args) { pcmk_is_set(pcmk_get_ra_caps(class), pcmk_ra_cap_provider) ? crm_element_value(rsc->xml, XML_AGENT_ATTR_PROVIDER) : "", kind); - xmlSetProp(node, (pcmkXmlStr) "rsc", (pcmkXmlStr) rsc_printable_id(rsc)); - xmlSetProp(node, (pcmkXmlStr) "agent", (pcmkXmlStr) agent_tuple); + pcmk__xe_set_props(node, "rsc", rsc_printable_id(rsc), + "agent", agent_tuple, + NULL); free(agent_tuple); } - xmlSetProp(node, (pcmkXmlStr) "op", (pcmkXmlStr) (op_key ? op_key : ID(xml_op))); - xmlSetProp(node, (pcmkXmlStr) "node", (pcmkXmlStr) crm_element_value(xml_op, XML_ATTR_UNAME)); - xmlSetProp(node, (pcmkXmlStr) "call", (pcmkXmlStr) crm_element_value(xml_op, XML_LRM_ATTR_CALLID)); - xmlSetProp(node, (pcmkXmlStr) "rc", (pcmkXmlStr) crm_element_value(xml_op, XML_LRM_ATTR_RC)); - if (crm_element_value_epoch(xml_op, XML_RSC_OP_LAST_CHANGE, &last_change) == pcmk_ok) { - xmlSetProp(node, (pcmkXmlStr) XML_RSC_OP_LAST_CHANGE, - (pcmkXmlStr) crm_strip_trailing_newline(ctime(&last_change))); - xmlSetProp(node, (pcmkXmlStr) XML_RSC_OP_T_EXEC, - (pcmkXmlStr) crm_element_value(xml_op, XML_RSC_OP_T_EXEC)); + pcmk__xe_set_props(node, XML_RSC_OP_LAST_CHANGE, crm_strip_trailing_newline(ctime(&last_change)), + XML_RSC_OP_T_EXEC, crm_element_value(xml_op, XML_RSC_OP_T_EXEC), + NULL); } return pcmk_rc_ok; @@ -1679,10 +1673,6 @@ pe__op_history_xml(pcmk__output_t *out, va_list args) { } } - rc_s = crm_itoa(rc); - xmlSetProp(node, (pcmkXmlStr) "rc", (pcmkXmlStr) rc_s); - xmlSetProp(node, (pcmkXmlStr) "rc_text", (pcmkXmlStr) services_ocf_exitcode_str(rc)); - free(rc_s); return pcmk_rc_ok; } @@ -1746,9 +1736,9 @@ pe__resource_history_xml(pcmk__output_t *out, va_list args) { } else if (all || failcount || last_failure > 0) { char *migration_s = crm_itoa(rsc->migration_threshold); - xmlSetProp(node, (pcmkXmlStr) "orphan", (pcmkXmlStr) "false"); - xmlSetProp(node, (pcmkXmlStr) "migration-threshold", - (pcmkXmlStr) migration_s); + pcmk__xe_set_props(node, "orphan", "false", + "migration-threshold", migration_s, + NULL); free(migration_s); if (failcount > 0) {