10#ifndef PCMK__XML_INTERNAL__H
11#define PCMK__XML_INTERNAL__H
27#include <libxml/relaxng.h>
72#define PCMK__XML_LOG_BASE(priority, dechunk, postemit, prefix, fmt, ap) \
74 if (!(dechunk) && (prefix) == NULL) { \
75 qb_log_from_external_source_va(__func__, __FILE__, (fmt), \
76 (priority), __LINE__, 0, (ap)); \
80 char *CXLB_buf = NULL; \
81 static int CXLB_buffer_len = 0; \
82 static char *CXLB_buffer = NULL; \
83 static uint8_t CXLB_priority = 0; \
85 CXLB_len = vasprintf(&CXLB_buf, (fmt), (ap)); \
87 if (CXLB_len <= 0 || CXLB_buf[CXLB_len - 1] == '\n' || !(dechunk)) { \
89 CXLB_buf = (char *) "LOG CORRUPTION HAZARD"; \
90 CXLB_priority = QB_MIN(CXLB_priority, LOG_ERR); \
91 } else if (CXLB_len > 0 \
92 && CXLB_buf[CXLB_len - 1] == '\n') { \
93 CXLB_buf[CXLB_len - 1] = '\0'; \
96 qb_log_from_external_source(__func__, __FILE__, "%s%s%s", \
97 CXLB_priority, __LINE__, 0, \
98 (prefix) != NULL ? (prefix) : "", \
99 CXLB_buffer, CXLB_buf); \
102 qb_log_from_external_source(__func__, __FILE__, "%s%s", \
103 (priority), __LINE__, 0, \
104 (prefix) != NULL ? (prefix) : "", \
107 if (CXLB_len < 0) { \
110 CXLB_buffer = NULL; \
111 CXLB_buffer_len = 0; \
114 } else if (CXLB_buffer == NULL) { \
115 CXLB_buffer_len = CXLB_len; \
116 CXLB_buffer = CXLB_buf; \
118 CXLB_priority = (priority); \
121 CXLB_buffer = realloc(CXLB_buffer, 1 + CXLB_buffer_len + CXLB_len); \
122 memcpy(CXLB_buffer + CXLB_buffer_len, CXLB_buf, CXLB_len); \
123 CXLB_buffer_len += CXLB_len; \
124 CXLB_buffer[CXLB_buffer_len] = '\0'; \
125 CXLB_priority = QB_MIN(CXLB_priority, (priority)); \
169 int depth, uint32_t options);
175#define PCMK__XP_MEMBER_NODE_CONFIG \
176 "//" PCMK_XE_CIB "/" PCMK_XE_CONFIGURATION "/" PCMK_XE_NODES \
178 "[not(@" PCMK_XA_TYPE ") or @" PCMK_XA_TYPE "='" PCMK_VALUE_MEMBER "']"
181#define PCMK__XP_GUEST_NODE_CONFIG \
182 "//" PCMK_XE_CIB "//" PCMK_XE_CONFIGURATION "//" PCMK_XE_PRIMITIVE \
183 "//" PCMK_XE_META_ATTRIBUTES "//" PCMK_XE_NVPAIR \
184 "[@" PCMK_XA_NAME "='" PCMK_META_REMOTE_NODE "']"
187#define PCMK__XP_REMOTE_NODE_CONFIG \
188 "//" PCMK_XE_CIB "//" PCMK_XE_CONFIGURATION "//" PCMK_XE_PRIMITIVE \
189 "[@" PCMK_XA_TYPE "='" PCMK_VALUE_REMOTE "']" \
190 "[@" PCMK_XA_PROVIDER "='pacemaker']"
193#define PCMK__XP_REMOTE_NODE_STATUS \
194 "//" PCMK_XE_CIB "//" PCMK_XE_STATUS "//" PCMK__XE_NODE_STATE \
195 "[@" PCMK_XA_REMOTE_NODE "='" PCMK_VALUE_TRUE "']"
218 const char *attr_n,
const char *attr_v);
224 bool (*match)(xmlAttrPtr,
void *),
335 const char *filespec);
345static inline const char *
346pcmk__xe_id(
const xmlNode *xml)
361pcmk__xe_is(
const xmlNode *xml,
const char *
name)
363 return (xml != NULL) && (xml->name != NULL) && (
name != NULL)
364 && (strcmp((
const char *) xml->name,
name) == 0);
375static inline xmlNode *
376pcmk__xml_first_child(
const xmlNode *
parent)
380 while (child && (child->type == XML_TEXT_NODE)) {
394static inline xmlNode *
395pcmk__xml_next(
const xmlNode *child)
397 xmlNode *next = (child? child->next : NULL);
399 while (next && (next->type == XML_TEXT_NODE)) {
413static inline xmlNode *
414pcmk__xe_next(
const xmlNode *child)
416 xmlNode *next = child? child->next : NULL;
418 while (next && (next->type != XML_ELEMENT_NODE)) {
475G_GNUC_NULL_TERMINATED;
485static inline xmlAttr *
486pcmk__xe_first_attr(const xmlNode *xe)
488 return (xe == NULL)? NULL : xe->properties;
565 int (*handler)(xmlNode *xml,
void *userdata),
571static inline const char *
572pcmk__xml_attr_value(
const xmlAttr *attr)
574 return ((attr == NULL) || (attr->children == NULL))? NULL
575 : (
const char *) attr->children->content;
582static inline const char *
583pcmk__map_element_name(
const xmlNode *xml)
590 return (
const char *) xml->name;
enum crm_ais_msg_types type
const char * crm_element_value(const xmlNode *data, const char *name)
Retrieve the value of an XML attribute.
Formatted output for pacemaker tools.
This structure contains everything that makes up a single output formatter.
@ pcmk__xml_fmt_close
Include the closing tag of an XML element.
@ pcmk__xml_fmt_diff_plus
Log a created XML subtree.
@ pcmk__xml_fmt_children
Include the children of an XML element.
@ pcmk__xml_fmt_open
Include the opening tag of an XML element, and include XML comments.
@ pcmk__xml_fmt_diff_minus
Log a removed XML subtree.
@ pcmk__xml_fmt_pretty
Include indentation and newlines.
@ pcmk__xml_fmt_filtered
Exclude certain XML attributes (for calculating digests)
@ pcmk__xml_fmt_text
Include XML text nodes.
@ pcmk__xml_fmt_diff_short
Log a minimal version of an XML diff (only showing the changes)
void pcmk__xe_remove_attr(xmlNode *element, const char *name)
xmlNode * pcmk__xml_copy(xmlNode *parent, xmlNode *src)
int pcmk__xe_update_match(xmlNode *xml, xmlNode *update, uint32_t flags)
void pcmk__set_xml_doc_flag(xmlNode *xml, enum xml_private_flags flag)
xmlNode * pcmk__xe_first_child(const xmlNode *parent, const char *node_name, const char *attr_n, const char *attr_v)
xmlNode * pcmk__xe_next_same(const xmlNode *node)
@ pcmk__xaf_none
Flag has no effect.
@ pcmk__xaf_no_overwrite
Don't overwrite existing values.
void pcmk__xe_remove_matching_attrs(xmlNode *element, bool(*match)(xmlAttrPtr, void *), void *user_data)
char * pcmk__xml_artefact_root(enum pcmk__xml_artefact_ns ns)
bool pcmk__xml_needs_escape(const char *text, enum pcmk__xml_escape_type type)
int pcmk__xe_copy_attrs(xmlNode *target, const xmlNode *src, uint32_t flags)
bool pcmk__xe_remove_attr_cb(xmlNode *xml, void *user_data)
const char * pcmk__xe_add_last_written(xmlNode *xe)
int pcmk__xe_foreach_child(xmlNode *xml, const char *child_element_name, int(*handler)(xmlNode *xml, void *userdata), void *userdata)
bool pcmk__xml_tree_foreach(xmlNode *xml, bool(*fn)(xmlNode *, void *), void *user_data)
xmlNode * pcmk__xe_create(xmlNode *parent, const char *name)
void pcmk__strip_xml_text(xmlNode *xml)
void pcmk__xe_set_propv(xmlNodePtr node, va_list pairs)
int pcmk__xml_show_changes(pcmk__output_t *out, const xmlNode *xml)
void pcmk__warn_multiple_name_matches(pcmk__output_t *out, xmlNode *search, const char *name)
GString * pcmk__element_xpath(const xmlNode *xml)
@ pcmk__xml_escape_attr_pretty
int pcmk__xml2fd(int fd, xmlNode *cur)
int pcmk__xe_delete_match(xmlNode *xml, xmlNode *search)
int pcmk__xe_replace_match(xmlNode *xml, xmlNode *replace)
void pcmk__xe_set_content(xmlNode *node, const char *format,...) G_GNUC_PRINTF(2
char * pcmk__xml_escape(const char *text, enum pcmk__xml_escape_type type)
void pcmk__xe_set_props(xmlNodePtr node,...) G_GNUC_NULL_TERMINATED
xmlNode * pcmk__diff_v1_xml_object(xmlNode *left, xmlNode *right, bool suppress)
int pcmk__xml_show(pcmk__output_t *out, const char *prefix, const xmlNode *data, int depth, uint32_t options)
@ pcmk__xml_artefact_ns_legacy_xslt
@ pcmk__xml_artefact_ns_legacy_rng
@ pcmk__xml_artefact_ns_base_rng
@ pcmk__xml_artefact_ns_base_xslt
char * pcmk__xpath_node_id(const char *xpath, const char *node)
char * pcmk__xml_artefact_path(enum pcmk__xml_artefact_ns ns, const char *filespec)
#define PCMK__XE_PROMOTABLE_LEGACY