⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msg.c

📁 linux集群服务器软件代码包
💻 C
字号:
/* $Id: msg.c,v 1.15 2005/02/19 18:11:03 andrew Exp $ *//*  * Copyright (C) 2004 Andrew Beekhof <andrew@beekhof.net> *  * 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 */#include <sys/param.h>#include <stdio.h>#include <sys/types.h>#include <unistd.h>#include <string.h>#include <stdlib.h>#include <clplumbing/cl_log.h>#include <ha_msg.h>#include <time.h> #include <crm/crm.h>#include <crm/msg_xml.h>#include <crm/common/msg.h>#include <crm/common/ipc.h>#include <crm/dmalloc_wrapper.h>HA_Message *create_common_message(	HA_Message *original_request, crm_data_t *xml_response_data);crm_data_t*createPingAnswerFragment(const char *from, const char *status){	crm_data_t *ping = NULL;			ping = create_xml_node(NULL, XML_CRM_TAG_PING);		set_xml_property_copy(ping, XML_PING_ATTR_STATUS, status);	set_xml_property_copy(ping, XML_PING_ATTR_SYSFROM, from);	return ping;}HA_Message *validate_crm_message(	HA_Message *msg, const char *sys, const char *uuid, const char *msg_type){	const char *from = NULL;	const char *to = NULL;	const char *type = NULL;	const char *crm_msg_reference = NULL;	HA_Message *action = NULL;	const char *true_sys;			if (msg == NULL) {		return NULL;	}	from = cl_get_string(msg, F_CRM_SYS_FROM);	to   = cl_get_string(msg, F_CRM_SYS_TO);	type = cl_get_string(msg, F_CRM_MSG_TYPE);		crm_msg_reference = cl_get_string(msg, XML_ATTR_REFERENCE);	action = msg;	true_sys = sys;	if (uuid != NULL) { true_sys = generate_hash_key(sys, uuid); }	if (to == NULL) {		crm_info("No sub-system defined.");		action = NULL;	} else if (true_sys != NULL && strcmp(to, true_sys) != 0) {		crm_devel("The message is not for this sub-system (%s != %s).",			  to, true_sys);		action = NULL;	}    	if (type == NULL) {		crm_info("No message type defined.");		return NULL;	} else if (msg_type != NULL && strcmp(msg_type, type) != 0) {		crm_info("Expecting a (%s) message but received a (%s).",		       msg_type, type);		action = NULL;	}	if (crm_msg_reference == NULL) {		crm_info("No message crm_msg_reference defined.");		action = NULL;	}/* 	if(action != NULL) 		crm_devel(		       "XML is valid and node with message type (%s) found.",		       type);	crm_devel("Returning node (%s)", xmlGetNodePath(action));*/		return action;}voidsend_hello_message(IPC_Channel *ipc_client,		   const char *uuid,		   const char *client_name,		   const char *major_version,		   const char *minor_version){	crm_data_t *hello_node = NULL;	HA_Message *hello = NULL;	if (uuid == NULL || strlen(uuid) == 0	    || client_name == NULL || strlen(client_name) == 0	    || major_version == NULL || strlen(major_version) == 0	    || minor_version == NULL || strlen(minor_version) == 0) {		crm_err("Missing fields, Hello message will not be valid.");		return;	}	hello_node = create_xml_node(NULL, XML_TAG_OPTIONS);	set_xml_property_copy(hello_node, "major_version", major_version);	set_xml_property_copy(hello_node, "minor_version", minor_version);	set_xml_property_copy(hello_node, "client_name",   client_name);	set_xml_property_copy(hello_node, "client_uuid",   uuid);	crm_trace("creating hello message");	hello = create_request(		CRM_OP_HELLO, hello_node, NULL, NULL, client_name, uuid);	send_ipc_message(ipc_client, hello);	crm_trace("hello message sent");		free_xml(hello_node);}gbooleanprocess_hello_message(crm_data_t *hello,		      char **uuid,		      char **client_name,		      char **major_version,		      char **minor_version){	const char *local_uuid;	const char *local_client_name;	const char *local_major_version;	const char *local_minor_version;	*uuid = NULL;	*client_name = NULL;	*major_version = NULL;	*minor_version = NULL;	if(hello == NULL) {		return FALSE;	}		local_uuid = crm_element_value(hello, "client_uuid");	local_client_name = crm_element_value(hello, "client_name");	local_major_version = crm_element_value(hello, "major_version");	local_minor_version = crm_element_value(hello, "minor_version");	if (local_uuid == NULL || strlen(local_uuid) == 0) {		crm_err("Hello message was not valid (field %s not found)",		       "uuid");		return FALSE;	} else if (local_client_name==NULL || strlen(local_client_name)==0){		crm_err("Hello message was not valid (field %s not found)",			"client name");		return FALSE;	} else if(local_major_version == NULL		  || strlen(local_major_version) == 0){		crm_err("Hello message was not valid (field %s not found)",			"major version");		return FALSE;	} else if (local_minor_version == NULL		   || strlen(local_minor_version) == 0){		crm_err("Hello message was not valid (field %s not found)",			"minor version");		return FALSE;	}    	*uuid          = crm_strdup(local_uuid);	*client_name   = crm_strdup(local_client_name);	*major_version = crm_strdup(local_major_version);	*minor_version = crm_strdup(local_minor_version);	crm_devel("Hello message ok");	return TRUE;}HA_Message *create_request_adv(const char *task, crm_data_t *msg_data,		   const char *host_to,  const char *sys_to,		   const char *sys_from, const char *uuid_from,		   const char *origin){	char *true_from = NULL;	HA_Message *request = NULL;	char *reference = generateReference(task, sys_from);	if (uuid_from != NULL) {		true_from = generate_hash_key(sys_from, uuid_from);	} else if(sys_from != NULL) {		true_from = crm_strdup(sys_from);	} else {		crm_err("No sys from specified");	}		/* host_from will get set for us if necessary by CRMd when routed */	request = ha_msg_new(11);	ha_msg_add(request, F_CRM_ORIGIN,	origin);	ha_msg_add(request, F_TYPE,		T_CRM);	ha_msg_add(request, F_CRM_VERSION,	CRM_VERSION);	ha_msg_add(request, F_CRM_MSG_TYPE,     XML_ATTR_REQUEST);	ha_msg_add(request, XML_ATTR_REFERENCE, reference);	ha_msg_add(request, F_CRM_TASK,		task);	ha_msg_add(request, F_CRM_SYS_TO,       sys_to);	ha_msg_add(request, F_CRM_SYS_FROM,     true_from);	/* HOSTTO will be ignored if it is to the DC anyway. */	if(host_to != NULL && strlen(host_to) > 0) {		ha_msg_add(request, F_CRM_HOST_TO,  host_to);	}	if (msg_data != NULL) {		add_message_xml(request, F_CRM_DATA, msg_data);	}	crm_free(reference);	crm_free(true_from);		return request;}/* * This method adds a copy of xml_response_data */HA_Message *create_reply_adv(HA_Message *original_request,		 crm_data_t *xml_response_data, const char *origin){	HA_Message *reply = NULL;	const char *host_from= cl_get_string(original_request, F_CRM_HOST_FROM);	const char *sys_from = cl_get_string(original_request, F_CRM_SYS_FROM);	const char *sys_to   = cl_get_string(original_request, F_CRM_SYS_TO);	const char *type     = cl_get_string(original_request, F_CRM_MSG_TYPE);	const char *operation= cl_get_string(original_request, F_CRM_TASK);	const char *crm_msg_reference = cl_get_string(		original_request, XML_ATTR_REFERENCE);		if (type == NULL) {		crm_err("Cannot create new_message,"			" no message type in original message");		return NULL;#if 0	} else if (strcmp(XML_ATTR_REQUEST, type) != 0) {		crm_err("Cannot create new_message,"			" original message was not a request");		return NULL;#endif	}	reply = ha_msg_new(10);	ha_msg_add(reply, F_CRM_ORIGIN,		origin);	ha_msg_add(reply, F_TYPE,		T_CRM);	ha_msg_add(reply, F_CRM_VERSION,	CRM_VERSION);	ha_msg_add(reply, F_CRM_MSG_TYPE,	XML_ATTR_RESPONSE);	ha_msg_add(reply, XML_ATTR_REFERENCE,	crm_msg_reference);	ha_msg_add(reply, F_CRM_TASK,		operation);	/* since this is a reply, we reverse the from and to */	ha_msg_add(reply, F_CRM_SYS_TO,		sys_from);	ha_msg_add(reply, F_CRM_SYS_FROM,	sys_to);		/* HOSTTO will be ignored if it is to the DC anyway. */	if(host_from != NULL && strlen(host_from) > 0) {		ha_msg_add(reply, F_CRM_HOST_TO, host_from);	}	if (xml_response_data != NULL) {		add_message_xml(reply, F_CRM_DATA, xml_response_data);	}	return reply;}/* * This method adds a copy of xml_response_data */gbooleansend_ipc_reply(IPC_Channel *ipc_channel,	       HA_Message *request, crm_data_t *xml_response_data){	gboolean was_sent = FALSE;	HA_Message *reply = NULL;	reply = create_reply(request, xml_response_data);	if (reply != NULL) {		was_sent = send_ipc_message(ipc_channel, reply);	}	return was_sent;}ha_msg_input_t *new_ha_msg_input(const HA_Message *orig) {	ha_msg_input_t *input_copy = NULL;	crm_malloc(input_copy, sizeof(ha_msg_input_t));	input_copy->msg = ha_msg_copy(orig);	input_copy->xml = get_message_xml(input_copy->msg, F_CRM_DATA);	return input_copy;}ha_msg_input_t *new_ipc_msg_input(IPC_Message *orig) {	ha_msg_input_t *input_copy = NULL;		crm_malloc(input_copy, sizeof(ha_msg_input_t));	input_copy->msg = ipcmsg2hamsg(orig);	input_copy->xml = get_message_xml(input_copy->msg, F_CRM_DATA);	return input_copy;}voiddelete_ha_msg_input(ha_msg_input_t *orig) {	if(orig == NULL) {		return;	} 	crm_msg_del(orig->msg);	free_xml(orig->xml);	crm_free(orig);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -