const char *op = get_xml_attr (msg, XML_TAG_OPTIONS, XML_ATTR_OP, FALSE);
xmlNodePtr graph = NULL;
process_te_message(xmlNodePtr msg, IPC_Channel *sender){	const char *op = get_xml_attr (msg, XML_TAG_OPTIONS,				       XML_ATTR_OP, FALSE);	const char *sys_to = xmlGetProp(msg, XML_ATTR_SYSTO);	const char *ref    = xmlGetProp(msg, XML_ATTR_REFERENCE);	xmlNodePtr graph = NULL;	crm_debug("Recieved %s (%s) message", op, ref);	#ifdef MSG_LOG	struct stat buf;	if(stat(DEVEL_DIR, &buf) != 0) {		cl_perror("Stat of %s failed... exiting", DEVEL_DIR);		exit(100);	}		if(msg_te_strm == NULL) {		msg_te_strm = fopen(DEVEL_DIR"/te.log", "w");	}	char *xml = dump_xml_formatted(msg);	fprintf(msg_te_strm, "[Input %s]\t%s\n",		op, xml);	fflush(msg_te_strm);	crm_free(xml);#endif	if(safe_str_eq(xmlGetProp(msg, XML_ATTR_MSGTYPE), XML_ATTR_RESPONSE)	   && safe_str_neq(op, CRM_OP_EVENTCC)) {#ifdef MSG_LOG	fprintf(msg_te_strm, "[Result ]\tDiscarded\n");	fflush(msg_te_strm);#endif		crm_info("Message was a response not a request.  Discarding");		return TRUE;	}	crm_debug("Processing %s (%s) message", op, ref);		if(op == NULL){		/* error */	} else if(strcmp(op, CRM_OP_HELLO) == 0) {		/* ignore */	} else if(sys_to == NULL || strcmp(sys_to, CRM_SYSTEM_TENGINE) != 0) {		crm_verbose("Bad sys-to %s", sys_to);		return FALSE;			} else if(strcmp(op, CRM_OP_TRANSITION) == 0) {		crm_trace("Initializing graph...");		initialize_graph();		graph = find_xml_node(msg, "transition_graph");		crm_trace("Unpacking graph...");		unpack_graph(graph);		crm_trace("Initiating transition...");		in_transition = TRUE;		if(initiate_transition() == FALSE) {			/* nothing to be done.. means we're done. */			crm_info("No actions to be taken..."			       " transition compelte.");		}		crm_trace("Processing complete...");			} else if(strcmp(op, CRM_OP_ABORT) == 0) {		initialize_graph();	} else if(strcmp(op, CRM_OP_QUIT) == 0) {		crm_err("Received quit message, terminating");		exit(0);			} else if(in_transition == FALSE) {		crm_info("Received event_cc while not in a transition..."			 "  Poking the Policy Engine");		send_abort("Initiate a transition", NULL);			} else if(strcmp(op, CRM_OP_EVENTCC) == 0) {		const char *true_op = get_xml_attr (msg, XML_TAG_OPTIONS,						    XML_ATTR_TRUEOP, TRUE);		crm_trace("Processing %s...", CRM_OP_EVENTCC);		if(true_op == NULL) {			crm_err(			       "Illegal update,"			       " the original operation must be specified");			send_abort("Illegal update", msg);					} else if(strcmp(true_op, CRM_OP_CREATE) == 0		   || strcmp(true_op, CRM_OP_DELETE) == 0		   || strcmp(true_op, CRM_OP_REPLACE) == 0		   || strcmp(true_op, CRM_OP_WELCOME) == 0		   || strcmp(true_op, CRM_OP_SHUTDOWN_REQ) == 0		   || strcmp(true_op, CRM_OP_ERASE) == 0) {			/* these are always unexpected, trigger the PE */			send_abort("Config update", msg);					} else if(strcmp(true_op, CRM_OP_UPDATE) == 0) {			/* this may not be un-expected *///			if(			extract_event(msg);			//== FALSE){//				send_abort(msg);//			}					} else {			crm_err(			       "Did not expect copy of action %s", op);		}			}	crm_debug("finished processing message");	print_state(FALSE);		return TRUE;}