send_request(NULL, data, "update",
send_request(NULL, data, CRM_OPERATION_UPDATE,
handle_message(xmlNodePtr stored_msg){	enum crmd_fsa_input next_input = I_NULL;	xmlNodePtr options = find_xml_node(stored_msg, XML_TAG_OPTIONS);	const char *sys_to   = xmlGetProp(stored_msg, XML_ATTR_SYSTO);	const char *sys_from = xmlGetProp(stored_msg, XML_ATTR_SYSFROM);	const char *type     = xmlGetProp(stored_msg, XML_ATTR_MSGTYPE);	const char *op = xmlGetProp(options, XML_ATTR_OP);	if(type == NULL || op == NULL) {		cl_log(LOG_ERR, "Ignoring message (type=%s), (op=%s)",		       type, op);		xml_message_debug(stored_msg, "Bad message");			} else if(strcmp(type, XML_ATTR_REQUEST) == 0){		if(strcmp(op, "vote") == 0) {			next_input = I_ELECTION;						} else if(strcmp(op, "beat") == 0) {			next_input = I_DC_HEARTBEAT;						} else if(strcmp(op, "welcome") == 0) {			next_input = I_WELCOME;						} else if(strcmp(op, "announce") == 0) {			next_input = I_NODE_JOIN;						} else if(strcmp(op, "store") == 0 && AM_I_DC) {			next_input = I_RELEASE_DC;						} else if(strcmp(op, "store") == 0			  || strcmp(op, "create") == 0			  || strcmp(op, "update") == 0			  || strcmp(op, "delete") == 0			  || strcmp(op, "erase") == 0) {			next_input = I_CIB_UPDATE;						} else if(strcmp(op, "ping") == 0) {			/* eventually do some stuff to figure out			 * if we /are/ ok			 */			xmlNodePtr ping =				createPingAnswerFragment(sys_to, "ok");							xmlNodePtr wrapper = create_reply(stored_msg, ping);			relay_message(wrapper, TRUE);			free_xml(wrapper);						} else {			cl_log(LOG_ERR,			       "Unexpected (request) operation %s", op);		}			} else if(strcmp(type, XML_ATTR_RESPONSE) == 0) {		if(strcmp(op, "welcome") == 0) {			next_input = I_WELCOME;						} else if(strcmp(op, "join_ack") == 0) {			next_input = I_WELCOME_ACK;						} else if(strcmp(op, "create") == 0			  || strcmp(op, "update") == 0			  || strcmp(op, "delete") == 0			  || strcmp(op, "erase") == 0) {			// perhaps we should do somethign with these replies		} else if(strcmp(op, "bump") == 0) {			xmlNodePtr data = find_xml_node(stored_msg,							XML_TAG_FRAGMENT);						send_request(NULL, data, "store",				     NULL, CRM_SYSTEM_CRMD);		} else if (AM_I_DC && strcmp(op, "store") == 0) {			/* if there was any result, we need to merge it back			 * into our (the DC) copy of the CIB			 */			xmlNodePtr data = find_xml_node(stored_msg,							XML_TAG_FRAGMENT);			if(data != NULL) {				send_request(NULL, data, "update",					     NULL, CRM_SYSTEM_CIB);				send_request(NULL, NULL, "bump",					     NULL, CRM_SYSTEM_CIB);			}		} else if(strcmp(sys_from, CRM_SYSTEM_CIB) == 0		   && strcmp(op, "forward") == 0		   && AM_I_DC) {							/* this is a reply to our earlier command			 * Send it to the relevant node(s)			 */			const char *uname = xmlGetProp(options,						       "forward_to");			xmlNodePtr data = find_xml_node(stored_msg,							XML_TAG_FRAGMENT);			xmlNodePtr local_options =				create_xml_node(NULL, XML_TAG_OPTIONS);			/* If this is part of join request processing,			 * ask for the status section, otherwise just blast			 * it down to them.			 */			if(uname != NULL) {				set_xml_property_copy(local_options,						      XML_ATTR_VERBOSE,						      "true");			}						send_request(local_options, data, "store",				     uname, CRM_SYSTEM_CRMD);						} else {			cl_log(LOG_ERR,			       "Unexpected (response) operation %s", op);		}	} else {		cl_log(LOG_ERR, "Unexpected message type %s", type);				}			return next_input;		}