Patch from Patrick to enable configuring the list of dynamic service handlers

in the configuration file.


git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@915 fd59a12c-fef9-0310-b244-a6a79926bd2f
This commit is contained in:
Steven Dake 2006-02-01 23:46:44 +00:00
parent 43a36162b3
commit e2d327e599
4 changed files with 158 additions and 83 deletions

View File

@ -70,6 +70,7 @@ struct openais_service_handler {
int lib_handlers_count;
struct openais_exec_handler *exec_handlers;
int (*exec_init_fn) (struct openais_config *);
int (*config_init_fn) (struct openais_config *);
void (*exec_dump_fn) (void);
int exec_handlers_count;
void (*confchg_fn) (

View File

@ -90,72 +90,6 @@
int ais_uid = 0;
int gid_valid = 0;
/*
* All service handlers in the AIS
*/
#ifdef BUILD_DYNAMIC
struct dynamic_service {
char *name;
unsigned int ver;
unsigned int handle;
struct openais_service_handler_iface_ver0 *iface_ver0;
};
/*
* Still need to know the name of the service interface and version number
*/
struct dynamic_service dynamic_services[128] = {
{
.name = "openais_evs",
.ver = 0,
.handle = 0,
.iface_ver0 = NULL
},
{
.name = "openais_clm",
.ver = 0,
.handle = 0,
.iface_ver0 = NULL
},
{
.name = "openais_amf",
.ver = 0,
.handle = 0,
.iface_ver0 = NULL
},
{
.name = "openais_ckpt",
.ver = 0,
.handle = 0,
.iface_ver0 = NULL
},
{
.name = "openais_evt",
.ver = 0,
.handle = 0,
.iface_ver0 = NULL
},
{
.name = "openais_lck",
.ver = 0,
.handle = 0,
.iface_ver0 = NULL
},
{
.name = "openais_msg",
.ver = 0,
.handle = 0,
.iface_ver0 = NULL
},
{
.name = "openais_cfg",
.ver = 0,
.handle = 0,
.iface_ver0 = NULL
}
};
#endif /* BUILD_DYNAMIC */
static struct openais_service_handler *ais_service_handlers[32];
static unsigned int service_handlers_count = 32;
@ -214,6 +148,7 @@ enum e_ais_done {
AIS_DONE_MAINCONFIGREAD = -9,
AIS_DONE_LOGSETUP = -10,
AIS_DONE_AMFCONFIGREAD = -11,
AIS_DONE_DYNAMICLOAD = -12,
};
extern int openais_amf_config_read (char **error_string);
@ -1180,10 +1115,22 @@ int service_handler_register (
assert (ais_service_handlers[handler->id] == NULL);
log_printf (LOG_LEVEL_NOTICE, "Registering service handler '%s'\n", handler->name);
ais_service_handlers[handler->id] = handler;
if (ais_service_handlers[handler->id]->config_init_fn) {
res = ais_service_handlers[handler->id]->config_init_fn (config);
}
return (res);
}
int service_handler_init (
struct openais_service_handler *handler,
struct openais_config *config)
{
int res = 0;
assert (ais_service_handlers[handler->id] != NULL);
log_printf (LOG_LEVEL_NOTICE, "Initialising service handler '%s'\n", handler->name);
if (ais_service_handlers[handler->id]->exec_init_fn) {
res = ais_service_handlers[handler->id]->exec_init_fn (config);
}
return (res);
}
@ -1192,16 +1139,20 @@ void default_services_register (struct openais_config *openais_config)
#ifdef BUILD_DYNAMIC
int i;
for (i = 0; i < 8; i++) {
for (i = 0; i < openais_config->num_dynamic_services; i++) {
lcr_ifact_reference (
&dynamic_services[i].handle,
dynamic_services[i].name,
dynamic_services[i].ver,
(void **)&dynamic_services[i].iface_ver0,
&openais_config->dynamic_services[i].handle,
openais_config->dynamic_services[i].name,
openais_config->dynamic_services[i].ver,
(void **)&openais_config->dynamic_services[i].iface_ver0,
(void *)0);
if (!openais_config->dynamic_services[i].iface_ver0) {
log_printf(LOG_LEVEL_ERROR, "AIS Component %s did not load.\n", openais_config->dynamic_services[i].name);
ais_done(AIS_DONE_DYNAMICLOAD);
}
service_handler_register (
dynamic_services[i].iface_ver0->openais_get_service_handler_ver0(),
openais_config->dynamic_services[i].iface_ver0->openais_get_service_handler_ver0(),
openais_config);
}
@ -1221,6 +1172,32 @@ void default_services_register (struct openais_config *openais_config)
#endif /* BUILD_DYNAMIC */
}
void default_services_init (struct openais_config *openais_config)
{
#ifdef BUILD_DYNAMIC
int i;
for (i = 0; i < openais_config->num_dynamic_services; i++) {
service_handler_init (openais_config->dynamic_services[i].iface_ver0->openais_get_service_handler_ver0(),
openais_config);
}
#else /* NOT BUILD_DYNAMIC */
/*
* link everything together - better for debugging - smaller memory footprint
*/
service_handler_init (&evs_service_handler, openais_config);
service_handler_init (&clm_service_handler, openais_config);
service_handler_init (&amf_service_handler, openais_config);
service_handler_init (&ckpt_service_handler, openais_config);
service_handler_init (&evt_service_handler, openais_config);
service_handler_init (&lck_service_handler, openais_config);
service_handler_init (&msg_service_handler, openais_config);
service_handler_init (&cfg_service_handler, openais_config);
#endif /* BUILD_DYNAMIC */
}
int main (int argc, char **argv)
{
int libais_server_fd;
@ -1260,12 +1237,14 @@ int main (int argc, char **argv)
log_printf (LOG_LEVEL_ERROR, error_string);
ais_done (AIS_DONE_AMFCONFIGREAD);
}
res = totem_config_read (&openais_config.totem_config, &error_string, 1);
if (res == -1) {
log_printf (LOG_LEVEL_NOTICE, "AIS Executive Service: Copyright (C) 2002-2004 MontaVista Software, Inc and contributors.\n");
log_printf (LOG_LEVEL_ERROR, error_string);
ais_done (AIS_DONE_MAINCONFIGREAD);
if (!openais_config.totem_config.interface_count) {
res = totem_config_read (&openais_config.totem_config, &error_string, 1);
if (res == -1) {
log_printf (LOG_LEVEL_NOTICE, "AIS Executive Service: Copyright (C) 2002-2004 MontaVista Software, Inc and contributors.\n");
log_printf (LOG_LEVEL_ERROR, error_string);
ais_done (AIS_DONE_MAINCONFIGREAD);
}
}
res = totem_config_keyread ("/etc/ais/authkey", &openais_config.totem_config, &error_string);
@ -1306,6 +1285,8 @@ int main (int argc, char **argv)
openais_config.totem_config.totem_logging_configuration.log_level_debug = mklog (LOG_LEVEL_DEBUG, LOG_SERVICE_GMI);
openais_config.totem_config.totem_logging_configuration.log_printf = internal_log_printf;
default_services_register(&openais_config);
totempg_initialize (
aisexec_poll_handle,
&openais_config.totem_config);
@ -1322,7 +1303,7 @@ int main (int argc, char **argv)
this_ip = &openais_config.totem_config.interfaces[0].boundto;
default_services_register(&openais_config);
default_services_init(&openais_config);
sync_register (openais_sync_callbacks_retrieve, openais_sync_completed);

View File

@ -56,7 +56,8 @@ typedef enum {
MAIN_HEAD,
MAIN_LOGGING,
MAIN_EVENT,
MAIN_AMF
MAIN_AMF,
MAIN_COMPONENTS
} main_parse_t;
char *strstr_rs (const char *haystack, const char *needle)
@ -87,6 +88,55 @@ char *strstr_rs (const char *haystack, const char *needle)
return (end_address);
}
#ifdef BUILD_DYNAMIC
static void set_default_services(struct openais_config *config)
{
config->dynamic_services[0].name = "openais_evs";
config->dynamic_services[0].ver = 0;
config->dynamic_services[1].name = "openais_clm";
config->dynamic_services[1].ver = 0;
config->dynamic_services[2].name = "openais_amf";
config->dynamic_services[2].ver = 0;
config->dynamic_services[3].name = "openais_ckpt";
config->dynamic_services[3].ver = 0;
config->dynamic_services[4].name = "openais_evt";
config->dynamic_services[4].ver = 0;
config->dynamic_services[5].name = "openais_lck";
config->dynamic_services[5].ver = 0;
config->dynamic_services[6].name = "openais_msg";
config->dynamic_services[6].ver = 0;
config->dynamic_services[7].name = "openais_cfg";
config->dynamic_services[7].ver = 0;
config->num_dynamic_services = 8;
}
/* Returns an allocated string */
static char *get_component(const char *line, int *version)
{
char *start_address;
char *end_address;
char *newline;
char *compname;
newline = strdup(line);
start_address = newline + strspn(newline, " \t");
end_address = start_address + strcspn(start_address, " \t:");
*end_address = '\0';
compname = strdup(start_address);
/* Now get version */
start_address = end_address+1;
start_address = start_address + strspn(start_address, " \t:");
*version = atoi(start_address);
free(newline);
return compname;
}
#endif
extern int openais_main_config_read (char **error_string,
struct openais_config *openais_config,
int interface_max)
@ -97,6 +147,7 @@ extern int openais_main_config_read (char **error_string,
int logging_parsed = 0;
int event_parsed = 0;
int amf_parsed = 0;
int components_parsed = 0;
char *loc;
int i;
int parse_done = 0;
@ -147,6 +198,10 @@ extern int openais_main_config_read (char **error_string,
if (amf_parsed == 0 && strstr_rs (line, "amf{")) {
amf_parsed = 1;
parse = MAIN_AMF;
} else
if (components_parsed == 0 && strstr_rs (line, "components{")) {
components_parsed = 1;
parse = MAIN_COMPONENTS;
} else {
continue;
}
@ -225,10 +280,25 @@ extern int openais_main_config_read (char **error_string,
goto parse_error;
}
break;
case MAIN_COMPONENTS:
if ((loc = strstr_rs (line, "}"))) {
parse = MAIN_HEAD;
}
#ifdef BUILD_DYNAMIC
else {
int version;
char *name = get_component(line, &version);
if (name) {
openais_config->dynamic_services[openais_config->num_dynamic_services].name = name;
openais_config->dynamic_services[openais_config->num_dynamic_services].ver = version;
openais_config->num_dynamic_services++;
}
}
#endif
break;
default:
assert (0 == 1); /* SHOULDN'T HAPPEN */
break;
break;
}
}
@ -237,6 +307,12 @@ extern int openais_main_config_read (char **error_string,
goto parse_error;
}
#ifdef BUILD_DYNAMIC
/* Load default services if the config file doesn't specify */
if (!openais_config->num_dynamic_services) {
set_default_services(openais_config);
}
#endif
if (parse == MAIN_HEAD) {
fclose (fp);
return (0);

View File

@ -41,6 +41,19 @@
#ifndef MAINCONFIG_H_DEFINED
#define MAINCONFIG_H_DEFINED
/*
* All service handlers in the AIS
*/
#ifdef BUILD_DYNAMIC
struct dynamic_service {
char *name;
unsigned int ver;
unsigned int handle;
struct openais_service_handler_iface_ver0 *iface_ver0;
};
#define MAX_DYNAMIC_SERVICES 128
#endif
struct openais_config {
/*
* logging
@ -60,6 +73,10 @@ struct openais_config {
unsigned int amf_enabled;
struct totem_config totem_config;
#ifdef BUILD_DYNAMIC
struct dynamic_service dynamic_services[MAX_DYNAMIC_SERVICES];
int num_dynamic_services;
#endif
};
extern char *strstr_rs (const char *haystack, const char *needle);