Coverage Report

Created: 2024-10-12 00:30

/src/pacemaker/include/crm/common/xml_element_internal.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 2017-2024 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_XML_ELEMENT_INTERNAL__H
11
#define PCMK__CRM_COMMON_XML_ELEMENT_INTERNAL__H
12
13
/*
14
 * Internal-only wrappers for and extensions to libxml2 for processing XML
15
 * elements
16
 */
17
18
#include <stdbool.h>                        // bool
19
#include <stdint.h>                         // uint32_t
20
#include <stdio.h>                          // NULL
21
#include <string.h>                         // strcmp()
22
23
#include <libxml/tree.h>                    // xmlNode, etc.
24
25
#include <crm/common/iso8601.h>             // crm_time_t
26
#include <crm/common/xml_element.h>         // crm_element_value()
27
#include <crm/common/xml_names.h>           // PCMK_XA_ID
28
29
#ifdef __cplusplus
30
extern "C" {
31
#endif
32
33
const char *pcmk__xe_add_last_written(xmlNode *xe);
34
35
xmlNode *pcmk__xe_first_child(const xmlNode *parent, const char *node_name,
36
                              const char *attr_n, const char *attr_v);
37
38
void pcmk__xe_remove_attr(xmlNode *element, const char *name);
39
bool pcmk__xe_remove_attr_cb(xmlNode *xml, void *user_data);
40
void pcmk__xe_remove_matching_attrs(xmlNode *element,
41
                                    bool (*match)(xmlAttrPtr, void *),
42
                                    void *user_data);
43
int pcmk__xe_delete_match(xmlNode *xml, xmlNode *search);
44
int pcmk__xe_replace_match(xmlNode *xml, xmlNode *replace);
45
int pcmk__xe_update_match(xmlNode *xml, xmlNode *update, uint32_t flags);
46
47
/*!
48
 * \internal
49
 * \brief Retrieve the value of the \c PCMK_XA_ID XML attribute
50
 *
51
 * \param[in] xml  XML element to check
52
 *
53
 * \return Value of the \c PCMK_XA_ID attribute (may be \c NULL)
54
 */
55
static inline const char *
56
pcmk__xe_id(const xmlNode *xml)
57
0
{
58
0
    return crm_element_value(xml, PCMK_XA_ID);
59
0
}
Unexecuted instantiation: scores_fuzzer.c:pcmk__xe_id
Unexecuted instantiation: results.c:pcmk__xe_id
Unexecuted instantiation: scores.c:pcmk__xe_id
Unexecuted instantiation: strings.c:pcmk__xe_id
Unexecuted instantiation: utils.c:pcmk__xe_id
Unexecuted instantiation: xml.c:pcmk__xe_id
Unexecuted instantiation: xml_attr.c:pcmk__xe_id
Unexecuted instantiation: xml_comment.c:pcmk__xe_id
Unexecuted instantiation: xml_element.c:pcmk__xe_id
Unexecuted instantiation: xml_idref.c:pcmk__xe_id
Unexecuted instantiation: xpath.c:pcmk__xe_id
Unexecuted instantiation: acl.c:pcmk__xe_id
Unexecuted instantiation: iso8601.c:pcmk__xe_id
Unexecuted instantiation: logging.c:pcmk__xe_id
Unexecuted instantiation: mainloop.c:pcmk__xe_id
Unexecuted instantiation: nvpair.c:pcmk__xe_id
Unexecuted instantiation: options.c:pcmk__xe_id
Unexecuted instantiation: output.c:pcmk__xe_id
Unexecuted instantiation: output_log.c:pcmk__xe_id
Unexecuted instantiation: output_text.c:pcmk__xe_id
Unexecuted instantiation: output_xml.c:pcmk__xe_id
Unexecuted instantiation: patchset_display.c:pcmk__xe_id
Unexecuted instantiation: pid.c:pcmk__xe_id
Unexecuted instantiation: procfs.c:pcmk__xe_id
Unexecuted instantiation: schemas.c:pcmk__xe_id
Unexecuted instantiation: xml_display.c:pcmk__xe_id
Unexecuted instantiation: xml_io.c:pcmk__xe_id
Unexecuted instantiation: actions.c:pcmk__xe_id
Unexecuted instantiation: agents.c:pcmk__xe_id
Unexecuted instantiation: cmdline.c:pcmk__xe_id
Unexecuted instantiation: digest.c:pcmk__xe_id
Unexecuted instantiation: health.c:pcmk__xe_id
Unexecuted instantiation: io.c:pcmk__xe_id
Unexecuted instantiation: ipc_client.c:pcmk__xe_id
Unexecuted instantiation: ipc_common.c:pcmk__xe_id
Unexecuted instantiation: ipc_controld.c:pcmk__xe_id
Unexecuted instantiation: ipc_pacemakerd.c:pcmk__xe_id
Unexecuted instantiation: ipc_schedulerd.c:pcmk__xe_id
Unexecuted instantiation: ipc_server.c:pcmk__xe_id
Unexecuted instantiation: messages.c:pcmk__xe_id
Unexecuted instantiation: nodes.c:pcmk__xe_id
Unexecuted instantiation: options_display.c:pcmk__xe_id
Unexecuted instantiation: patchset.c:pcmk__xe_id
Unexecuted instantiation: servers.c:pcmk__xe_id
Unexecuted instantiation: cib.c:pcmk__xe_id
Unexecuted instantiation: ipc_attrd.c:pcmk__xe_id
Unexecuted instantiation: attrs.c:pcmk__xe_id
Unexecuted instantiation: strings_fuzzer.c:pcmk__xe_id
Unexecuted instantiation: cib_file_fuzzer.c:pcmk__xe_id
Unexecuted instantiation: cib_client.c:pcmk__xe_id
Unexecuted instantiation: cib_file.c:pcmk__xe_id
Unexecuted instantiation: cib_native.c:pcmk__xe_id
Unexecuted instantiation: cib_ops.c:pcmk__xe_id
Unexecuted instantiation: cib_remote.c:pcmk__xe_id
Unexecuted instantiation: cib_utils.c:pcmk__xe_id
Unexecuted instantiation: rules.c:pcmk__xe_id
Unexecuted instantiation: remote.c:pcmk__xe_id
Unexecuted instantiation: watchdog.c:pcmk__xe_id
Unexecuted instantiation: iso8601_fuzzer.c:pcmk__xe_id
60
61
/*!
62
 * \internal
63
 * \brief Check whether an XML element is of a particular type
64
 *
65
 * \param[in] xml   XML element to compare
66
 * \param[in] name  XML element name to compare
67
 *
68
 * \return \c true if \p xml is of type \p name, otherwise \c false
69
 */
70
static inline bool
71
pcmk__xe_is(const xmlNode *xml, const char *name)
72
0
{
73
0
    return (xml != NULL) && (xml->name != NULL) && (name != NULL)
74
0
           && (strcmp((const char *) xml->name, name) == 0);
75
0
}
Unexecuted instantiation: scores_fuzzer.c:pcmk__xe_is
Unexecuted instantiation: results.c:pcmk__xe_is
Unexecuted instantiation: scores.c:pcmk__xe_is
Unexecuted instantiation: strings.c:pcmk__xe_is
Unexecuted instantiation: utils.c:pcmk__xe_is
Unexecuted instantiation: xml.c:pcmk__xe_is
Unexecuted instantiation: xml_attr.c:pcmk__xe_is
Unexecuted instantiation: xml_comment.c:pcmk__xe_is
Unexecuted instantiation: xml_element.c:pcmk__xe_is
Unexecuted instantiation: xml_idref.c:pcmk__xe_is
Unexecuted instantiation: xpath.c:pcmk__xe_is
Unexecuted instantiation: acl.c:pcmk__xe_is
Unexecuted instantiation: iso8601.c:pcmk__xe_is
Unexecuted instantiation: logging.c:pcmk__xe_is
Unexecuted instantiation: mainloop.c:pcmk__xe_is
Unexecuted instantiation: nvpair.c:pcmk__xe_is
Unexecuted instantiation: options.c:pcmk__xe_is
Unexecuted instantiation: output.c:pcmk__xe_is
Unexecuted instantiation: output_log.c:pcmk__xe_is
Unexecuted instantiation: output_text.c:pcmk__xe_is
Unexecuted instantiation: output_xml.c:pcmk__xe_is
Unexecuted instantiation: patchset_display.c:pcmk__xe_is
Unexecuted instantiation: pid.c:pcmk__xe_is
Unexecuted instantiation: procfs.c:pcmk__xe_is
Unexecuted instantiation: schemas.c:pcmk__xe_is
Unexecuted instantiation: xml_display.c:pcmk__xe_is
Unexecuted instantiation: xml_io.c:pcmk__xe_is
Unexecuted instantiation: actions.c:pcmk__xe_is
Unexecuted instantiation: agents.c:pcmk__xe_is
Unexecuted instantiation: cmdline.c:pcmk__xe_is
Unexecuted instantiation: digest.c:pcmk__xe_is
Unexecuted instantiation: health.c:pcmk__xe_is
Unexecuted instantiation: io.c:pcmk__xe_is
Unexecuted instantiation: ipc_client.c:pcmk__xe_is
Unexecuted instantiation: ipc_common.c:pcmk__xe_is
Unexecuted instantiation: ipc_controld.c:pcmk__xe_is
Unexecuted instantiation: ipc_pacemakerd.c:pcmk__xe_is
Unexecuted instantiation: ipc_schedulerd.c:pcmk__xe_is
Unexecuted instantiation: ipc_server.c:pcmk__xe_is
Unexecuted instantiation: messages.c:pcmk__xe_is
Unexecuted instantiation: nodes.c:pcmk__xe_is
Unexecuted instantiation: options_display.c:pcmk__xe_is
Unexecuted instantiation: patchset.c:pcmk__xe_is
Unexecuted instantiation: servers.c:pcmk__xe_is
Unexecuted instantiation: cib.c:pcmk__xe_is
Unexecuted instantiation: ipc_attrd.c:pcmk__xe_is
Unexecuted instantiation: attrs.c:pcmk__xe_is
Unexecuted instantiation: strings_fuzzer.c:pcmk__xe_is
Unexecuted instantiation: cib_file_fuzzer.c:pcmk__xe_is
Unexecuted instantiation: cib_client.c:pcmk__xe_is
Unexecuted instantiation: cib_file.c:pcmk__xe_is
Unexecuted instantiation: cib_native.c:pcmk__xe_is
Unexecuted instantiation: cib_ops.c:pcmk__xe_is
Unexecuted instantiation: cib_remote.c:pcmk__xe_is
Unexecuted instantiation: cib_utils.c:pcmk__xe_is
Unexecuted instantiation: rules.c:pcmk__xe_is
Unexecuted instantiation: remote.c:pcmk__xe_is
Unexecuted instantiation: watchdog.c:pcmk__xe_is
Unexecuted instantiation: iso8601_fuzzer.c:pcmk__xe_is
76
77
/*!
78
 * \internal
79
 * \brief Return next non-text sibling element of an XML element
80
 *
81
 * \param[in] child  XML element to check
82
 *
83
 * \return Next sibling element of \p child (or NULL if none)
84
 */
85
static inline xmlNode *
86
pcmk__xe_next(const xmlNode *child)
87
0
{
88
0
    xmlNode *next = child? child->next : NULL;
89
90
0
    while (next && (next->type != XML_ELEMENT_NODE)) {
91
0
        next = next->next;
92
0
    }
93
0
    return next;
94
0
}
Unexecuted instantiation: scores_fuzzer.c:pcmk__xe_next
Unexecuted instantiation: results.c:pcmk__xe_next
Unexecuted instantiation: scores.c:pcmk__xe_next
Unexecuted instantiation: strings.c:pcmk__xe_next
Unexecuted instantiation: utils.c:pcmk__xe_next
Unexecuted instantiation: xml.c:pcmk__xe_next
Unexecuted instantiation: xml_attr.c:pcmk__xe_next
Unexecuted instantiation: xml_comment.c:pcmk__xe_next
Unexecuted instantiation: xml_element.c:pcmk__xe_next
Unexecuted instantiation: xml_idref.c:pcmk__xe_next
Unexecuted instantiation: xpath.c:pcmk__xe_next
Unexecuted instantiation: acl.c:pcmk__xe_next
Unexecuted instantiation: iso8601.c:pcmk__xe_next
Unexecuted instantiation: logging.c:pcmk__xe_next
Unexecuted instantiation: mainloop.c:pcmk__xe_next
Unexecuted instantiation: nvpair.c:pcmk__xe_next
Unexecuted instantiation: options.c:pcmk__xe_next
Unexecuted instantiation: output.c:pcmk__xe_next
Unexecuted instantiation: output_log.c:pcmk__xe_next
Unexecuted instantiation: output_text.c:pcmk__xe_next
Unexecuted instantiation: output_xml.c:pcmk__xe_next
Unexecuted instantiation: patchset_display.c:pcmk__xe_next
Unexecuted instantiation: pid.c:pcmk__xe_next
Unexecuted instantiation: procfs.c:pcmk__xe_next
Unexecuted instantiation: schemas.c:pcmk__xe_next
Unexecuted instantiation: xml_display.c:pcmk__xe_next
Unexecuted instantiation: xml_io.c:pcmk__xe_next
Unexecuted instantiation: actions.c:pcmk__xe_next
Unexecuted instantiation: agents.c:pcmk__xe_next
Unexecuted instantiation: cmdline.c:pcmk__xe_next
Unexecuted instantiation: digest.c:pcmk__xe_next
Unexecuted instantiation: health.c:pcmk__xe_next
Unexecuted instantiation: io.c:pcmk__xe_next
Unexecuted instantiation: ipc_client.c:pcmk__xe_next
Unexecuted instantiation: ipc_common.c:pcmk__xe_next
Unexecuted instantiation: ipc_controld.c:pcmk__xe_next
Unexecuted instantiation: ipc_pacemakerd.c:pcmk__xe_next
Unexecuted instantiation: ipc_schedulerd.c:pcmk__xe_next
Unexecuted instantiation: ipc_server.c:pcmk__xe_next
Unexecuted instantiation: messages.c:pcmk__xe_next
Unexecuted instantiation: nodes.c:pcmk__xe_next
Unexecuted instantiation: options_display.c:pcmk__xe_next
Unexecuted instantiation: patchset.c:pcmk__xe_next
Unexecuted instantiation: servers.c:pcmk__xe_next
Unexecuted instantiation: cib.c:pcmk__xe_next
Unexecuted instantiation: ipc_attrd.c:pcmk__xe_next
Unexecuted instantiation: attrs.c:pcmk__xe_next
Unexecuted instantiation: strings_fuzzer.c:pcmk__xe_next
Unexecuted instantiation: cib_file_fuzzer.c:pcmk__xe_next
Unexecuted instantiation: cib_client.c:pcmk__xe_next
Unexecuted instantiation: cib_file.c:pcmk__xe_next
Unexecuted instantiation: cib_native.c:pcmk__xe_next
Unexecuted instantiation: cib_ops.c:pcmk__xe_next
Unexecuted instantiation: cib_remote.c:pcmk__xe_next
Unexecuted instantiation: cib_utils.c:pcmk__xe_next
Unexecuted instantiation: rules.c:pcmk__xe_next
Unexecuted instantiation: remote.c:pcmk__xe_next
Unexecuted instantiation: watchdog.c:pcmk__xe_next
Unexecuted instantiation: iso8601_fuzzer.c:pcmk__xe_next
95
96
xmlNode *pcmk__xe_create(xmlNode *parent, const char *name);
97
xmlNode *pcmk__xe_next_same(const xmlNode *node);
98
99
void pcmk__xe_set_content(xmlNode *node, const char *format, ...)
100
    G_GNUC_PRINTF(2, 3);
101
102
int pcmk__xe_get_score(const xmlNode *xml, const char *name, int *score,
103
                       int default_score);
104
105
int pcmk__xe_copy_attrs(xmlNode *target, const xmlNode *src, uint32_t flags);
106
void pcmk__xe_sort_attrs(xmlNode *xml);
107
108
void pcmk__xe_set_id(xmlNode *xml, const char *format, ...)
109
    G_GNUC_PRINTF(2, 3);
110
111
/*!
112
 * \internal
113
 * \brief Like pcmk__xe_set_props, but takes a va_list instead of
114
 *        arguments directly.
115
 *
116
 * \param[in,out] node   XML to add attributes to
117
 * \param[in]     pairs  NULL-terminated list of name/value pairs to add
118
 */
119
void
120
pcmk__xe_set_propv(xmlNodePtr node, va_list pairs);
121
122
/*!
123
 * \internal
124
 * \brief Add a NULL-terminated list of name/value pairs to the given
125
 *        XML node as properties.
126
 *
127
 * \param[in,out] node XML node to add properties to
128
 * \param[in]     ...  NULL-terminated list of name/value pairs
129
 *
130
 * \note A NULL name terminates the arguments; a NULL value will be skipped.
131
 */
132
void
133
pcmk__xe_set_props(xmlNodePtr node, ...)
134
G_GNUC_NULL_TERMINATED;
135
136
/*!
137
 * \internal
138
 * \brief Get first attribute of an XML element
139
 *
140
 * \param[in] xe  XML element to check
141
 *
142
 * \return First attribute of \p xe (or NULL if \p xe is NULL or has none)
143
 */
144
static inline xmlAttr *
145
pcmk__xe_first_attr(const xmlNode *xe)
146
0
{
147
0
    return (xe == NULL)? NULL : xe->properties;
148
0
}
Unexecuted instantiation: scores_fuzzer.c:pcmk__xe_first_attr
Unexecuted instantiation: results.c:pcmk__xe_first_attr
Unexecuted instantiation: scores.c:pcmk__xe_first_attr
Unexecuted instantiation: strings.c:pcmk__xe_first_attr
Unexecuted instantiation: utils.c:pcmk__xe_first_attr
Unexecuted instantiation: xml.c:pcmk__xe_first_attr
Unexecuted instantiation: xml_attr.c:pcmk__xe_first_attr
Unexecuted instantiation: xml_comment.c:pcmk__xe_first_attr
Unexecuted instantiation: xml_element.c:pcmk__xe_first_attr
Unexecuted instantiation: xml_idref.c:pcmk__xe_first_attr
Unexecuted instantiation: xpath.c:pcmk__xe_first_attr
Unexecuted instantiation: acl.c:pcmk__xe_first_attr
Unexecuted instantiation: iso8601.c:pcmk__xe_first_attr
Unexecuted instantiation: logging.c:pcmk__xe_first_attr
Unexecuted instantiation: mainloop.c:pcmk__xe_first_attr
Unexecuted instantiation: nvpair.c:pcmk__xe_first_attr
Unexecuted instantiation: options.c:pcmk__xe_first_attr
Unexecuted instantiation: output.c:pcmk__xe_first_attr
Unexecuted instantiation: output_log.c:pcmk__xe_first_attr
Unexecuted instantiation: output_text.c:pcmk__xe_first_attr
Unexecuted instantiation: output_xml.c:pcmk__xe_first_attr
Unexecuted instantiation: patchset_display.c:pcmk__xe_first_attr
Unexecuted instantiation: pid.c:pcmk__xe_first_attr
Unexecuted instantiation: procfs.c:pcmk__xe_first_attr
Unexecuted instantiation: schemas.c:pcmk__xe_first_attr
Unexecuted instantiation: xml_display.c:pcmk__xe_first_attr
Unexecuted instantiation: xml_io.c:pcmk__xe_first_attr
Unexecuted instantiation: actions.c:pcmk__xe_first_attr
Unexecuted instantiation: agents.c:pcmk__xe_first_attr
Unexecuted instantiation: cmdline.c:pcmk__xe_first_attr
Unexecuted instantiation: digest.c:pcmk__xe_first_attr
Unexecuted instantiation: health.c:pcmk__xe_first_attr
Unexecuted instantiation: io.c:pcmk__xe_first_attr
Unexecuted instantiation: ipc_client.c:pcmk__xe_first_attr
Unexecuted instantiation: ipc_common.c:pcmk__xe_first_attr
Unexecuted instantiation: ipc_controld.c:pcmk__xe_first_attr
Unexecuted instantiation: ipc_pacemakerd.c:pcmk__xe_first_attr
Unexecuted instantiation: ipc_schedulerd.c:pcmk__xe_first_attr
Unexecuted instantiation: ipc_server.c:pcmk__xe_first_attr
Unexecuted instantiation: messages.c:pcmk__xe_first_attr
Unexecuted instantiation: nodes.c:pcmk__xe_first_attr
Unexecuted instantiation: options_display.c:pcmk__xe_first_attr
Unexecuted instantiation: patchset.c:pcmk__xe_first_attr
Unexecuted instantiation: servers.c:pcmk__xe_first_attr
Unexecuted instantiation: cib.c:pcmk__xe_first_attr
Unexecuted instantiation: ipc_attrd.c:pcmk__xe_first_attr
Unexecuted instantiation: attrs.c:pcmk__xe_first_attr
Unexecuted instantiation: strings_fuzzer.c:pcmk__xe_first_attr
Unexecuted instantiation: cib_file_fuzzer.c:pcmk__xe_first_attr
Unexecuted instantiation: cib_client.c:pcmk__xe_first_attr
Unexecuted instantiation: cib_file.c:pcmk__xe_first_attr
Unexecuted instantiation: cib_native.c:pcmk__xe_first_attr
Unexecuted instantiation: cib_ops.c:pcmk__xe_first_attr
Unexecuted instantiation: cib_remote.c:pcmk__xe_first_attr
Unexecuted instantiation: cib_utils.c:pcmk__xe_first_attr
Unexecuted instantiation: rules.c:pcmk__xe_first_attr
Unexecuted instantiation: remote.c:pcmk__xe_first_attr
Unexecuted instantiation: watchdog.c:pcmk__xe_first_attr
Unexecuted instantiation: iso8601_fuzzer.c:pcmk__xe_first_attr
149
150
/*!
151
 * \internal
152
 * \brief Iterate over child elements of \p xml
153
 *
154
 * This function iterates over the children of \p xml, performing the
155
 * callback function \p handler on each node.  If the callback returns
156
 * a value other than pcmk_rc_ok, the iteration stops and the value is
157
 * returned.  It is therefore possible that not all children will be
158
 * visited.
159
 *
160
 * \param[in,out] xml                 The starting XML node.  Can be NULL.
161
 * \param[in]     child_element_name  The name that the node must match in order
162
 *                                    for \p handler to be run.  If NULL, all
163
 *                                    child elements will match.
164
 * \param[in]     handler             The callback function.
165
 * \param[in,out] userdata            User data to pass to the callback function.
166
 *                                    Can be NULL.
167
 *
168
 * \return Standard Pacemaker return code
169
 */
170
int
171
pcmk__xe_foreach_child(xmlNode *xml, const char *child_element_name,
172
                       int (*handler)(xmlNode *xml, void *userdata),
173
                       void *userdata);
174
175
int pcmk__xe_get_datetime(const xmlNode *xml, const char *attr, crm_time_t **t);
176
int pcmk__xe_get_flags(const xmlNode *xml, const char *name, uint32_t *dest,
177
                       uint32_t default_value);
178
179
void pcmk__xe_set_bool_attr(xmlNodePtr node, const char *name, bool value);
180
int pcmk__xe_get_bool_attr(const xmlNode *node, const char *name, bool *value);
181
bool pcmk__xe_attr_is_true(const xmlNode *node, const char *name);
182
183
#ifdef __cplusplus
184
}
185
#endif
186
187
#endif // PCMK__CRM_COMMON_XML_ELEMENT_INTERNAL__H