pacemaker 3.0.1-16e74fc4da
Scalable High-Availability cluster resource manager
Loading...
Searching...
No Matches
xpath_internal.h
Go to the documentation of this file.
1/*
2 * Copyright 2022-2025 the Pacemaker project contributors
3 *
4 * The version control history for this file may have further details.
5 *
6 * This source code is licensed under the GNU Lesser General Public License
7 * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
8 */
9
10#ifndef PCMK__CRM_COMMON_XPATH_INTERNAL__H
11#define PCMK__CRM_COMMON_XPATH_INTERNAL__H
12
13#include <stdint.h> // uint8_t
14
15#include <glib.h> // GString
16#include <libxml/tree.h> // xmlDoc, xmlNode
17#include <libxml/xpath.h> // xmlXPathObject, etc.
18#include <qb/qbdefs.h> // QB_MAX()
19
20#include <crm/common/options.h> // PCMK_META_*, PCMK_VALUE_*
21#include <crm/common/output_internal.h> // pcmk__output_t
22#include <crm/common/xml_names.h> // PCMK_XE_*, PCMK_XA_*, etc.
23#include <crm/common/xml_names_internal.h> // PCMK__XE_*
24
25/*
26 * Internal-only wrappers for and extensions to libxml2 XPath utilities
27 */
28
30#define PCMK__XP_MEMBER_NODE_CONFIG \
31 "//" PCMK_XE_CIB "/" PCMK_XE_CONFIGURATION "/" PCMK_XE_NODES \
32 "/" PCMK_XE_NODE \
33 "[not(@" PCMK_XA_TYPE ") or @" PCMK_XA_TYPE "='" PCMK_VALUE_MEMBER "']"
34
36#define PCMK__XP_GUEST_NODE_CONFIG \
37 "//" PCMK_XE_CIB "//" PCMK_XE_CONFIGURATION "//" PCMK_XE_PRIMITIVE \
38 "//" PCMK_XE_META_ATTRIBUTES "//" PCMK_XE_NVPAIR \
39 "[@" PCMK_XA_NAME "='" PCMK_META_REMOTE_NODE "']"
40
42#define PCMK__XP_REMOTE_NODE_CONFIG \
43 "//" PCMK_XE_CIB "//" PCMK_XE_CONFIGURATION "//" PCMK_XE_PRIMITIVE \
44 "[@" PCMK_XA_TYPE "='" PCMK_VALUE_REMOTE "']" \
45 "[@" PCMK_XA_PROVIDER "='pacemaker']"
46
48#define PCMK__XP_REMOTE_NODE_STATUS \
49 "//" PCMK_XE_CIB "//" PCMK_XE_STATUS "//" PCMK__XE_NODE_STATE \
50 "[@" PCMK_XA_REMOTE_NODE "='" PCMK_VALUE_TRUE "']"
51
64static inline int
65pcmk__xpath_num_results(const xmlXPathObject *xpath_obj)
66{
67 int num_results = 0;
68
69 if (xpath_obj != NULL) {
70 num_results = xmlXPathNodeSetGetLength(xpath_obj->nodesetval);
71 }
72
73 // Negative num_results doesn't make sense
74 return QB_MAX(num_results, 0);
75}
76
77GString *pcmk__element_xpath(const xmlNode *xml);
78char *pcmk__xpath_node_id(const char *xpath, const char *node);
79
80xmlXPathObject *pcmk__xpath_search(xmlDoc *doc, const char *path);
81xmlNode *pcmk__xpath_result(xmlXPathObject *xpath_obj, int index);
82xmlNode *pcmk__xpath_match_element(xmlNode *match);
83void pcmk__xpath_foreach_result(xmlDoc *doc, const char *path,
84 void (*fn)(xmlNode *, void *), void *user_data);
85xmlNode *pcmk__xpath_find_one(xmlDoc *doc, const char *path, uint8_t level);
86
87void pcmk__warn_multiple_name_matches(pcmk__output_t *out, xmlNode *search,
88 const char *name);
89
90#endif // PCMK__CRM_COMMON_XPATH_INTERNAL__H
const char * path
Definition cib.c:28
const char * name
Definition cib.c:26
API related to options.
Formatted output for pacemaker tools.
This structure contains everything that makes up a single output formatter.
Defined string constants for XML element and attribute names.
xmlXPathObject * pcmk__xpath_search(xmlDoc *doc, const char *path)
Definition xpath.c:137
xmlNode * pcmk__xpath_result(xmlXPathObject *xpath_obj, int index)
Definition xpath.c:65
void pcmk__warn_multiple_name_matches(pcmk__output_t *out, xmlNode *search, const char *name)
Definition xpath.c:375
GString * pcmk__element_xpath(const xmlNode *xml)
Definition xpath.c:281
xmlNode * pcmk__xpath_match_element(xmlNode *match)
Definition xpath.c:102
xmlNode * pcmk__xpath_find_one(xmlDoc *doc, const char *path, uint8_t level)
Definition xpath.c:206
char * pcmk__xpath_node_id(const char *xpath, const char *node)
Definition xpath.c:324
void pcmk__xpath_foreach_result(xmlDoc *doc, const char *path, void(*fn)(xmlNode *, void *), void *user_data)
Definition xpath.c:170