send_complete("Illegal update", update, te_update);
send_complete("Illegal update", update, te_update, i_cancel); done = TRUE;  } else if(te_fsa_state == s_abort_pending) {  crm_debug("Ignoring CIB update while waiting for an abort");
te_update_confirm(const char *event, HA_Message *msg){	int rc = -1;	gboolean done = FALSE;	const char *op = cl_get_string(msg, F_CIB_OPERATION);	const char *type = cl_get_string(msg, F_CIB_OBJTYPE);	crm_data_t *update = get_message_xml(msg, F_CIB_UPDATE);	ha_msg_value_int(msg, F_CIB_RC, &rc);	crm_debug("Processing %s...", event);	crm_log_xml_debug_2(update, "Processing update");		if(op == NULL) {		crm_err("Illegal CIB update, the operation must be specified");		send_complete("Illegal update", update, te_update);		done = TRUE;			} else if(strcmp(op, CRM_OP_CIB_ERASE) == 0) {		/* these are always unexpected, trigger the PE */		crm_err("Need to trigger an election here so that"			" the current state of all nodes is obtained");		send_complete("Erase event", update, te_update);		done = TRUE;	} else if(strcmp(op, CRM_OP_CIB_CREATE) == 0		  || strcmp(op, CRM_OP_CIB_DELETE) == 0		  || strcmp(op, CRM_OP_CIB_REPLACE) == 0		  || strcmp(op, CRM_OP_SHUTDOWN_REQ) == 0) {				/* these are always unexpected, trigger the PE */		send_complete("Non-update change", update, te_update);		done = TRUE;			} else if(strcmp(op, CRM_OP_CIB_UPDATE) != 0) {		crm_debug_2("Ignoring %s op confirmation", op);		done = TRUE;	}	if(done) {		free_xml(update);		return;	}		if(safe_str_eq(type, XML_CIB_TAG_CRMCONFIG)) {		/* ignore - for the moment */		crm_debug("Ignoring changes to the %s section", type);			} else if(safe_str_eq(type, XML_CIB_TAG_NODES)) {		/* ignore new nodes until they sign up */		crm_debug("Ignoring changes to the %s section", type);	} else if(safe_str_eq(type, XML_CIB_TAG_STATUS)) {		/* this _may_ not be un-expected */		if(extract_event(update) == FALSE) {			send_complete("Unexpected status update", update, te_update);		}	} else if(safe_str_eq(type, XML_CIB_TAG_NODES)		|| safe_str_eq(type, XML_CIB_TAG_RESOURCES)		|| safe_str_eq(type, XML_CIB_TAG_CONSTRAINTS)) {		/* these are never expected	 */		crm_debug("Aborting on changes to the %s section", type);		send_complete("Non-status update", update, te_update);	} else if(safe_str_eq(type, XML_TAG_CIB)) {		crm_data_t *section_xml = NULL;		const char *section = NULL;		gboolean abort = FALSE;		section = XML_CIB_TAG_NODES;		if(abort == FALSE) {			section_xml = get_object_root(section, update);			xml_child_iter(section_xml, child, NULL,				       abort = TRUE;				       break;				);		}		section = XML_CIB_TAG_RESOURCES;		if(abort == FALSE) {			section_xml = get_object_root(section, update);			xml_child_iter(section_xml, child, NULL,				       abort = TRUE;				       break;				);		}		section = XML_CIB_TAG_CONSTRAINTS;		if(abort == FALSE) {			section_xml = get_object_root(section, update);			xml_child_iter(section_xml, child, NULL,				       abort = TRUE;				       break;				);		}		section = XML_CIB_TAG_CRMCONFIG;		if(abort == FALSE) {			section_xml = get_object_root(section, update);			xml_child_iter(section_xml, child, NULL,				       abort = TRUE;				       break;				);		}		if(abort) {			send_complete("Non-status update", update, te_update);		} 		section = XML_CIB_TAG_STATUS;		if(abort == FALSE) {			section_xml = get_object_root(section, update);			if(extract_event(section_xml) == FALSE) {				send_complete("Unexpected global status update",					      section_xml, te_update);			}		}			} else {		crm_err("Ignoring update confirmation for %s object", type);		crm_log_xml_debug(update, "Ignored update");	}	free_xml(update);}