xmlNodePtr response = NULL;
crm_dc_process_message(xmlNodePtr whole_message,		       xmlNodePtr action,		       const char *host_from,		       const char *sys_from,		       const char *sys_to,		       const char *op,		       gboolean dc_mode){	FNIN();	gboolean processing_complete = FALSE;	xmlNodePtr wrapper = NULL, ping = NULL;    	if (dc_mode)	{		CRM_DEBUG("Processing DC specific actions");	    		// DC specific actions		if (strcmp("cib_op", op) == 0)		{			xmlNodePtr cib_req =				find_xml_node(action, XML_REQ_TAG_CIB);	    			wrapper = create_forward(whole_message,						 cib_req,						 "cib");			relay_message(wrapper, TRUE, host_from);			processing_complete = TRUE;			free_xml(wrapper);		}			CRM_DEBUG("Finished processing DC specific actions");	}    	if (processing_complete == FALSE)	{		CRM_DEBUG("Processing common DC/CRMd actions");			xmlNodePtr response = NULL;		if (strcmp("ping", op) == 0)		{			// eventually do some stuff to figure out if we *are* ok			ping = createPingAnswerFragment(sys_to, "ok");			if (dc_mode)				response = create_xml_node(NULL,							   XML_RESP_TAG_DC);			else response = create_xml_node(NULL,							XML_RESP_TAG_CRM);			xmlAddChild(response, ping);	    			wrapper = create_reply(whole_message, response);			relay_message(wrapper, TRUE, host_from);			processing_complete = TRUE;			free_xml(wrapper);		}		else if (strcmp("ping_deep", op) == 0)		{			// eventually do some stuff to figure out if we *are* ok			ping = createPingAnswerFragment(sys_to, "ok");			if (dc_mode)				response = create_xml_node(NULL,							   XML_RESP_TAG_DC);			else				response = create_xml_node(NULL,							   XML_RESP_TAG_CRM);			xmlAddChild(response, ping);	    			wrapper = create_reply(whole_message, response);			relay_message(wrapper, TRUE, host_from);			free_xml(wrapper);			/* Now pass the ping request on to all subsystems for them			 *  to reply to individually.			 *			 * Basically this means we are pushing the complexity back			 *  on to the client.  Therefore it is the client that must			 *  decide, based on the results it recieves, if all			 *  subsystems are alive.			 *			 * ... Unless we choose another method, other than IPC 			 *  message/response, of pinging locally.			 */			wrapper = create_forward(whole_message,						 action,						 CRM_SYSTEM_CIB);			relay_message(wrapper, TRUE, host_from);			free_xml(wrapper);			wrapper =				create_forward(whole_message,					       action,					       CRM_SYSTEM_LRMD);			relay_message(wrapper, TRUE, host_from);			free_xml(wrapper);			wrapper =				create_forward(whole_message,					       action,					       CRM_SYSTEM_PENGINE);			relay_message(wrapper, TRUE, host_from);			free_xml(wrapper);			wrapper =				create_forward(whole_message, action, CRM_SYSTEM_TENGINE);			relay_message(wrapper, TRUE, host_from);			free_xml(wrapper);			processing_complete = TRUE;		} else {                        // else we dont know anything about it			cl_log(LOG_ERR,			       "The specified operation (%s) is not (yet?) supported\n",			       op);		}			CRM_DEBUG("Finished processing common DC/CRMd actions");	}	FNRET(processing_complete);}