Page Menu
Home
ClusterLabs Projects
Search
Configure Global Search
Log In
Files
F7632482
msg.c
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
9 KB
Referenced Files
None
Subscribers
None
msg.c
View Options
/* $Id: msg.c,v 1.9 2006/07/06 09:30:27 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 <portability.h>
#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);
crm_xml_add(ping, XML_PING_ATTR_STATUS, status);
crm_xml_add(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 && strcasecmp(to, true_sys) != 0) {
crm_debug_3("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 && strcasecmp(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_debug_3(
"XML is valid and node with message type (%s) found.",
type);
crm_debug_3("Returning node (%s)", crm_element_name(action));
*/
return action;
}
void
send_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);
crm_xml_add(hello_node, "major_version", major_version);
crm_xml_add(hello_node, "minor_version", minor_version);
crm_xml_add(hello_node, "client_name", client_name);
crm_xml_add(hello_node, "client_uuid", uuid);
crm_debug_4("creating hello message");
hello = create_request(
CRM_OP_HELLO, hello_node, NULL, NULL, client_name, uuid);
send_ipc_message(ipc_client, hello);
crm_debug_4("hello message sent");
free_xml(hello_node);
crm_msg_del(hello);
}
gboolean
process_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_debug_3("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_FEATURE_SET);
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");
CRM_ASSERT(type != NULL);
return NULL;
#if 0
} else if (strcasecmp(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_FEATURE_SET);
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
*/
gboolean
send_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);
crm_msg_del(reply);
}
return was_sent;
}
ha_msg_input_t *
new_ha_msg_input(const HA_Message *orig)
{
ha_msg_input_t *input_copy = NULL;
crm_malloc0(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_malloc0(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;
}
void
delete_ha_msg_input(ha_msg_input_t *orig)
{
if(orig == NULL) {
return;
}
crm_msg_del(orig->msg);
free_xml(orig->xml);
crm_free(orig);
}
File Metadata
Details
Attached
Mime Type
text/x-c
Expires
Thu, Oct 16, 3:27 PM (6 h, 57 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2536558
Default Alt Text
msg.c (9 KB)
Attached To
Mode
rP Pacemaker
Attached
Detach File
Event Timeline
Log In to Comment