10 #ifndef PCMK__XML_INTERNAL__H
11 # define PCMK__XML_INTERNAL__H
67 #define PCMK__XML_LOG_BASE(priority, dechunk, postemit, prefix, fmt, ap) \
69 if (!(dechunk) && (prefix) == NULL) { \
70 qb_log_from_external_source_va(__func__, __FILE__, (fmt), \
71 (priority), __LINE__, 0, (ap)); \
75 char *CXLB_buf = NULL; \
76 static int CXLB_buffer_len = 0; \
77 static char *CXLB_buffer = NULL; \
78 static uint8_t CXLB_priority = 0; \
80 CXLB_len = vasprintf(&CXLB_buf, (fmt), (ap)); \
82 if (CXLB_len <= 0 || CXLB_buf[CXLB_len - 1] == '\n' || !(dechunk)) { \
84 CXLB_buf = (char *) "LOG CORRUPTION HAZARD"; \
85 CXLB_priority = QB_MIN(CXLB_priority, LOG_ERR); \
86 } else if (CXLB_len > 0 \
87 && CXLB_buf[CXLB_len - 1] == '\n') { \
88 CXLB_buf[CXLB_len - 1] = '\0'; \
91 qb_log_from_external_source(__func__, __FILE__, "%s%s%s", \
92 CXLB_priority, __LINE__, 0, \
93 (prefix) != NULL ? (prefix) : "", \
94 CXLB_buffer, CXLB_buf); \
97 qb_log_from_external_source(__func__, __FILE__, "%s%s", \
98 (priority), __LINE__, 0, \
99 (prefix) != NULL ? (prefix) : "", \
102 if (CXLB_len < 0) { \
105 CXLB_buffer = NULL; \
106 CXLB_buffer_len = 0; \
109 } else if (CXLB_buffer == NULL) { \
110 CXLB_buffer_len = CXLB_len; \
111 CXLB_buffer = CXLB_buf; \
113 CXLB_priority = (priority); \
116 CXLB_buffer = realloc(CXLB_buffer, 1 + CXLB_buffer_len + CXLB_len); \
117 memcpy(CXLB_buffer + CXLB_buffer_len, CXLB_buf, CXLB_len); \
118 CXLB_buffer_len += CXLB_len; \
119 CXLB_buffer[CXLB_buffer_len] = '\0'; \
120 CXLB_priority = QB_MIN(CXLB_priority, (priority)); \
129 #define PCMK__XP_MEMBER_NODE_CONFIG \
130 "//" XML_TAG_CIB "/" XML_CIB_TAG_CONFIGURATION "/" XML_CIB_TAG_NODES \
131 "/" XML_CIB_TAG_NODE "[not(@type) or @type='member']"
134 #define PCMK__XP_GUEST_NODE_CONFIG \
135 "//" XML_TAG_CIB "//" XML_CIB_TAG_CONFIGURATION "//" XML_CIB_TAG_RESOURCE \
136 "//" XML_TAG_META_SETS "//" XML_CIB_TAG_NVPAIR \
137 "[@name='" XML_RSC_ATTR_REMOTE_NODE "']"
140 #define PCMK__XP_REMOTE_NODE_CONFIG \
141 "//" XML_TAG_CIB "//" XML_CIB_TAG_CONFIGURATION "//" XML_CIB_TAG_RESOURCE \
142 "[@type='remote'][@provider='pacemaker']"
145 #define PCMK__XP_REMOTE_NODE_STATUS \
146 "//" XML_TAG_CIB "//" XML_CIB_TAG_STATUS "//" XML_CIB_TAG_STATE \
147 "[@" XML_NODE_IS_REMOTE "='true']"
160 const char *attr_n,
const char *attr_v);
163 bool (*match)(xmlAttrPtr,
void *),
187 const char *filespec);
197 static inline xmlNode *
198 pcmk__xml_first_child(
const xmlNode *parent)
200 xmlNode *child = (parent? parent->children : NULL);
202 while (child && (child->type == XML_TEXT_NODE)) {
216 static inline xmlNode *
217 pcmk__xml_next(
const xmlNode *child)
219 xmlNode *next = (child? child->next : NULL);
221 while (next && (next->type == XML_TEXT_NODE)) {
235 static inline xmlNode *
236 pcmk__xe_first_child(
const xmlNode *parent)
238 xmlNode *child = (parent? parent->children : NULL);
240 while (child && (child->type != XML_ELEMENT_NODE)) {
254 static inline xmlNode *
255 pcmk__xe_next(
const xmlNode *child)
257 xmlNode *next = child? child->next : NULL;
259 while (next && (next->type != XML_ELEMENT_NODE)) {
293 static inline xmlAttr *
294 pcmk__xe_first_attr(const xmlNode *xe)
296 return (xe == NULL)? NULL : xe->properties;
311 #endif // PCMK__XML_INTERNAL__H
char * pcmk__xml_artefact_root(enum pcmk__xml_artefact_ns ns)
xmlNodePtr G_GNUC_NULL_TERMINATED
const char * pcmk__xe_add_last_written(xmlNode *xe)
xmlNode * pcmk__xe_match(xmlNode *parent, const char *node_name, const char *attr_n, const char *attr_v)
void pcmk__xe_set_props(xmlNodePtr node,...)
void pcmk__xe_set_propv(xmlNodePtr node, va_list pairs)
char * pcmk__xpath_node_id(const char *xpath, const char *node)
void pcmk__strip_xml_text(xmlNode *xml)
void pcmk__xe_remove_matching_attrs(xmlNode *element, bool(*match)(xmlAttrPtr, void *), void *user_data)
char * pcmk__xml_artefact_path(enum pcmk__xml_artefact_ns ns, const char *filespec)