|
|
@@ -1,4 +1,6 @@
|
|
|
/*
|
|
|
+ * vi: set autoindent tabstop=4 shiftwidth=4 :
|
|
|
+ *
|
|
|
* Copyright (c) 2004 MontaVista Software, Inc.
|
|
|
*
|
|
|
* All rights reserved.
|
|
|
@@ -76,13 +78,9 @@ static int evs_confchg_fn (
|
|
|
struct in_addr *joined_list, int joined_list_entries,
|
|
|
struct memb_ring_id *ring_id);
|
|
|
|
|
|
-static int message_handler_req_exec_mcast (void *message, struct in_addr source_addr, int endian_conversion_required);
|
|
|
-
|
|
|
-static int message_handler_req_evs_init (struct conn_info *conn_info,
|
|
|
- void *message);
|
|
|
+static int evs_init_two_fn (struct conn_info *conn_info);
|
|
|
|
|
|
-static int message_handler_req_lib_activatepoll (struct conn_info *conn_info,
|
|
|
- void *message);
|
|
|
+static int message_handler_req_exec_mcast (void *message, struct in_addr source_addr, int endian_conversion_required);
|
|
|
|
|
|
static int message_handler_req_evs_join (struct conn_info *conn_info, void *message);
|
|
|
static int message_handler_req_evs_leave (struct conn_info *conn_info, void *message);
|
|
|
@@ -94,30 +92,24 @@ static int evs_exit_fn (struct conn_info *conn_info);
|
|
|
struct libais_handler evs_libais_handlers[] =
|
|
|
{
|
|
|
{ /* 0 */
|
|
|
- .libais_handler_fn = message_handler_req_lib_activatepoll,
|
|
|
- .response_size = sizeof (struct res_lib_activatepoll),
|
|
|
- .response_id = MESSAGE_RES_LIB_ACTIVATEPOLL, // TODO RESPONSE
|
|
|
- .flow_control = FLOW_CONTROL_NOT_REQUIRED
|
|
|
- },
|
|
|
- { /* 1 */
|
|
|
.libais_handler_fn = message_handler_req_evs_join,
|
|
|
.response_size = sizeof (struct res_lib_evs_join),
|
|
|
.response_id = MESSAGE_RES_EVS_JOIN,
|
|
|
.flow_control = FLOW_CONTROL_NOT_REQUIRED
|
|
|
},
|
|
|
- { /* 2 */
|
|
|
+ { /* 1 */
|
|
|
.libais_handler_fn = message_handler_req_evs_leave,
|
|
|
.response_size = sizeof (struct res_lib_evs_leave),
|
|
|
.response_id = MESSAGE_RES_EVS_LEAVE,
|
|
|
.flow_control = FLOW_CONTROL_NOT_REQUIRED
|
|
|
},
|
|
|
- { /* 3 */
|
|
|
+ { /* 2 */
|
|
|
.libais_handler_fn = message_handler_req_evs_mcast_joined,
|
|
|
.response_size = sizeof (struct res_lib_evs_mcast_joined),
|
|
|
.response_id = MESSAGE_RES_EVS_MCAST_JOINED,
|
|
|
.flow_control = FLOW_CONTROL_REQUIRED
|
|
|
},
|
|
|
- { /* 4 */
|
|
|
+ { /* 3 */
|
|
|
.libais_handler_fn = message_handler_req_evs_mcast_groups,
|
|
|
.response_size = sizeof (struct res_lib_evs_mcast_groups),
|
|
|
.response_id = MESSAGE_RES_EVS_MCAST_GROUPS,
|
|
|
@@ -135,7 +127,7 @@ struct service_handler evs_service_handler = {
|
|
|
.aisexec_handler_fns = evs_aisexec_handler_fns,
|
|
|
.aisexec_handler_fns_count = sizeof (evs_aisexec_handler_fns) / sizeof (int (*)),
|
|
|
.confchg_fn = evs_confchg_fn,
|
|
|
- .libais_init_fn = message_handler_req_evs_init,
|
|
|
+ .libais_init_two_fn = evs_init_two_fn,
|
|
|
.libais_exit_fn = evs_exit_fn,
|
|
|
.exec_init_fn = evs_executive_initialize,
|
|
|
.exec_dump_fn = 0
|
|
|
@@ -148,6 +140,7 @@ static int evs_executive_initialize (void)
|
|
|
|
|
|
static int evs_exit_fn (struct conn_info *conn_info)
|
|
|
{
|
|
|
+
|
|
|
list_del (&conn_info->conn_list);
|
|
|
return (0);
|
|
|
}
|
|
|
@@ -197,43 +190,12 @@ static int evs_confchg_fn (
|
|
|
return (0);
|
|
|
}
|
|
|
|
|
|
-static int message_handler_req_evs_init (struct conn_info *conn_info, void *message)
|
|
|
+static int evs_init_two_fn (struct conn_info *conn_info)
|
|
|
{
|
|
|
- SaErrorT error = SA_ERR_SECURITY;
|
|
|
- struct res_lib_init res_lib_init;
|
|
|
-
|
|
|
log_printf (LOG_LEVEL_DEBUG, "Got request to initalize evs service.\n");
|
|
|
- if (conn_info->authenticated) {
|
|
|
- conn_info->service = SOCKET_SERVICE_EVS;
|
|
|
- error = SA_OK;
|
|
|
- }
|
|
|
-
|
|
|
- res_lib_init.header.size = sizeof (struct res_lib_init);
|
|
|
- res_lib_init.header.id = MESSAGE_RES_INIT;
|
|
|
- res_lib_init.header.error = error;
|
|
|
-
|
|
|
- libais_send_response (conn_info, &res_lib_init, sizeof (res_lib_init));
|
|
|
-
|
|
|
-
|
|
|
+ list_init (&conn_info->conn_list);
|
|
|
list_add (&conn_info->conn_list, &confchg_notify);
|
|
|
|
|
|
- if (conn_info->authenticated) {
|
|
|
- return (0);
|
|
|
- }
|
|
|
-
|
|
|
- return (-1);
|
|
|
-}
|
|
|
-
|
|
|
-static int message_handler_req_lib_activatepoll (struct conn_info *conn_info, void *message)
|
|
|
-{
|
|
|
- struct res_lib_activatepoll res_lib_activatepoll;
|
|
|
-
|
|
|
- res_lib_activatepoll.header.size = sizeof (struct res_lib_activatepoll);
|
|
|
- res_lib_activatepoll.header.id = MESSAGE_RES_LIB_ACTIVATEPOLL;
|
|
|
- res_lib_activatepoll.header.error = SA_OK;
|
|
|
- libais_send_response (conn_info, &res_lib_activatepoll,
|
|
|
- sizeof (struct res_lib_activatepoll));
|
|
|
-
|
|
|
return (0);
|
|
|
}
|
|
|
|
|
|
@@ -256,20 +218,21 @@ static int message_handler_req_evs_join (struct conn_info *conn_info, void *mess
|
|
|
}
|
|
|
}
|
|
|
#endif
|
|
|
- addr = realloc (conn_info->ais_ci.u.libevs_ci.groups,
|
|
|
+ addr = realloc (conn_info->conn_info_partner->ais_ci.u.libevs_ci.groups,
|
|
|
sizeof (struct evs_group) *
|
|
|
- (conn_info->ais_ci.u.libevs_ci.group_entries + req_lib_evs_join->group_entries));
|
|
|
+ (conn_info->conn_info_partner->ais_ci.u.libevs_ci.group_entries +
|
|
|
+ req_lib_evs_join->group_entries));
|
|
|
if (addr == 0) {
|
|
|
error = SA_ERR_NO_MEMORY;
|
|
|
goto exit_error;
|
|
|
}
|
|
|
- conn_info->ais_ci.u.libevs_ci.groups = addr;
|
|
|
+ conn_info->conn_info_partner->ais_ci.u.libevs_ci.groups = addr;
|
|
|
|
|
|
- memcpy (&conn_info->ais_ci.u.libevs_ci.groups[conn_info->ais_ci.u.libevs_ci.group_entries],
|
|
|
+ memcpy (&conn_info->conn_info_partner->ais_ci.u.libevs_ci.groups[conn_info->conn_info_partner->ais_ci.u.libevs_ci.group_entries],
|
|
|
req_lib_evs_join->groups,
|
|
|
sizeof (struct evs_group) * req_lib_evs_join->group_entries);
|
|
|
|
|
|
- conn_info->ais_ci.u.libevs_ci.group_entries += req_lib_evs_join->group_entries;
|
|
|
+ conn_info->conn_info_partner->ais_ci.u.libevs_ci.group_entries += req_lib_evs_join->group_entries;
|
|
|
|
|
|
exit_error:
|
|
|
res_lib_evs_join.header.size = sizeof (struct res_lib_evs_join);
|
|
|
@@ -293,20 +256,20 @@ static int message_handler_req_evs_leave (struct conn_info *conn_info, void *mes
|
|
|
|
|
|
for (i = 0; i < req_lib_evs_leave->group_entries; i++) {
|
|
|
found = 0;
|
|
|
- for (j = 0; j < conn_info->ais_ci.u.libevs_ci.group_entries;) {
|
|
|
+ for (j = 0; j < conn_info->conn_info_partner->ais_ci.u.libevs_ci.group_entries;) {
|
|
|
if (memcmp (&req_lib_evs_leave->groups[i],
|
|
|
- &conn_info->ais_ci.u.libevs_ci.groups[j],
|
|
|
+ &conn_info->conn_info_partner->ais_ci.u.libevs_ci.groups[j],
|
|
|
sizeof (struct evs_group)) == 0) {
|
|
|
|
|
|
/*
|
|
|
* Delete entry
|
|
|
*/
|
|
|
- memmove (&conn_info->ais_ci.u.libevs_ci.groups[j],
|
|
|
- &conn_info->ais_ci.u.libevs_ci.groups[j + 1],
|
|
|
- (conn_info->ais_ci.u.libevs_ci.group_entries - j - 1) *
|
|
|
+ memmove (&conn_info->conn_info_partner->ais_ci.u.libevs_ci.groups[j],
|
|
|
+ &conn_info->conn_info_partner->ais_ci.u.libevs_ci.groups[j + 1],
|
|
|
+ (conn_info->conn_info_partner->ais_ci.u.libevs_ci.group_entries - j - 1) *
|
|
|
sizeof (struct evs_group));
|
|
|
|
|
|
- conn_info->ais_ci.u.libevs_ci.group_entries -= 1;
|
|
|
+ conn_info->conn_info_partner->ais_ci.u.libevs_ci.group_entries -= 1;
|
|
|
|
|
|
found = 1;
|
|
|
break;
|
|
|
@@ -322,9 +285,9 @@ static int message_handler_req_evs_leave (struct conn_info *conn_info, void *mes
|
|
|
}
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
- for (i = 0; i < conn_info->ais_ci.u.libevs_ci.group_entries; i++) {
|
|
|
+ for (i = 0; i < conn_info->conn_info_partner->ais_ci.u.libevs_ci.group_entries; i++) {
|
|
|
printf ("Groups Left %s\n",
|
|
|
- &conn_info->ais_ci.u.libevs_ci.groups[i].key);
|
|
|
+ &conn_info->conn_info_partner->ais_ci.u.libevs_ci.groups[i].key);
|
|
|
}
|
|
|
#endif
|
|
|
res_lib_evs_leave.header.size = sizeof (struct res_lib_evs_leave);
|
|
|
@@ -350,12 +313,12 @@ static int message_handler_req_evs_mcast_joined (struct conn_info *conn_info, vo
|
|
|
req_exec_evs_mcast.header.size = sizeof (struct req_exec_evs_mcast);
|
|
|
req_exec_evs_mcast.header.id = MESSAGE_REQ_EXEC_EVS_MCAST;
|
|
|
req_exec_evs_mcast.msg_len = req_lib_evs_mcast_joined->msg_len;
|
|
|
- req_exec_evs_mcast.group_entries = conn_info->ais_ci.u.libevs_ci.group_entries;
|
|
|
+ req_exec_evs_mcast.group_entries = conn_info->conn_info_partner->ais_ci.u.libevs_ci.group_entries;
|
|
|
|
|
|
req_exec_evs_mcast_iovec[0].iov_base = &req_exec_evs_mcast;
|
|
|
req_exec_evs_mcast_iovec[0].iov_len = sizeof (req_exec_evs_mcast);
|
|
|
- req_exec_evs_mcast_iovec[1].iov_base = conn_info->ais_ci.u.libevs_ci.groups;
|
|
|
- req_exec_evs_mcast_iovec[1].iov_len = conn_info->ais_ci.u.libevs_ci.group_entries * sizeof (struct evs_group);
|
|
|
+ req_exec_evs_mcast_iovec[1].iov_base = conn_info->conn_info_partner->ais_ci.u.libevs_ci.groups;
|
|
|
+ req_exec_evs_mcast_iovec[1].iov_len = conn_info->conn_info_partner->ais_ci.u.libevs_ci.group_entries * sizeof (struct evs_group);
|
|
|
req_exec_evs_mcast_iovec[2].iov_base = &req_lib_evs_mcast_joined->msg;
|
|
|
req_exec_evs_mcast_iovec[2].iov_len = req_lib_evs_mcast_joined->msg_len;
|
|
|
// TODO this doesn't seem to work for some reason
|