diff --git a/include/crm/common/xml.h b/include/crm/common/xml.h index 7b96195430..3ae3a50746 100644 --- a/include/crm/common/xml.h +++ b/include/crm/common/xml.h @@ -1,204 +1,208 @@ -/* $Id: xml.h,v 1.5 2004/09/14 05:54:42 andrew Exp $ */ +/* $Id: xml.h,v 1.6 2004/09/15 20:19:23 andrew Exp $ */ /* * Copyright (C) 2004 Andrew Beekhof * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef CRM_COMMON_XML__H #define CRM_COMMON_XML__H #include #include #include #include #include #include #include #include #include /* * Replacement function for xmlCopyPropList which at the very least, * doesnt work the way *I* would expect it to. * * Copy all the attributes/properties from src into target. * * Not recursive, does not return anything. * */ extern void copy_in_properties(xmlNodePtr target, xmlNodePtr src); /* * Find a child named search_path[i] at level i in the XML fragment where i=0 * is an immediate child of root. * * Terminate with success if i == len, or search_path[i] == NULL. * * On success, returns the sub-fragment described by search_path. * On failure, returns NULL. */ extern xmlNodePtr find_xml_node_nested( xmlNodePtr root, const char **search_path, int len); /* * Find a child named search_path[i] at level i in the XML fragment where i=0 * is an immediate child of root. * * Once the last child specified by node_path is found, find the value * of attr_name. * * If error is set to TRUE, then it is an error for the attribute not * to be found and the function will log accordingly. * * On success, returns the value of attr_name. * On failure, returns NULL. */ extern const char *get_xml_attr_nested(xmlNodePtr parent, const char **node_path, int length, const char *attr_name, gboolean error); /* * Free the XML "stuff" associated with a_node * * If a_node is part of a document, free the whole thing * * Otherwise, unlink it from its current location and free everything * from there down. * * Wont barf on NULL. * */ extern void free_xml(xmlNodePtr a_node); /* * Create a node named "name" as a child of "parent" * If parent is NULL, creates an unconnected node. * * Returns the created node * */ extern xmlNodePtr create_xml_node(xmlNodePtr parent, const char *name); /* * Make a copy of name and value and use the copied memory to create * an attribute for node. * * If node, name or value are NULL, nothing is done. * * If name or value are an empty string, nothing is done. * * Returns NULL on failure and the attribute created on success. * */ extern xmlAttrPtr set_xml_property_copy(xmlNodePtr node, const xmlChar *name, const xmlChar *value); /* * Unlink the node and set its doc pointer to NULL so free_xml() * will act appropriately */ extern void unlink_xml_node(xmlNodePtr node); /* * Set a timestamp attribute on a_node */ extern void set_node_tstamp(xmlNodePtr a_node); /* * Returns a deep copy of src_node * * Either calls xmlCopyNode() or a home grown alternative (based on * XML_TRACE being defined) that does more logging... * helpful when part of the XML document has been freed :) */ extern xmlNodePtr copy_xml_node_recursive(xmlNodePtr src_node); /* * Add a copy of xml_node to new_parent */ extern xmlNodePtr add_node_copy(xmlNodePtr new_parent, xmlNodePtr xml_node); /* * Read in the contents of a pre-opened file descriptor (until EOF) and * produce an XML fragment (it will have an attached document). * * input will need to be closed on completion. * * Whitespace between tags is discarded. * */ extern xmlNodePtr file2xml(FILE *input); /* * Read in the contents of a string and produce an XML fragment (it will * have an attached document). * * input will need to be freed on completion. * * Whitespace between tags is discarded. * */ extern xmlNodePtr string2xml(const char *input); /* convience "wrapper" functions */ extern xmlNodePtr find_xml_node(xmlNodePtr cib, const char * node_path); extern xmlNodePtr find_entity(xmlNodePtr parent, const char *node_name, const char *id, gboolean siblings); extern const char *get_xml_attr(xmlNodePtr parent, const char *node_name, const char *attr_name, gboolean error); extern xmlNodePtr set_xml_attr(xmlNodePtr parent, const char *node_name, const char *attr_name, const char *attr_value, gboolean create); extern int write_xml_file(xmlNodePtr xml_node, const char *filename); extern char *dump_xml_formatted(xmlNodePtr msg); extern char *dump_xml_unformatted(xmlNodePtr msg); extern void print_xml_formatted(int log_level, const char *function, xmlNodePtr an_xml_node, const char *text); #define xml_child_iter(a,b,c,d) if(a != NULL) { \ xmlNodePtr b = a->children; \ while(b != NULL) { \ if(c == NULL || safe_str_eq(c, b->name)) { \ d; \ } else { \ crm_trace("Skipping <%s../>", b->name); \ } \ b=b->next; \ } \ } else { \ crm_trace("Parent of loop was NULL"); \ } /* } else { \ */ /* crm_debug("Ignoring node %s (filter %s)", \ */ /* b->name, (const char*)c); \ */ + +/* make sure the looop progresses before continuing */ +#define xml_iter_continue(a) a=a->next; continue + #endif diff --git a/include/crm/crm.h b/include/crm/crm.h index 0dc1350a62..4fa3bcd60d 100644 --- a/include/crm/crm.h +++ b/include/crm/crm.h @@ -1,176 +1,176 @@ -/* $Id: crm.h,v 1.22 2004/09/14 05:54:42 andrew Exp $ */ +/* $Id: crm.h,v 1.23 2004/09/15 20:19:23 andrew Exp $ */ /* * Copyright (C) 2004 Andrew Beekhof * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef CRM__H #define CRM__H #include #include #include #include #include #include #ifdef MCHECK #include #endif #include /* Clean these up at some point, some probably should be runtime options */ #define WORKING_DIR HA_VARLIBDIR"/heartbeat/crm" #define BIN_DIR "/usr/lib/heartbeat" #define MAXDATASIZE 65535 /* ipc comms */ #define SOCKET_LEN 1024 #define APPNAME_LEN 256 #define LOG_DIR "/var/log" #define MAX_IPC_FAIL 5 #define CIB_FILENAME WORKING_DIR"/cib.xml" #define CIB_BACKUP WORKING_DIR"/cib_backup.xml" #define DEVEL_CIB_COPY 1 #define DEVEL_DIR "/tmp/crm" -#define CRM_VERSION "0.5" +#define CRM_VERSION "0.6" #define MSG_LOG 1 #define DOT_FSA_ACTIONS 1 #define DOT_ALL_FSA_INPUTS 1 #define FSA_TRACE 1 /* #define USE_FAKE_LRM 1 */ /* Sub-systems */ #define CRM_SYSTEM_DC "dc" #define CRM_SYSTEM_DCIB "dcib" /* The master CIB */ #define CRM_SYSTEM_CIB "cib" #define CRM_SYSTEM_CRMD "crmd" #define CRM_SYSTEM_LRMD "lrmd" #define CRM_SYSTEM_PENGINE "pengine" #define CRM_SYSTEM_TENGINE "tengine" /* Valid operations */ #define CRM_OP_BUMP "bump" #define CRM_OP_QUERY "query" #define CRM_OP_CREATE "create" #define CRM_OP_UPDATE "update" #define CRM_OP_DELETE "delete" #define CRM_OP_ERASE "erase" #define CRM_OP_STORE "store" #define CRM_OP_REPLACE "replace" #define CRM_OP_FORWARD "forward" #define CRM_OP_JOINACK "join_ack" #define CRM_OP_WELCOME "welcome" #define CRM_OP_PING "ping" #define CRM_OP_VOTE "vote" #define CRM_OP_HELLO "hello" #define CRM_OP_ANNOUNCE "announce" #define CRM_OP_HBEAT "dc_beat" #define CRM_OP_PECALC "pe_calc" #define CRM_OP_ABORT "abort" #define CRM_OP_QUIT "quit" #define CRM_OP_SHUTDOWN "shutdown_crm" #define CRM_OP_EVENTCC "event_cc" #define CRM_OP_TEABORT "te_abort" #define CRM_OP_TRANSITION "transition" #define CRM_OP_TECOMPLETE "te_complete" #define CRM_OP_SHUTDOWN_REQ "req_shutdown" #define CRMD_STATE_ACTIVE "member" #define CRMD_STATE_INACTIVE "down" #define CRMD_JOINSTATE_DOWN "down" #define CRMD_JOINSTATE_PENDING "pending" #define CRMD_JOINSTATE_MEMBER "member" #define CRMD_RSCSTATE_START "start" #define CRMD_RSCSTATE_START_PENDING "starting" #define CRMD_RSCSTATE_START_OK "running" #define CRMD_RSCSTATE_START_FAIL "start_failed" #define CRMD_RSCSTATE_STOP "stop" #define CRMD_RSCSTATE_STOP_PENDING "stopping" #define CRMD_RSCSTATE_STOP_OK "stopped" #define CRMD_RSCSTATE_STOP_FAIL "stop_failed" #define CRMD_RSCSTATE_MON "status" #define CRMD_RSCSTATE_MON_PENDING CRMD_RSCSTATE_START_OK #define CRMD_RSCSTATE_MON_OK CRMD_RSCSTATE_START_OK #define CRMD_RSCSTATE_MON_FAIL "status_failed" /* #define CRMD_RSCSTATE_GENERIC "pending" */ #define CRMD_RSCSTATE_GENERIC_PENDING "pending" #define CRMD_RSCSTATE_GENERIC_OK "complete" #define CRMD_RSCSTATE_GENERIC_FAIL "pending_failed" typedef GList* GListPtr; #define safe_str_eq(x, y) (x!=NULL && y!=NULL && strcmp(x,y) == 0) #define safe_str_neq(x, y) (x != y && (x==NULL || y==NULL || strcmp(x,y) != 0)) #define slist_iter(w, x, y, z, a) for(z = 0; z < g_list_length(y); z++) { \ x *w = (x*)g_list_nth_data(y, z); \ a; \ } /* Developmental debug stuff */ #define LOG_VERBOSE LOG_DEBUG+1 #define LOG_DEV LOG_DEBUG+2 #define LOG_TRACE LOG_DEBUG+3 #if 1 # define crm_crit(w...) do_crm_log(LOG_CRIT, __FUNCTION__, w) # define crm_err(w...) do_crm_log(LOG_ERR, __FUNCTION__, w) # define crm_warn(w...) do_crm_log(LOG_WARNING, __FUNCTION__, w) # define crm_notice(w...) do_crm_log(LOG_NOTICE, __FUNCTION__, w) # define crm_info(w...) do_crm_log(LOG_INFO, __FUNCTION__, w) # define crm_debug(w...) do_crm_log(LOG_DEBUG, __FUNCTION__, w) # define crm_devel(w...) do_crm_log(LOG_DEV, __FUNCTION__, w) # define crm_verbose(w...) do_crm_log(LOG_VERBOSE, __FUNCTION__, w) # define crm_trace(w...) do_crm_log(LOG_TRACE, __FUNCTION__, w) #else # define crm_crit(w...) cl_log(LOG_CRIT, w) # define crm_err(w...) cl_log(LOG_ERR, w) # define crm_warn(w...) cl_log(LOG_WARNING, w) # define crm_notice(w...) cl_log(LOG_NOTICE, w) # define crm_info(w...) cl_log(LOG_INFO, w) # define crm_debug(w...) cl_log(LOG_DEBUG, w) # define crm_devel(w...) cl_log(LOG_DEV, w) # define crm_verbose(w...) cl_log(LOG_VERBOSE, w) # define crm_trace(w...) cl_log(LOG_TRACE, w) #endif #define crm_debug_action(x) if(crm_log_level >= LOG_DEBUG) { \ x; \ } #define crm_info_action(x) if(crm_log_level >= LOG_INFO) { \ x; \ } #define crm_xml_crit(x,y) print_xml_formatted(LOG_CRIT, __FUNCTION__, x,y) #define crm_xml_err(x,y) print_xml_formatted(LOG_ERR, __FUNCTION__, x,y) #define crm_xml_warn(x,y) print_xml_formatted(LOG_WARNING,__FUNCTION__, x,y) #define crm_xml_notice(x,y) print_xml_formatted(LOG_NOTICE, __FUNCTION__, x,y) #define crm_xml_info(x,y) print_xml_formatted(LOG_INFO, __FUNCTION__, x,y) #define crm_xml_debug(x,y) print_xml_formatted(LOG_DEBUG, __FUNCTION__, x,y) #define crm_xml_devel(x,y) print_xml_formatted(LOG_DEV, __FUNCTION__, x,y) #define crm_xml_verbose(x,y) print_xml_formatted(LOG_VERBOSE,__FUNCTION__, x,y) #define crm_xml_trace(x,y) print_xml_formatted(LOG_TRACE, __FUNCTION__, x,y) #define crm_malloc(x) malloc(x) #define crm_strdup(x) strdup(x) #define crm_free(x) if(x) { free(x); x=NULL; } #endif