pacemaker  2.1.3-ea053b43a
Scalable High-Availability cluster resource manager
Macros | Functions
xml.c File Reference
#include <crm_internal.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <bzlib.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <libxml/xmlIO.h>
#include <crm/crm.h>
#include <crm/msg_xml.h>
#include <crm/common/xml.h>
#include <crm/common/xml_internal.h>
#include "crmcommon_private.h"
#include <crm/common/xml_compat.h>
Include dependency graph for xml.c:

Go to the source code of this file.

Macros

#define XML_PARSER_DEBUG   0
 
#define PCMK__XML_PARSE_OPTS   (XML_PARSE_NOBLANKS | XML_PARSE_RECOVER)
 
#define CHUNK_SIZE   1024
 
#define buffer_print(buffer, max, offset, fmt, args...)
 
#define XML_PRIVATE_MAGIC   (long) 0x81726354
 
#define attr_matches(c, n, v)
 
#define PCMK__XMLDUMP_STATS   0
 
#define XPATH_MAX   512
 

Functions

bool pcmk__tracking_xml_changes (xmlNode *xml, bool lazy)
 
void pcmk__set_xml_doc_flag (xmlNode *xml, enum xml_private_flags flag)
 
void pcmk__mark_xml_created (xmlNode *xml)
 
void pcmk__mark_xml_attr_dirty (xmlAttr *a)
 
void xml_track_changes (xmlNode *xml, const char *user, xmlNode *acl_source, bool enforce_acls)
 
bool xml_tracking_changes (xmlNode *xml)
 
bool xml_document_dirty (xmlNode *xml)
 
int pcmk__xml_position (xmlNode *xml, enum xml_private_flags ignore_if_set)
 
xmlNode * pcmk__xml_match (xmlNode *haystack, xmlNode *needle, bool exact)
 
void xml_log_changes (uint8_t log_level, const char *function, xmlNode *xml)
 
void xml_accept_changes (xmlNode *xml)
 
xmlNode * find_xml_node (xmlNode *root, const char *search_path, gboolean must_find)
 
xmlNode * pcmk__xe_match (xmlNode *parent, const char *node_name, const char *attr_n, const char *attr_v)
 
void copy_in_properties (xmlNode *target, xmlNode *src)
 
void fix_plus_plus_recursive (xmlNode *target)
 
void expand_plus_plus (xmlNode *target, const char *name, const char *value)
 
void pcmk__xe_remove_matching_attrs (xmlNode *element, bool(*match)(xmlAttrPtr, void *), void *user_data)
 
xmlDoc * getDocPtr (xmlNode *node)
 
xmlNode * add_node_copy (xmlNode *parent, xmlNode *src_node)
 
int add_node_nocopy (xmlNode *parent, const char *name, xmlNode *child)
 
xmlNode * create_xml_node (xmlNode *parent, const char *name)
 
xmlNode * pcmk_create_xml_text_node (xmlNode *parent, const char *name, const char *content)
 
xmlNode * pcmk_create_html_node (xmlNode *parent, const char *element_name, const char *id, const char *class_name, const char *text)
 
void pcmk_free_xml_subtree (xmlNode *xml)
 
void free_xml (xmlNode *child)
 
xmlNode * copy_xml (xmlNode *src)
 
xmlNode * string2xml (const char *input)
 
xmlNode * stdin2xml (void)
 
void pcmk__strip_xml_text (xmlNode *xml)
 
xmlNode * filename2xml (const char *filename)
 
const char * pcmk__xe_add_last_written (xmlNode *xe)
 
void crm_xml_sanitize_id (char *id)
 Sanitize a string so it is usable as an XML ID. More...
 
void crm_xml_set_id (xmlNode *xml, const char *format,...)
 Set the ID of an XML element using a format. More...
 
int write_xml_fd (xmlNode *xml_node, const char *filename, int fd, gboolean compress)
 Write XML to a file descriptor. More...
 
int write_xml_file (xmlNode *xml_node, const char *filename, gboolean compress)
 Write XML to a file. More...
 
char * crm_xml_escape (const char *text)
 Replace special characters with their XML escape sequences. More...
 
void pcmk__xe_log (int log_level, const char *file, const char *function, int line, const char *prefix, xmlNode *data, int depth, int options)
 
void log_data_element (int log_level, const char *file, const char *function, int line, const char *prefix, xmlNode *data, int depth, int options)
 
void pcmk__xml2text (xmlNode *data, int options, char **buffer, int *offset, int *max, int depth)
 
void pcmk__buffer_add_char (char **buffer, int *offset, int *max, char c)
 
char * dump_xml_formatted_with_text (xmlNode *an_xml_node)
 
char * dump_xml_formatted (xmlNode *an_xml_node)
 
char * dump_xml_unformatted (xmlNode *an_xml_node)
 
gboolean xml_has_children (const xmlNode *xml_root)
 
void xml_remove_prop (xmlNode *obj, const char *name)
 
void save_xml_to_file (xmlNode *xml, const char *desc, const char *filename)
 
void xml_calculate_significant_changes (xmlNode *old_xml, xmlNode *new_xml)
 
void xml_calculate_changes (xmlNode *old_xml, xmlNode *new_xml)
 
gboolean can_prune_leaf (xmlNode *xml_node)
 
xmlNode * pcmk__xc_match (xmlNode *root, xmlNode *search_comment, bool exact)
 
void pcmk__xc_update (xmlNode *parent, xmlNode *target, xmlNode *update)
 
void pcmk__xml_update (xmlNode *parent, xmlNode *target, xmlNode *update, bool as_diff)
 
gboolean update_xml_child (xmlNode *child, xmlNode *to_update)
 
int find_xml_children (xmlNode **children, xmlNode *root, const char *tag, const char *field, const char *value, gboolean search_matches)
 
gboolean replace_xml_child (xmlNode *parent, xmlNode *child, xmlNode *update, gboolean delete_only)
 
xmlNode * sorted_xml (xmlNode *input, xmlNode *parent, gboolean recursive)
 
xmlNode * first_named_child (const xmlNode *parent, const char *name)
 
xmlNode * crm_next_same_xml (const xmlNode *sibling)
 Get next instance of same XML tag. More...
 
void crm_xml_init (void)
 Initialize the CRM XML subsystem. More...
 
void crm_xml_cleanup (void)
 
xmlNode * expand_idref (xmlNode *input, xmlNode *top)
 
void crm_destroy_xml (gpointer data)
 xmlNode destructor which can be used in glib collections More...
 
char * pcmk__xml_artefact_root (enum pcmk__xml_artefact_ns ns)
 
char * pcmk__xml_artefact_path (enum pcmk__xml_artefact_ns ns, const char *filespec)
 
void pcmk__xe_set_propv (xmlNodePtr node, va_list pairs)
 
void pcmk__xe_set_props (xmlNodePtr node,...)
 
xmlNode * find_entity (xmlNode *parent, const char *node_name, const char *id)
 

Macro Definition Documentation

◆ attr_matches

#define attr_matches (   c,
  n,
 
)
Value:
pcmk__str_eq(crm_element_value((c), (n)), \
const char * crm_element_value(const xmlNode *data, const char *name)
Retrieve the value of an XML attribute.
Definition: nvpair.c:529

Definition at line 478 of file xml.c.

◆ buffer_print

#define buffer_print (   buffer,
  max,
  offset,
  fmt,
  args... 
)
Value:
do { \
int rc = (max); \
if(buffer) { \
rc = snprintf((buffer) + (offset), (max) - (offset), fmt, ##args); \
} \
if(buffer && rc < 0) { \
crm_perror(LOG_ERR, "snprintf failed at offset %d", offset); \
(buffer)[(offset)] = 0; \
break; \
} else if(rc >= ((max) - (offset))) { \
char *tmp = NULL; \
(max) = QB_MAX(CHUNK_SIZE, (max) * 2); \
tmp = pcmk__realloc((buffer), (max)); \
CRM_ASSERT(tmp); \
(buffer) = tmp; \
} else { \
offset += rc; \
break; \
} \
} while(1);
#define CHUNK_SIZE
Definition: xml.c:48

Definition at line 65 of file xml.c.

◆ CHUNK_SIZE

#define CHUNK_SIZE   1024

Definition at line 48 of file xml.c.

◆ PCMK__XML_PARSE_OPTS

#define PCMK__XML_PARSE_OPTS   (XML_PARSE_NOBLANKS | XML_PARSE_RECOVER)

Definition at line 46 of file xml.c.

◆ PCMK__XMLDUMP_STATS

#define PCMK__XMLDUMP_STATS   0

Definition at line 1858 of file xml.c.

◆ XML_PARSER_DEBUG

#define XML_PARSER_DEBUG   0

Definition at line 33 of file xml.c.

◆ XML_PRIVATE_MAGIC

#define XML_PRIVATE_MAGIC   (long) 0x81726354

Definition at line 184 of file xml.c.

◆ XPATH_MAX

#define XPATH_MAX   512

Definition at line 2864 of file xml.c.

Function Documentation

◆ add_node_copy()

xmlNode* add_node_copy ( xmlNode *  parent,
xmlNode *  src_node 
)

Definition at line 674 of file xml.c.

◆ add_node_nocopy()

int add_node_nocopy ( xmlNode *  parent,
const char *  name,
xmlNode *  child 
)

Definition at line 688 of file xml.c.

◆ can_prune_leaf()

gboolean can_prune_leaf ( xmlNode *  xml_node)

Definition at line 2392 of file xml.c.

◆ copy_in_properties()

void copy_in_properties ( xmlNode *  target,
xmlNode *  src 
)

Definition at line 520 of file xml.c.

◆ copy_xml()

xmlNode* copy_xml ( xmlNode *  src)

Definition at line 830 of file xml.c.

◆ create_xml_node()

xmlNode* create_xml_node ( xmlNode *  parent,
const char *  name 
)

Definition at line 696 of file xml.c.

◆ crm_destroy_xml()

void crm_destroy_xml ( gpointer  data)

xmlNode destructor which can be used in glib collections

Definition at line 2900 of file xml.c.

◆ crm_next_same_xml()

xmlNode* crm_next_same_xml ( const xmlNode *  sibling)

Get next instance of same XML tag.

Parameters
[in]siblingXML tag to start from
Returns
Next sibling XML tag with same name

Definition at line 2820 of file xml.c.

◆ crm_xml_cleanup()

void crm_xml_cleanup ( void  )

Definition at line 2857 of file xml.c.

◆ crm_xml_escape()

char* crm_xml_escape ( const char *  text)

Replace special characters with their XML escape sequences.

Parameters
[in]textText to escape
Returns
Newly allocated string equivalent to text but with special characters replaced with XML escape sequences (or NULL if text is NULL)

Definition at line 1345 of file xml.c.

◆ crm_xml_init()

void crm_xml_init ( void  )

Initialize the CRM XML subsystem.

This method sets global XML settings and loads pacemaker schemas into the cache.

Definition at line 2835 of file xml.c.

◆ crm_xml_sanitize_id()

void crm_xml_sanitize_id ( char *  id)

Sanitize a string so it is usable as an XML ID.

Parameters
[in,out]idString to sanitize

Definition at line 1129 of file xml.c.

◆ crm_xml_set_id()

void crm_xml_set_id ( xmlNode *  xml,
const char *  format,
  ... 
)

Set the ID of an XML element using a format.

Parameters
[in,out]xmlXML element
[in]fmtprintf-style format
[in]...any arguments required by format

Definition at line 1151 of file xml.c.

◆ dump_xml_formatted()

char* dump_xml_formatted ( xmlNode *  an_xml_node)

Definition at line 2007 of file xml.c.

◆ dump_xml_formatted_with_text()

char* dump_xml_formatted_with_text ( xmlNode *  an_xml_node)

Definition at line 1995 of file xml.c.

◆ dump_xml_unformatted()

char* dump_xml_unformatted ( xmlNode *  an_xml_node)

Definition at line 2018 of file xml.c.

◆ expand_idref()

xmlNode* expand_idref ( xmlNode *  input,
xmlNode *  top 
)

Definition at line 2867 of file xml.c.

◆ expand_plus_plus()

void expand_plus_plus ( xmlNode *  target,
const char *  name,
const char *  value 
)

Definition at line 559 of file xml.c.

◆ filename2xml()

xmlNode* filename2xml ( const char *  filename)

Definition at line 1045 of file xml.c.

◆ find_entity()

xmlNode* find_entity ( xmlNode *  parent,
const char *  node_name,
const char *  id 
)
Deprecated:
This function will be removed in a future release

Definition at line 2988 of file xml.c.

◆ find_xml_children()

int find_xml_children ( xmlNode **  children,
xmlNode *  root,
const char *  tag,
const char *  field,
const char *  value,
gboolean  search_matches 
)

Definition at line 2647 of file xml.c.

◆ find_xml_node()

xmlNode* find_xml_node ( xmlNode *  root,
const char *  search_path,
gboolean  must_find 
)

Definition at line 445 of file xml.c.

◆ first_named_child()

xmlNode* first_named_child ( const xmlNode *  parent,
const char *  name 
)

Definition at line 2794 of file xml.c.

◆ fix_plus_plus_recursive()

void fix_plus_plus_recursive ( xmlNode *  target)

Definition at line 541 of file xml.c.

◆ free_xml()

void free_xml ( xmlNode *  child)

Definition at line 824 of file xml.c.

◆ getDocPtr()

xmlDoc* getDocPtr ( xmlNode *  node)

Definition at line 658 of file xml.c.

◆ log_data_element()

void log_data_element ( int  log_level,
const char *  file,
const char *  function,
int  line,
const char *  prefix,
xmlNode *  data,
int  depth,
int  options 
)

Definition at line 1646 of file xml.c.

◆ pcmk__buffer_add_char()

void pcmk__buffer_add_char ( char **  buffer,
int *  offset,
int *  max,
char  c 
)

Definition at line 1989 of file xml.c.

◆ pcmk__mark_xml_attr_dirty()

void pcmk__mark_xml_attr_dirty ( xmlAttr *  a)

Definition at line 173 of file xml.c.

◆ pcmk__mark_xml_created()

void pcmk__mark_xml_created ( xmlNode *  xml)

Definition at line 155 of file xml.c.

◆ pcmk__set_xml_doc_flag()

void pcmk__set_xml_doc_flag ( xmlNode *  xml,
enum xml_private_flags  flag 
)

Definition at line 117 of file xml.c.

◆ pcmk__strip_xml_text()

void pcmk__strip_xml_text ( xmlNode *  xml)

Definition at line 1017 of file xml.c.

◆ pcmk__tracking_xml_changes()

bool pcmk__tracking_xml_changes ( xmlNode *  xml,
bool  lazy 
)

Definition at line 51 of file xml.c.

◆ pcmk__xc_match()

xmlNode* pcmk__xc_match ( xmlNode *  root,
xmlNode *  search_comment,
bool  exact 
)

Definition at line 2435 of file xml.c.

◆ pcmk__xc_update()

void pcmk__xc_update ( xmlNode *  parent,
xmlNode *  target,
xmlNode *  update 
)

Definition at line 2484 of file xml.c.

◆ pcmk__xe_add_last_written()

const char* pcmk__xe_add_last_written ( xmlNode *  xe)

Definition at line 1115 of file xml.c.

◆ pcmk__xe_log()

void pcmk__xe_log ( int  log_level,
const char *  file,
const char *  function,
int  line,
const char *  prefix,
xmlNode *  data,
int  depth,
int  options 
)

Definition at line 1444 of file xml.c.

◆ pcmk__xe_match()

xmlNode* pcmk__xe_match ( xmlNode *  parent,
const char *  node_name,
const char *  attr_n,
const char *  attr_v 
)

Definition at line 495 of file xml.c.

◆ pcmk__xe_remove_matching_attrs()

void pcmk__xe_remove_matching_attrs ( xmlNode *  element,
bool(*)(xmlAttrPtr, void *)  match,
void *  user_data 
)

Definition at line 629 of file xml.c.

◆ pcmk__xe_set_props()

void pcmk__xe_set_props ( xmlNodePtr  node,
  ... 
)

Definition at line 2974 of file xml.c.

◆ pcmk__xe_set_propv()

void pcmk__xe_set_propv ( xmlNodePtr  node,
va_list  pairs 
)

Definition at line 2956 of file xml.c.

◆ pcmk__xml2text()

void pcmk__xml2text ( xmlNode *  data,
int  options,
char **  buffer,
int *  offset,
int *  max,
int  depth 
)

Definition at line 1872 of file xml.c.

◆ pcmk__xml_artefact_path()

char* pcmk__xml_artefact_path ( enum pcmk__xml_artefact_ns  ns,
const char *  filespec 
)

Definition at line 2934 of file xml.c.

◆ pcmk__xml_artefact_root()

char* pcmk__xml_artefact_root ( enum pcmk__xml_artefact_ns  ns)

Definition at line 2906 of file xml.c.

◆ pcmk__xml_match()

xmlNode* pcmk__xml_match ( xmlNode *  haystack,
xmlNode *  needle,
bool  exact 
)

Definition at line 369 of file xml.c.

◆ pcmk__xml_position()

int pcmk__xml_position ( xmlNode *  xml,
enum xml_private_flags  ignore_if_set 
)

Definition at line 314 of file xml.c.

◆ pcmk__xml_update()

void pcmk__xml_update ( xmlNode *  parent,
xmlNode *  target,
xmlNode *  update,
bool  as_diff 
)

Definition at line 2515 of file xml.c.

◆ pcmk_create_html_node()

xmlNode* pcmk_create_html_node ( xmlNode *  parent,
const char *  element_name,
const char *  id,
const char *  class_name,
const char *  text 
)

Definition at line 733 of file xml.c.

◆ pcmk_create_xml_text_node()

xmlNode* pcmk_create_xml_text_node ( xmlNode *  parent,
const char *  name,
const char *  content 
)

Definition at line 721 of file xml.c.

◆ pcmk_free_xml_subtree()

void pcmk_free_xml_subtree ( xmlNode *  xml)

Free an XML element and all of its children, removing it from its parent

Parameters
[in]xmlXML element to free

Definition at line 755 of file xml.c.

◆ replace_xml_child()

gboolean replace_xml_child ( xmlNode *  parent,
xmlNode *  child,
xmlNode *  update,
gboolean  delete_only 
)

Definition at line 2680 of file xml.c.

◆ save_xml_to_file()

void save_xml_to_file ( xmlNode *  xml,
const char *  desc,
const char *  filename 
)

Definition at line 2056 of file xml.c.

◆ sorted_xml()

xmlNode* sorted_xml ( xmlNode *  input,
xmlNode *  parent,
gboolean  recursive 
)

Definition at line 2762 of file xml.c.

◆ stdin2xml()

xmlNode* stdin2xml ( void  )

Definition at line 930 of file xml.c.

◆ string2xml()

xmlNode* string2xml ( const char *  input)

Definition at line 869 of file xml.c.

◆ update_xml_child()

gboolean update_xml_child ( xmlNode *  child,
xmlNode *  to_update 
)

Definition at line 2613 of file xml.c.

◆ write_xml_fd()

int write_xml_fd ( xmlNode *  xml_node,
const char *  filename,
int  fd,
gboolean  compress 
)

Write XML to a file descriptor.

Parameters
[in]xml_nodeXML to write
[in]filenameName of file being written (for logging only)
[in]fdOpen file descriptor corresponding to filename
[in]compressWhether to compress XML before writing
Returns
Number of bytes written on success, -errno otherwise

Definition at line 1272 of file xml.c.

◆ write_xml_file()

int write_xml_file ( xmlNode *  xml_node,
const char *  filename,
gboolean  compress 
)

Write XML to a file.

Parameters
[in]xml_nodeXML to write
[in]filenameName of file to write
[in]compressWhether to compress XML before writing
Returns
Number of bytes written on success, -errno otherwise

Definition at line 1300 of file xml.c.

◆ xml_accept_changes()

void xml_accept_changes ( xmlNode *  xml)

Definition at line 420 of file xml.c.

◆ xml_calculate_changes()

void xml_calculate_changes ( xmlNode *  old_xml,
xmlNode *  new_xml 
)

Definition at line 2378 of file xml.c.

◆ xml_calculate_significant_changes()

void xml_calculate_significant_changes ( xmlNode *  old_xml,
xmlNode *  new_xml 
)

Definition at line 2371 of file xml.c.

◆ xml_document_dirty()

bool xml_document_dirty ( xmlNode *  xml)

Definition at line 297 of file xml.c.

◆ xml_has_children()

gboolean xml_has_children ( const xmlNode *  xml_root)

Definition at line 2028 of file xml.c.

◆ xml_log_changes()

void xml_log_changes ( uint8_t  log_level,
const char *  function,
xmlNode *  xml 
)

Definition at line 385 of file xml.c.

◆ xml_remove_prop()

void xml_remove_prop ( xmlNode *  obj,
const char *  name 
)

Definition at line 2037 of file xml.c.

◆ xml_track_changes()

void xml_track_changes ( xmlNode *  xml,
const char *  user,
xmlNode *  acl_source,
bool  enforce_acls 
)

Definition at line 275 of file xml.c.

◆ xml_tracking_changes()

bool xml_tracking_changes ( xmlNode *  xml)

Definition at line 290 of file xml.c.