19#include <libxml/tree.h>
49pcmk__new_nvpair(
const char *
name,
const char *value)
69pcmk__free_nvpair(gpointer
data)
94 return g_slist_prepend(nvpairs, pcmk__new_nvpair(
name, value));
105 g_slist_free_full(nvpairs, pcmk__free_nvpair);
128 gchar **nvpair = NULL;
135 nvpair = g_strsplit(
input,
"=", 2);
140 if (pcmk__str_empty(nvpair[0]) || pcmk__str_empty(nvpair[1])) {
206 const char *
name = key;
207 const char *s_value = value;
209 xmlNode *xml_node = user_data;
211 if (isdigit(
name[0])) {
240 const char *
name = key;
241 const char *s_value = value;
243 xmlNode *xml_node = user_data;
268 char *crm_name = NULL;
270 if (key == NULL || value == NULL) {
277 for (crm_name = key; *crm_name; ++crm_name) {
278 if ((*crm_name ==
'#') || (*crm_name ==
':')) {
341 xmlNode *child = NULL;
342 xmlAttrPtr pIter = NULL;
343 xmlNode *nvpair_list = NULL;
349 if (nvpair_list == NULL) {
356 for (pIter = pcmk__xe_first_attr(nvpair_list); pIter != NULL;
357 pIter = pIter->next) {
359 const char *p_name = (
const char *)pIter->name;
360 const char *p_value = pcmk__xml_attr_value(pIter);
362 crm_trace(
"Added %s=%s", p_name, p_value);
374 if (key != NULL && value != NULL) {
392unpack_nvpair(xmlNode *nvpair,
void *userdata)
396 const char *
name = NULL;
397 const char *value = NULL;
398 const char *old_value = NULL;
401 if (ref_nvpair == NULL) {
410 if ((
name == NULL) || (value == NULL)) {
414 old_value = g_hash_table_lookup(unpack_data->
values,
name);
419 "%s) to the explicit value '#default' is "
420 "deprecated and will be removed in a future "
422 if (old_value != NULL) {
423 g_hash_table_remove(unpack_data->
values,
name);
426 }
else if ((old_value == NULL) || unpack_data->
overwrite) {
428 name, value, pcmk__s(old_value,
"unset"));
447 xmlNode *pair =
data;
450 xmlNode *rule_xml = NULL;
453 && (unpack_data->
values != NULL));
456 if ((rule_xml != NULL)
462 crm_trace(
"Adding name/value pairs from %s %s overwrite",
463 pcmk__xe_id(pair), (unpack_data->
overwrite?
"with" :
"without"));
465 pair = pair->children;
484 const char *first_id,
490 if (blocks != NULL) {
493 .first_id = first_id,
498 .next_change = next_change,
501 if (rule_input != NULL) {
502 data.rule_input = *rule_input;
527 char *env_name = NULL;
532 for (
char *c = env_name; *c !=
'\0'; ++c) {
555 if ((meta != NULL) && (attr_name != NULL)) {
557 const char *value = g_hash_table_lookup(meta, key);
584 const xmlNode *pair_a = a;
585 const xmlNode *pair_b = b;
597 const gint a_is_higher = ((unpack_data != NULL)
599 const gint b_is_higher = -a_is_higher;
605 return (b == NULL)? 0 : b_is_higher;
607 }
else if (b == NULL) {
616 if ((unpack_data != NULL) && (unpack_data->
first_id != NULL)) {
617 if (pcmk__str_eq(pcmk__xe_id(pair_a), unpack_data->
first_id,
621 }
else if (pcmk__str_eq(pcmk__xe_id(pair_b), unpack_data->
first_id,
632 "is not a valid score: %s",
641 "is not a valid score: %s",
647 if (score_a < score_b) {
650 }
else if (score_a > score_b) {
662pcmk__compare_nvpair(gconstpointer a, gconstpointer b)
669 && (pair_b != NULL) && (pair_b->
name != NULL));
671 rc = strcmp(pair_a->
name, pair_b->
name);
683 return g_slist_sort(list, pcmk__compare_nvpair);
691 for (xmlAttrPtr iter = pcmk__xe_first_attr(xml); iter != NULL;
695 (
const char *) iter->name,
696 (
const char *) pcmk__xml_attr_value(iter));
702pcmk__nvpair_add_xml_attr(gpointer
data, gpointer user_data)
705 xmlNode *
parent = user_data;
713 g_slist_foreach(list, pcmk__nvpair_add_xml_attr, xml);
719 const char *
name = key;
720 const char *s_value = value;
721 xmlNode *xml_node = user_data;
#define pcmk__assert_alloc(nmemb, size)
int pcmk_evaluate_rule(xmlNode *rule, const pcmk_rule_input_t *rule_input, crm_time_t *next_change)
Evaluate a single rule, including all its conditions.
struct crm_time_s crm_time_t
#define CRM_CHECK(expr, failure_action)
#define crm_log_xml_trace(xml, text)
#define crm_trace(fmt, args...)
#define pcmk__config_warn(fmt...)
GHashTable * xml2list(const xmlNode *parent)
Retrieve XML attributes as a hash table.
void hash2nvpair(gpointer key, gpointer value, gpointer user_data)
GSList * pcmk_prepend_nvpair(GSList *nvpairs, const char *name, const char *value)
Prepend a name/value pair to a list.
xmlNode * crm_create_nvpair_xml(xmlNode *parent, const char *id, const char *name, const char *value)
Create an XML name/value pair.
void pcmk__unpack_nvpair_block(gpointer data, gpointer user_data)
void hash2metafield(gpointer key, gpointer value, gpointer user_data)
Set XML attribute based on hash table entry, as meta-attribute name.
GSList * pcmk_sort_nvpairs(GSList *list)
void hash2field(gpointer key, gpointer value, gpointer user_data)
Set XML attribute based on hash table entry.
gint pcmk__cmp_nvpair_blocks(gconstpointer a, gconstpointer b, gpointer user_data)
char * pcmk__format_nvpair(const char *name, const char *value, const char *units)
void pcmk_nvpairs2xml_attrs(GSList *list, xmlNode *xml)
void pcmk_free_nvpairs(GSList *nvpairs)
Free a list of name/value pairs.
void pcmk_unpack_nvpair_blocks(const xmlNode *xml, const char *element_name, const char *first_id, const pcmk_rule_input_t *rule_input, GHashTable *values, crm_time_t *next_change)
Unpack nvpair blocks contained by an XML element into a hash table, evaluated for any rules.
int pcmk__scan_nvpair(const gchar *input, gchar **name, gchar **value)
void hash2smartfield(gpointer key, gpointer value, gpointer user_data)
Safely add hash table entry to XML as attribute or name-value pair.
char * crm_meta_name(const char *attr_name)
Get the environment variable equivalent of a meta-attribute name.
GSList * pcmk_xml_attrs2nvpairs(const xmlNode *xml)
const char * crm_meta_value(GHashTable *meta, const char *attr_name)
Get the value of a meta-attribute.
Deprecated Pacemaker name-value pair API.
pcmk__action_result_t result
const char * pcmk_rc_str(int rc)
Get a user-friendly description of a return code.
#define pcmk__assert(expr)
char * crm_strdup_printf(char const *format,...) G_GNUC_PRINTF(1
void pcmk__insert_dup(GHashTable *table, const char *name, const char *value)
GHashTable * pcmk__strkey_table(GDestroyNotify key_destroy_func, GDestroyNotify value_destroy_func)
char * pcmk__trim(char *str)
#define pcmk__str_copy(str)
pcmk_rule_input_t rule_input
Wrappers for and extensions to libxml2.
const char * crm_element_value(const xmlNode *data, const char *name)
Retrieve the value of an XML attribute.
const char * crm_xml_add(xmlNode *node, const char *name, const char *value)
Create an XML attribute with specified name and value.
void int pcmk__xe_get_score(const xmlNode *xml, const char *name, int *score, int default_score)
xmlNode * pcmk__xe_first_child(const xmlNode *parent, const char *node_name, const char *attr_n, const char *attr_v)
xmlNode * pcmk__xe_next(const xmlNode *node, const char *element_name)
int pcmk__xe_foreach_child(xmlNode *xml, const char *child_element_name, int(*handler)(xmlNode *xml, void *userdata), void *userdata)
xmlNode * pcmk__xe_create(xmlNode *parent, const char *name)
void pcmk__xe_set_id(xmlNode *xml, const char *format,...) G_GNUC_PRINTF(2
GList * pcmk__xe_dereference_children(const xmlNode *xml, const char *element_name)
xmlNode * pcmk__xe_resolve_idref(xmlNode *xml, xmlNode *search)
#define PCMK__XE_ATTRIBUTES