diff --git a/Makefile.am b/Makefile.am index eb8b8755..fae829f7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -71,7 +71,7 @@ corosysxmlxsltdir = ${datadir}/corosync corosysxmlxslt_DATA = conf/xml2conf.xsl endif -SUBDIRS = include lcr lib exec services tools test cts pkgconfig \ +SUBDIRS = include lcr lib exec tools test cts pkgconfig \ man init conf coverity: @@ -104,7 +104,7 @@ test_lense.sh: endif lint: - for dir in lcr lib exec services tools test; do make -C $$dir lint; done + for dir in lcr lib exec tools test; do make -C $$dir lint; done .PHONY: doxygen doxygen: diff --git a/configure.ac b/configure.ac index e7ca328c..6226f2be 100644 --- a/configure.ac +++ b/configure.ac @@ -134,7 +134,6 @@ AC_CONFIG_FILES([Makefile lib/Makefile man/Makefile pkgconfig/Makefile - services/Makefile test/Makefile cts/Makefile cts/agents/Makefile diff --git a/exec/Makefile.am b/exec/Makefile.am index a0ca646e..0bb3a644 100644 --- a/exec/Makefile.am +++ b/exec/Makefile.am @@ -42,25 +42,22 @@ if BUILD_RDMA TOTEM_SRC += totemiba.c endif -LCRSO_SRC = vsf_ykd.c coroparse.c vsf_quorum.c -LCRSO_OBJS = $(LCRSO_SRC:%.c=%.o) -LCRSO = $(LCRSO_SRC:%.c=%.lcrso) - lib_LIBRARIES = libtotem_pg.a sbin_PROGRAMS = corosync libtotem_pg_a_SOURCES = $(TOTEM_SRC) -corosync_SOURCES = main.c ipc_glue.c util.c sync.c apidef.c service.c \ - timer.c totemconfig.c mainconfig.c quorum.c schedwrk.c \ - ../lcr/lcr_ifact.c evil.c syncv2.c logsys.c icmap.c +corosync_SOURCES = evil.c vsf_ykd.c coroparse.c vsf_quorum.c syncv2.c \ + logsys.c cfg.c cmap.c cpg.c evs.c mon.c pload.c \ + votequorum.c wd.c util.c schedwrk.c main.c \ + apidef.c quorum.c sync.c icmap.c timer.c \ + ipc_glue.c service.c mainconfig.c totemconfig.c corosync_LDADD = -ltotem_pg $(LIBQB_LIBS) $(statgrab_LIBS) corosync_DEPENDENCIES = libtotem_pg.so.$(SONAME) corosync_LDFLAGS = $(OS_DYFLAGS) -L./ TOTEM_OBJS = $(TOTEM_SRC:%.c=%.o) LOGSYS_OBJS = $(LOGSYS_SRC:%.c=%.o) -ICMAP_OBJS = $(ICMAP_SRC:%.c=%.o) SHARED_LIBS = $(lib_LIBRARIES:%.a=%.so.$(SONAME)) SHARED_LIBS_SO = $(SHARED_LIBS:%.so.$(SONAME)=%.so) @@ -72,12 +69,7 @@ noinst_HEADERS = apidef.h crypto.h mainconfig.h main.h \ totemudpu.h totemsrp.h util.h vsf.h schedwrk.h \ evil.h syncv2.h fsm.h -EXTRA_DIST = $(LCRSO_SRC) - if BUILD_DARWIN -%.lcrso: %.o - $(CC) $(LDFLAGS) $(CFLAGS) -L$(top_builddir)/exec -bundle -bind_at_load -bundle_loader ./corosync $^ -o $@ - libtotem_pg.so.$(SONAME): $(TOTEM_OBJS) $(CC) $(LDFLAGS) $(DARWIN_OPTS) $(TOTEM_OBJS) -o $@ -lpthread ln -sf libtotem_pg.so.$(SONAME) libtotem_pg.so @@ -86,19 +78,12 @@ libtotem_pg.so.$(SONAME): $(TOTEM_OBJS) else if BUILD_SOLARIS -%.lcrso: %.o - $(LD) $(LDFLAGS) -G $^ -o $@ - libtotem_pg.so.$(SONAME): $(TOTEM_OBJS) $(LD) $(LDFLAGS) -G $(TOTEM_OBJS) -o $@ -lpthread ln -sf libtotem_pg.so.$(SONAME) libtotem_pg.so ln -sf libtotem_pg.so.$(SONAME) libtotem_pg.so.$(SOMAJOR) else - -%.lcrso: %.o - $(CC) $(LDFLAGS) $(CFLAGS) $(COVERAGE_LCRSO_EXTRA_LDFLAGS) -shared -Wl,-soname=$@ $^ -o $@ - libtotem_pg.so.$(SONAME): $(TOTEM_OBJS) $(CC) -shared -o $@ \ -Wl,-soname=libtotem_pg.so.$(SOMAJOR) \ @@ -120,8 +105,6 @@ install-exec-local: $(INSTALL) -d $(DESTDIR)/$(libdir) $(INSTALL) -m 755 $(SHARED_LIBS) $(DESTDIR)/$(libdir) $(CP) -a $(SHARED_LIBS_SO) $(SHARED_LIBS_SO_TWO) $(DESTDIR)/$(libdir) - $(INSTALL) -d $(DESTDIR)/$(LCRSODIR) - $(INSTALL) -m 755 $(LCRSO) $(DESTDIR)/$(LCRSODIR) uninstall-local: cd $(DESTDIR)/$(libdir) && \ @@ -130,4 +113,4 @@ uninstall-local: rm -f $(LCRSO) clean-local: - rm -f corosync *.o *.lcrso gmon.out *.da *.bb *.bbg *.so* + rm -f corosync *.o gmon.out *.da *.bb *.bbg *.so* diff --git a/exec/apidef.c b/exec/apidef.c index 6e14e559..24fa5b98 100644 --- a/exec/apidef.c +++ b/exec/apidef.c @@ -137,10 +137,6 @@ static struct corosync_api_v1 apidef_corosync_api_v1 = { .quorum_register_callback = corosync_quorum_register_callback, .quorum_unregister_callback = corosync_quorum_unregister_callback, .quorum_initialize = corosync_quorum_initialize, - .service_link_and_init = corosync_service_link_and_init, - .service_unlink_and_exit = corosync_service_unlink_and_exit, - .plugin_interface_reference = lcr_ifact_reference, - .plugin_interface_release = lcr_ifact_release, .error_memory_failure = _corosync_out_of_memory_error, .fatal_error = _corosync_public_exit_error, .shutdown_request = corosync_shutdown_request, diff --git a/services/cfg.c b/exec/cfg.c similarity index 96% rename from services/cfg.c rename to exec/cfg.c index 67038859..182b6875 100644 --- a/services/cfg.c +++ b/exec/cfg.c @@ -58,12 +58,13 @@ #include #include #include -#include #include #include #include #include +#include "service.h" + LOGSYS_DECLARE_SUBSYS ("CFG"); enum cfg_message_req_types { @@ -285,51 +286,11 @@ struct corosync_service_engine cfg_service_engine = { .sync_mode = CS_SYNC_V1 }; -/* - * Dynamic Loader definition - */ -static struct corosync_service_engine *cfg_get_service_engine_ver0 (void); - -static struct corosync_service_engine_iface_ver0 cfg_service_engine_iface = { - .corosync_get_service_engine_ver0 = cfg_get_service_engine_ver0 -}; - -static struct lcr_iface corosync_cfg_ver0[1] = { - { - .name = "corosync_cfg", - .version = 0, - .versions_replace = 0, - .versions_replace_count = 0, - .dependencies = 0, - .dependency_count = 0, - .constructor = NULL, - .destructor = NULL, - .interfaces = NULL - } -}; - -static struct lcr_comp cfg_comp_ver0 = { - .iface_count = 1, - .ifaces = corosync_cfg_ver0 -}; - -static struct corosync_service_engine *cfg_get_service_engine_ver0 (void) +struct corosync_service_engine *cfg_get_service_engine_ver0 (void) { return (&cfg_service_engine); } -#ifdef COROSYNC_SOLARIS -void corosync_lcr_component_register (void); - -void corosync_lcr_component_register (void) { -#else -__attribute__ ((constructor)) static void corosync_lcr_component_register (void) { -#endif - lcr_interfaces_set (&corosync_cfg_ver0[0], &cfg_service_engine_iface); - - lcr_component_register (&cfg_comp_ver0); -} - struct req_exec_cfg_ringreenable { struct qb_ipc_request_header header __attribute__((aligned(8))); mar_message_source_t source __attribute__((aligned(8))); diff --git a/services/cmap.c b/exec/cmap.c similarity index 94% rename from services/cmap.c rename to exec/cmap.c index 3081173f..d8320b5b 100644 --- a/services/cmap.c +++ b/exec/cmap.c @@ -51,11 +51,12 @@ #include #include #include -#include #include #include #include +#include "service.h" + #define hdb_error_to_cs(_result_) qb_to_cs_error(_result_) LOGSYS_DECLARE_SUBSYS ("CMAP"); @@ -157,52 +158,11 @@ struct corosync_service_engine cmap_service_engine = { .exec_exit_fn = cmap_exec_exit_fn, }; -/* - * Dynamic loader definition - */ -static struct corosync_service_engine *cmap_get_service_engine_ver0 (void); - -static struct corosync_service_engine_iface_ver0 cmap_service_engine_iface = { - .corosync_get_service_engine_ver0 = cmap_get_service_engine_ver0 -}; - -static struct lcr_iface corosync_cmap_ver0[1] = { - { - .name = "corosync_cmap", - .version = 0, - .versions_replace = 0, - .versions_replace_count = 0, - .dependencies = 0, - .dependency_count = 0, - .constructor = NULL, - .destructor = NULL, - .interfaces = NULL - } -}; - -static struct lcr_comp cmap_comp_ver0 = { - .iface_count = 1, - .ifaces = corosync_cmap_ver0 -}; - - -static struct corosync_service_engine *cmap_get_service_engine_ver0 (void) +struct corosync_service_engine *cmap_get_service_engine_ver0 (void) { return (&cmap_service_engine); } -#ifdef COROSYNC_SOLARIS -void corosync_lcr_component_register (void); - -void corosync_lcr_component_register (void) { -#else -__attribute__ ((constructor)) static void corosync_lcr_component_register (void) { -#endif - lcr_interfaces_set (&corosync_cmap_ver0[0], &cmap_service_engine_iface); - - lcr_component_register (&cmap_comp_ver0); -} - static int cmap_exec_exit_fn(void) { return 0; diff --git a/exec/coroparse.c b/exec/coroparse.c index 417f584e..ec7afab3 100644 --- a/exec/coroparse.c +++ b/exec/coroparse.c @@ -62,6 +62,7 @@ #include #include +#include "main.h" #include "util.h" enum parser_cb_type { @@ -186,7 +187,7 @@ static char *strchr_rs (const char *haystack, int byte) return ((char *) end_address); } -static int aisparser_readconfig (const char **error_string) +int coroparse_configparse (const char **error_string) { if (read_config_file_into_icmap(error_string)) { return -1; @@ -195,7 +196,6 @@ static int aisparser_readconfig (const char **error_string) return 0; } - static char *remove_whitespace(char *string) { char *start; @@ -1010,43 +1010,3 @@ static int read_config_file_into_icmap( return res; } - -/* - * Dynamic Loader definition - */ - -struct config_iface_ver0 aisparser_iface_ver0 = { - .config_readconfig = aisparser_readconfig -}; - -struct lcr_iface corosync_aisparser_ver0[1] = { - { - .name = "corosync_parser", - .version = 0, - .versions_replace = 0, - .versions_replace_count = 0, - .dependencies = 0, - .dependency_count = 0, - .constructor = NULL, - .destructor = NULL, - .interfaces = NULL, - } -}; - -struct corosync_service_handler *aisparser_get_handler_ver0 (void); - -struct lcr_comp aisparser_comp_ver0 = { - .iface_count = 1, - .ifaces = corosync_aisparser_ver0 -}; - -#ifdef COROSYNC_SOLARIS -void corosync_lcr_component_register (void); - -void corosync_lcr_component_register (void) { -#else -__attribute__ ((constructor)) static void corosync_lcr_component_register (void) { -#endif - lcr_interfaces_set (&corosync_aisparser_ver0[0], &aisparser_iface_ver0); - lcr_component_register (&aisparser_comp_ver0); -} diff --git a/services/cpg.c b/exec/cpg.c similarity index 98% rename from services/cpg.c rename to exec/cpg.c index c7c4eadd..0d4e1af2 100644 --- a/services/cpg.c +++ b/exec/cpg.c @@ -62,13 +62,14 @@ #include #include #include -#include #include #include #include #include +#include "service.h" + LOGSYS_DECLARE_SUBSYS ("CPG"); #define GROUP_HASH_SIZE 32 @@ -413,52 +414,11 @@ struct corosync_service_engine cpg_service_engine = { .sync_abort = cpg_sync_abort }; -/* - * Dynamic loader definition - */ -static struct corosync_service_engine *cpg_get_service_engine_ver0 (void); - -static struct corosync_service_engine_iface_ver0 cpg_service_engine_iface = { - .corosync_get_service_engine_ver0 = cpg_get_service_engine_ver0 -}; - -static struct lcr_iface corosync_cpg_ver0[1] = { - { - .name = "corosync_cpg", - .version = 0, - .versions_replace = 0, - .versions_replace_count = 0, - .dependencies = 0, - .dependency_count = 0, - .constructor = NULL, - .destructor = NULL, - .interfaces = NULL - } -}; - -static struct lcr_comp cpg_comp_ver0 = { - .iface_count = 1, - .ifaces = corosync_cpg_ver0 -}; - - -static struct corosync_service_engine *cpg_get_service_engine_ver0 (void) +struct corosync_service_engine *cpg_get_service_engine_ver0 (void) { return (&cpg_service_engine); } -#ifdef COROSYNC_SOLARIS -void corosync_lcr_component_register (void); - -void corosync_lcr_component_register (void) { -#else -__attribute__ ((constructor)) static void corosync_lcr_component_register (void) { -#endif - lcr_interfaces_set (&corosync_cpg_ver0[0], &cpg_service_engine_iface); - - lcr_component_register (&cpg_comp_ver0); -} - struct req_exec_cpg_procjoin { struct qb_ipc_request_header header __attribute__((aligned(8))); mar_cpg_name_t group_name __attribute__((aligned(8))); diff --git a/services/evs.c b/exec/evs.c similarity index 93% rename from services/evs.c rename to exec/evs.c index bad81545..1695700c 100644 --- a/services/evs.c +++ b/exec/evs.c @@ -56,7 +56,6 @@ #include #include #include -#include #include #include #include @@ -64,6 +63,8 @@ #include #include +#include "service.h" + LOGSYS_DECLARE_SUBSYS ("EVS"); enum evs_exec_message_req_types { @@ -157,52 +158,11 @@ struct corosync_service_engine evs_service_engine = { static DECLARE_LIST_INIT (confchg_notify); -/* - * Dynamic loading descriptor - */ - -static struct corosync_service_engine *evs_get_service_engine_ver0 (void); - -static struct corosync_service_engine_iface_ver0 evs_service_engine_iface = { - .corosync_get_service_engine_ver0 = evs_get_service_engine_ver0 -}; - -static struct lcr_iface corosync_evs_ver0[1] = { - { - .name = "corosync_evs", - .version = 0, - .versions_replace = 0, - .versions_replace_count = 0, - .dependencies = 0, - .dependency_count = 0, - .constructor = NULL, - .destructor = NULL, - .interfaces = NULL, - } -}; - -static struct lcr_comp evs_comp_ver0 = { - .iface_count = 1, - .ifaces = corosync_evs_ver0 -}; - -static struct corosync_service_engine *evs_get_service_engine_ver0 (void) +struct corosync_service_engine *evs_get_service_engine_ver0 (void) { return (&evs_service_engine); } -#ifdef COROSYNC_SOLARIS -void corosync_lcr_component_register (void); - -void corosync_lcr_component_register (void) { -#else -__attribute__ ((constructor)) static void corosync_lcr_component_register (void) { -#endif - lcr_interfaces_set (&corosync_evs_ver0[0], &evs_service_engine_iface); - - lcr_component_register (&evs_comp_ver0); -} - static int evs_exec_init_fn ( struct corosync_api_v1 *corosync_api) { diff --git a/exec/main.c b/exec/main.c index 952c7c7e..da72b796 100644 --- a/exec/main.c +++ b/exec/main.c @@ -105,7 +105,6 @@ #include #include #include -#include #include #include #include @@ -1043,14 +1042,6 @@ int main (int argc, char **argv, char **envp) { const char *error_string; struct totem_config totem_config; - hdb_handle_t config_handle; - unsigned int config_version = 0; - struct config_iface_ver0 *config; - void *config_p; - const char *config_iface_init; - char *config_iface; - char *iface; - char *strtok_save_pt; int res, ch; int background, setprio; struct stat stat_out; @@ -1133,50 +1124,12 @@ int main (int argc, char **argv, char **envp) num_config_modules = 0; - /* - * Bootstrap in the default configuration parser or use - * the corosync default built in parser if the configuration parser - * isn't overridden - */ - config_iface_init = getenv("COROSYNC_DEFAULT_CONFIG_IFACE"); - if (!config_iface_init) { - config_iface_init = "corosync_parser"; + res = coroparse_configparse(&error_string); + if (res == -1) { + log_printf (LOGSYS_LEVEL_ERROR, "%s", error_string); + corosync_exit_error (COROSYNC_DONE_MAINCONFIGREAD); } - /* Make a copy so we can deface it with strtok */ - if ((config_iface = strdup(config_iface_init)) == NULL) { - log_printf (LOGSYS_LEVEL_ERROR, "exhausted virtual memory"); - corosync_exit_error (COROSYNC_DONE_OBJDB); - } - - iface = strtok_r(config_iface, ":", &strtok_save_pt); - while (iface) - { - res = lcr_ifact_reference ( - &config_handle, - iface, - config_version, - &config_p, - 0); - - config = (struct config_iface_ver0 *)config_p; - if (res == -1) { - log_printf (LOGSYS_LEVEL_ERROR, "Corosync Executive couldn't open configuration component '%s'\n", iface); - corosync_exit_error (COROSYNC_DONE_MAINCONFIGREAD); - } - - res = config->config_readconfig(&error_string); - if (res == -1) { - log_printf (LOGSYS_LEVEL_ERROR, "%s", error_string); - corosync_exit_error (COROSYNC_DONE_MAINCONFIGREAD); - } - log_printf (LOGSYS_LEVEL_NOTICE, "%s", error_string); - config_modules[num_config_modules++] = config; - - iface = strtok_r(NULL, ":", &strtok_save_pt); - } - free(config_iface); - res = corosync_main_config_read (&error_string); if (res == -1) { /* diff --git a/exec/main.h b/exec/main.h index ad73d873..6cbbeb42 100644 --- a/exec/main.h +++ b/exec/main.h @@ -122,4 +122,6 @@ extern void cs_ipc_refcnt_inc(void *conn); extern void cs_ipc_refcnt_dec(void *conn); +int coroparse_configparse (const char **error_string); + #endif /* MAIN_H_DEFINED */ diff --git a/services/mon.c b/exec/mon.c similarity index 92% rename from services/mon.c rename to exec/mon.c index 42735b0e..2de55fef 100644 --- a/services/mon.c +++ b/exec/mon.c @@ -41,13 +41,13 @@ #include #include -#include #include #include #include #include #include "../exec/fsm.h" +#include "service.h" LOGSYS_DECLARE_SUBSYS ("MON"); @@ -150,52 +150,11 @@ struct cs_fsm_entry mon_fsm_table[] = { { MON_S_FAILED, MON_E_FAILURE, NULL, {-1} }, }; -/* - * Dynamic loading descriptor - */ - -static struct corosync_service_engine *mon_get_service_engine_ver0 (void); - -static struct corosync_service_engine_iface_ver0 mon_service_engine_iface = { - .corosync_get_service_engine_ver0 = mon_get_service_engine_ver0 -}; - -static struct lcr_iface corosync_mon_ver0[1] = { - { - .name = "corosync_mon", - .version = 0, - .versions_replace = 0, - .versions_replace_count = 0, - .dependencies = 0, - .dependency_count = 0, - .constructor = NULL, - .destructor = NULL, - .interfaces = NULL, - } -}; - -static struct lcr_comp mon_comp_ver0 = { - .iface_count = 1, - .ifaces = corosync_mon_ver0 -}; - -static struct corosync_service_engine *mon_get_service_engine_ver0 (void) +struct corosync_service_engine *mon_get_service_engine_ver0 (void) { return (&mon_service_engine); } -#ifdef COROSYNC_SOLARIS -void corosync_lcr_component_register (void); - -void corosync_lcr_component_register (void) { -#else -__attribute__ ((constructor)) static void corosync_lcr_component_register (void) { -#endif - lcr_interfaces_set (&corosync_mon_ver0[0], &mon_service_engine_iface); - - lcr_component_register (&mon_comp_ver0); -} - static const char * mon_res_state_to_str(struct cs_fsm* fsm, int32_t state) { diff --git a/services/pload.c b/exec/pload.c similarity index 89% rename from services/pload.c rename to exec/pload.c index c8f64ce0..f4f599c2 100644 --- a/services/pload.c +++ b/exec/pload.c @@ -59,13 +59,14 @@ #include #include #include -#include #include #include #include #include #include +#include "service.h" + LOGSYS_DECLARE_SUBSYS ("PLOAD"); enum pload_exec_message_req_types { @@ -170,52 +171,11 @@ struct corosync_service_engine pload_service_engine = { static DECLARE_LIST_INIT (confchg_notify); -/* - * Dynamic loading descriptor - */ - -static struct corosync_service_engine *pload_get_service_engine_ver0 (void); - -static struct corosync_service_engine_iface_ver0 pload_service_engine_iface = { - .corosync_get_service_engine_ver0 = pload_get_service_engine_ver0 -}; - -static struct lcr_iface corosync_pload_ver0[1] = { - { - .name = "corosync_pload", - .version = 0, - .versions_replace = 0, - .versions_replace_count = 0, - .dependencies = 0, - .dependency_count = 0, - .constructor = NULL, - .destructor = NULL, - .interfaces = NULL, - } -}; - -static struct lcr_comp pload_comp_ver0 = { - .iface_count = 1, - .ifaces = corosync_pload_ver0 -}; - -static struct corosync_service_engine *pload_get_service_engine_ver0 (void) +struct corosync_service_engine *pload_get_service_engine_ver0 (void) { return (&pload_service_engine); } -#ifdef COROSYNC_SOLARIS -void corosync_lcr_component_register (void); - -void corosync_lcr_component_register (void) { -#else -__attribute__ ((constructor)) static void corosync_lcr_component_register (void) { -#endif - lcr_interfaces_set (&corosync_pload_ver0[0], &pload_service_engine_iface); - - lcr_component_register (&pload_comp_ver0); -} - static int pload_exec_init_fn ( struct corosync_api_v1 *corosync_api) { diff --git a/exec/quorum.c b/exec/quorum.c index 1e76827d..a98ef7a4 100644 --- a/exec/quorum.c +++ b/exec/quorum.c @@ -54,7 +54,6 @@ #include #include #include -#include #include #include "quorum.h" diff --git a/exec/service.c b/exec/service.c index d9bc1b97..91be6a2f 100644 --- a/exec/service.c +++ b/exec/service.c @@ -62,44 +62,55 @@ LOGSYS_DECLARE_SUBSYS ("SERV"); struct default_service { const char *name; int ver; + struct corosync_service_engine *(*loader)(void); }; static struct default_service default_services[] = { { - .name = "corosync_evs", - .ver = 0, + .name = "corosync_evs", + .ver = 0, + .loader = evs_get_service_engine_ver0 }, { - .name = "corosync_cfg", - .ver = 0, + .name = "corosync_cfg", + .ver = 0, + .loader = cfg_get_service_engine_ver0 }, { - .name = "corosync_cpg", - .ver = 0, + .name = "corosync_cpg", + .ver = 0, + .loader = cpg_get_service_engine_ver0 }, { - .name = "corosync_pload", - .ver = 0, + .name = "corosync_pload", + .ver = 0, + .loader = pload_get_service_engine_ver0 }, #ifdef HAVE_MONITORING { - .name = "corosync_mon", - .ver = 0, + .name = "corosync_mon", + .ver = 0, + .loader = mon_get_service_engine_ver0 }, #endif #ifdef HAVE_WATCHDOG { - .name = "corosync_wd", - .ver = 0, + .name = "corosync_wd", + .ver = 0, + .loader = wd_get_service_engine_ver0 + }, +#endif +#ifdef HAVE_VOTEQUORUM + { + .name = "corosync_quorum", + .ver = 0, + .loader = votequorum_get_service_engine_ver0 }, #endif { - .name = "corosync_quorum", - .ver = 0, - }, - { - .name = "corosync_cmap", - .ver = 0, + .name = "corosync_cmap", + .ver = 0, + .loader = cmap_get_service_engine_ver0 }, }; @@ -121,116 +132,73 @@ int corosync_service_exiting[SERVICE_HANDLER_MAXIMUM_COUNT]; static void (*service_unlink_all_complete) (void) = NULL; -static unsigned int default_services_requested (struct corosync_api_v1 *corosync_api) -{ - char *value = NULL; - int res; - - /* - * Don't link default services if they have been disabled - */ - if (icmap_get_string("aisexec.defaultservices", &value) == CS_OK && - value != NULL && strcmp(value, "no") == 0) { - res = 0; - } else { - res = -1; - } - - free(value); - return (res); -} - unsigned int corosync_service_link_and_init ( struct corosync_api_v1 *corosync_api, - const char *service_name, - unsigned int service_ver) + struct default_service *service) { - struct corosync_service_engine_iface_ver0 *iface_ver0; - void *iface_ver0_p; - hdb_handle_t handle; - struct corosync_service_engine *service; - int res; + struct corosync_service_engine *service_engine; + int res = 0; int fn; char *name_sufix; - void* _start; - void* _stop; char key_name[ICMAP_KEYNAME_MAXLEN]; - /* - * reference the service interface - */ - iface_ver0_p = NULL; - res = lcr_ifact_reference ( - &handle, - service_name, - service_ver, - &iface_ver0_p, - (void *)0); - - iface_ver0 = (struct corosync_service_engine_iface_ver0 *)iface_ver0_p; - - if (res == -1 || iface_ver0 == 0) { - log_printf(LOGSYS_LEVEL_ERROR, "Service failed to load '%s'.\n", service_name); - return (-1); - } - - /* * Initialize service */ - service = iface_ver0->corosync_get_service_engine_ver0(); + service_engine = service->loader(); - corosync_service[service->id] = service; + corosync_service[service_engine->id] = service_engine; /* * Register the log sites with libqb */ +/* SDAKE _start = lcr_ifact_addr_get(handle, "__start___verbose"); _stop = lcr_ifact_addr_get(handle, "__stop___verbose"); qb_log_callsites_register(_start, _stop); +*/ - if (service->config_init_fn) { - res = service->config_init_fn (corosync_api); + if (service_engine->config_init_fn) { + res = service_engine->config_init_fn (corosync_api); } - if (service->exec_init_fn) { - res = service->exec_init_fn (corosync_api); + if (service_engine->exec_init_fn) { + res = service_engine->exec_init_fn (corosync_api); } /* * Store service in cmap db */ - snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "internal_configuration.service.%u.name", service->id); - icmap_set_string(key_name, service_name); + snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "internal_configuration.service.%u.name", service_engine->id); + icmap_set_string(key_name, service->name); - snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "internal_configuration.service.%u.ver", service->id); - icmap_set_uint32(key_name, service_ver); + snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "internal_configuration.service.%u.ver", service_engine->id); + icmap_set_uint32(key_name, service->ver); - snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "internal_configuration.service.%u.handle", service->id); - icmap_set_uint64(key_name, handle); + snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "internal_configuration.service.%u.handle", service_engine->id); - name_sufix = strrchr (service_name, '_'); + name_sufix = strrchr (service->name, '_'); if (name_sufix) name_sufix++; else - name_sufix = (char*)service_name; + name_sufix = (char*)service->name; snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "runtime.services.%s.service_id", name_sufix); - icmap_set_uint16(key_name, service->id); + icmap_set_uint16(key_name, service_engine->id); - for (fn = 0; fn < service->exec_engine_count; fn++) { + for (fn = 0; fn < service_engine->exec_engine_count; fn++) { snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "runtime.services.%s.%d.tx", name_sufix, fn); icmap_set_uint64(key_name, 0); - service_stats_tx[service->id][fn] = strdup(key_name); + service_stats_tx[service_engine->id][fn] = strdup(key_name); snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "runtime.services.%s.%d.rx", name_sufix, fn); icmap_set_uint64(key_name, 0); - service_stats_rx[service->id][fn] = strdup(key_name); + service_stats_rx[service_engine->id][fn] = strdup(key_name); } log_printf (LOGSYS_LEVEL_NOTICE, - "Service engine loaded: %s [%d]\n", service->name, service->id); - cs_ipcs_service_init(service); + "Service engine loaded: %s [%d]\n", service_engine->name, service_engine->id); + cs_ipcs_service_init(service_engine); return (res); } @@ -313,7 +281,6 @@ static unsigned int service_unlink_and_exit ( unsigned int service_ver) { unsigned short service_id; - hdb_handle_t found_service_handle; char *name_sufix; int res; const char *iter_key_name; @@ -376,10 +343,12 @@ static unsigned int service_unlink_and_exit ( cs_ipcs_service_destroy (service_id); +#ifdef SDAKE snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "internal_configuration.service.%u.handle", service_id); if (icmap_get_uint64(key_name, &found_service_handle) == CS_OK) { lcr_ifact_release (found_service_handle); } +#endif snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "internal_configuration.service.%u.handle", service_id); icmap_delete(key_name); @@ -399,57 +368,13 @@ unsigned int corosync_service_defaults_link_and_init (struct corosync_api_v1 *co { unsigned int i; - icmap_iter_t iter; - char *found_service_name; - int res; - unsigned int found_service_ver; - const char *iter_key_name; - unsigned int service_pos; - char key_name[ICMAP_KEYNAME_MAXLEN]; - - icmap_set_ro_access("internal_configuration.", 1, 1); - icmap_set_ro_access("runtime.services.", 1, 1); - - found_service_name = NULL; - iter = icmap_iter_init("service."); - while ((iter_key_name = icmap_iter_next(iter, NULL, NULL)) != NULL) { - res = sscanf(iter_key_name, "service.%u.%s", &service_pos, key_name); - if (res != 2) { - continue; - } - if (strcmp(key_name, "name") != 0) { - continue; - } - - snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "service.%u.name", service_pos); - free(found_service_name); - if (icmap_get_string(key_name, &found_service_name) != CS_OK) { - continue; - } - - snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "service.%u.ver", service_pos); - if (icmap_get_uint32(key_name, &found_service_ver) != CS_OK) { - continue; - } - - corosync_service_link_and_init ( - corosync_api, - found_service_name, - found_service_ver); - } - icmap_iter_finalize(iter); - - if (default_services_requested (corosync_api) == 0) { - return (0); - } - for (i = 0; i < sizeof (default_services) / sizeof (struct default_service); i++) { + default_services[i].loader(); corosync_service_link_and_init ( corosync_api, - default_services[i].name, - default_services[i].ver); + &default_services[i]); } return (0); @@ -477,7 +402,9 @@ static void service_unlink_schedwrk_handler (void *data) { corosync_service[cb_data->service_engine] = NULL; +#ifdef SDAKE lcr_ifact_release (cb_data->service_handle); +#endif qb_loop_job_add(cs_poll_handle_get(), QB_LOOP_HIGH, diff --git a/exec/service.h b/exec/service.h index 4fd0b50d..33d60531 100644 --- a/exec/service.h +++ b/exec/service.h @@ -39,13 +39,14 @@ struct corosync_api_v1; +struct default_service; + /** * Link and initialize a service */ -extern unsigned int corosync_service_link_and_init ( +unsigned int corosync_service_link_and_init ( struct corosync_api_v1 *objdb, - const char *service_name, - unsigned int service_ver); + struct default_service *service_engine); /** * Unlink and exit a service @@ -75,4 +76,13 @@ extern int corosync_service_exiting[]; extern const char *service_stats_rx[SERVICE_HANDLER_MAXIMUM_COUNT][64]; extern const char *service_stats_tx[SERVICE_HANDLER_MAXIMUM_COUNT][64]; +struct corosync_service_engine *votequorum_get_service_engine_ver0 (void); +struct corosync_service_engine *pload_get_service_engine_ver0 (void); +struct corosync_service_engine *cfg_get_service_engine_ver0 (void); +struct corosync_service_engine *evs_get_service_engine_ver0 (void); +struct corosync_service_engine *cpg_get_service_engine_ver0 (void); +struct corosync_service_engine *mon_get_service_engine_ver0 (void); +struct corosync_service_engine *wd_get_service_engine_ver0 (void); +struct corosync_service_engine *cmap_get_service_engine_ver0 (void); + #endif /* SERVICE_H_DEFINED */ diff --git a/exec/testquorum.c b/exec/testquorum.c new file mode 100644 index 00000000..e69de29b diff --git a/services/votequorum.c b/exec/votequorum.c similarity index 96% rename from services/votequorum.c rename to exec/votequorum.c index d0463e8e..b748c444 100644 --- a/services/votequorum.c +++ b/exec/votequorum.c @@ -50,6 +50,8 @@ #include #include +#include "service.h" + LOGSYS_DECLARE_SUBSYS ("VOTEQ"); /* @@ -319,15 +321,7 @@ static struct corosync_lib_handler quorum_lib_service[] = } }; -/* - * Dynamic loader/lcrso object definition - */ - -static struct quorum_services_api_ver1 votequorum_iface_ver0 = { - .init = votequorum_init -}; - -static struct corosync_service_engine quorum_service_handler = { +static struct corosync_service_engine votequorum_service_engine = { .name = "corosync vote quorum service v1.0", .id = VOTEQUORUM_SERVICE, .private_data_size = sizeof (struct quorum_pd), @@ -344,54 +338,9 @@ static struct corosync_service_engine quorum_service_handler = { .sync_mode = CS_SYNC_V1 }; -static struct corosync_service_engine *quorum_get_service_handler_ver0 (void) +struct corosync_service_engine *votequorum_get_service_engine_ver0 (void) { - return (&quorum_service_handler); -} - -static struct corosync_service_engine_iface_ver0 quorum_service_handler_iface = { - .corosync_get_service_engine_ver0 = quorum_get_service_handler_ver0 -}; - -static struct lcr_iface corosync_quorum_ver0[2] = { - { - .name = "corosync_votequorum", - .version = 0, - .versions_replace = 0, - .versions_replace_count = 0, - .dependencies = 0, - .dependency_count = 0, - .constructor = NULL, - .destructor = NULL, - .interfaces = (void **)(void *)&votequorum_iface_ver0 - }, - { - .name = "corosync_votequorum_iface", - .version = 0, - .versions_replace = 0, - .versions_replace_count = 0, - .dependencies = 0, - .dependency_count = 0, - .constructor = NULL, - .destructor = NULL, - .interfaces = NULL - } -}; - -static struct lcr_comp quorum_comp_ver0 = { - .iface_count = 2, - .ifaces = corosync_quorum_ver0 -}; - -#ifdef COROSYNC_SOLARIS -void corosync_lcr_component_register (void); -void corosync_lcr_component_register (void) { -#else -__attribute__ ((constructor)) static void corosync_lcr_component_register (void) { -#endif - lcr_interfaces_set (&corosync_quorum_ver0[0], &votequorum_iface_ver0); - lcr_interfaces_set (&corosync_quorum_ver0[1], &quorum_service_handler_iface); - lcr_component_register (&quorum_comp_ver0); + return (&votequorum_service_engine); } /* diff --git a/exec/vsf_quorum.c b/exec/vsf_quorum.c index 6c2fd42b..a31c580e 100644 --- a/exec/vsf_quorum.c +++ b/exec/vsf_quorum.c @@ -195,45 +195,11 @@ static struct corosync_service_engine quorum_service_handler = { .sync_mode = CS_SYNC_V1 }; -static struct lcr_iface corosync_quorum_ver0[1] = { - { - .name = "corosync_quorum", - .version = 0, - .versions_replace = 0, - .versions_replace_count = 0, - .dependencies = 0, - .dependency_count = 0, - .constructor = NULL, - .destructor = NULL, - .interfaces = NULL, - }, -}; - -static struct corosync_service_engine *quorum_get_service_handler_ver0 (void) +static struct corosync_service_engine *quorum_get_service_engine_ver0 (void) { return (&quorum_service_handler); } -static struct lcr_comp quorum_comp_ver0 = { - .iface_count = 1, - .ifaces = corosync_quorum_ver0 -}; - -static struct corosync_service_engine_iface_ver0 quorum_service_handler_iface = { - .corosync_get_service_engine_ver0 = quorum_get_service_handler_ver0 -}; - -#ifdef COROSYNC_SOLARIS -void corosync_lcr_component_register (void); - -void corosync_lcr_component_register (void) { -#else -__attribute__ ((constructor)) static void corosync_lcr_component_register (void) { -#endif - lcr_component_register (&quorum_comp_ver0); - lcr_interfaces_set (&corosync_quorum_ver0[0], &quorum_service_handler_iface); -} - /* -------------------------------------------------- */ @@ -286,16 +252,10 @@ static struct quorum_callin_functions callins = { static int quorum_exec_init_fn (struct corosync_api_v1 *api) { - hdb_handle_t q_handle; - char *quorum_module; - int res; - void *quorum_iface_p; - void* _start; - void* _stop; - #ifdef COROSYNC_SOLARIS logsys_subsys_init(); #endif +#ifdef SDAKE corosync_api = api; list_init (&lib_trackers_list); list_init (&internal_trackers_list); @@ -347,6 +307,7 @@ static int quorum_exec_init_fn (struct corosync_api_v1 *api) quorum_type = 0; } +#endif return (0); } diff --git a/exec/vsf_ykd.c b/exec/vsf_ykd.c index f9012be3..01eab842 100644 --- a/exec/vsf_ykd.c +++ b/exec/vsf_ykd.c @@ -63,7 +63,6 @@ #include #include #include -#include LOGSYS_DECLARE_SUBSYS ("YKD"); @@ -526,39 +525,3 @@ static void ykd_init ( ykd_state_init (); } - -/* - * lcrso object definition - */ -static struct quorum_services_api_ver1 vsf_ykd_iface_ver0 = { - .init = ykd_init, -}; - -static struct lcr_iface corosync_vsf_ykd_ver0[1] = { - { - .name = "corosync_quorum_ykd", - .version = 0, - .versions_replace = 0, - .versions_replace_count = 0, - .dependencies = 0, - .dependency_count = 0, - .constructor = NULL, - .destructor = NULL, - .interfaces = (void **)(void *)&vsf_ykd_iface_ver0, - } -}; - -static struct lcr_comp vsf_ykd_comp_ver0 = { - .iface_count = 1, - .ifaces = corosync_vsf_ykd_ver0 -}; - -#ifdef COROSYNC_SOLARIS -void corosync_lcr_component_register (void); - -void corosync_lcr_component_register (void) { -#else -__attribute__ ((constructor)) static void corosync_lcr_component_register (void) { -#endif - lcr_component_register (&vsf_ykd_comp_ver0); -} diff --git a/services/wd.c b/exec/wd.c similarity index 94% rename from services/wd.c rename to exec/wd.c index 9c45e32f..e9a14ff6 100644 --- a/services/wd.c +++ b/exec/wd.c @@ -43,13 +43,13 @@ #include #include -#include #include #include #include #include #include "../exec/fsm.h" +#include "service.h" typedef enum { WD_RESOURCE_GOOD, @@ -144,52 +144,11 @@ struct cs_fsm_entry wd_fsm_table[] = { { WD_S_FAILED, WD_E_FAILURE, NULL, {-1} }, }; -/* - * Dynamic loading descriptor - */ - -static struct corosync_service_engine *wd_get_service_engine_ver0 (void); - -static struct corosync_service_engine_iface_ver0 wd_service_engine_iface = { - .corosync_get_service_engine_ver0 = wd_get_service_engine_ver0 -}; - -static struct lcr_iface corosync_wd_ver0[1] = { - { - .name = "corosync_wd", - .version = 0, - .versions_replace = 0, - .versions_replace_count = 0, - .dependencies = 0, - .dependency_count = 0, - .constructor = NULL, - .destructor = NULL, - .interfaces = NULL, - } -}; - -static struct lcr_comp wd_comp_ver0 = { - .iface_count = 1, - .ifaces = corosync_wd_ver0 -}; - -static struct corosync_service_engine *wd_get_service_engine_ver0 (void) +struct corosync_service_engine *wd_get_service_engine_ver0 (void) { return (&wd_service_engine); } -#ifdef COROSYNC_SOLARIS -void corosync_lcr_component_register (void); - -void corosync_lcr_component_register (void) { -#else -__attribute__ ((constructor)) static void corosync_lcr_component_register (void) { -#endif - lcr_interfaces_set (&corosync_wd_ver0[0], &wd_service_engine_iface); - - lcr_component_register (&wd_comp_ver0); -} - static const char * wd_res_state_to_str(struct cs_fsm* fsm, int32_t state) { diff --git a/services/Makefile.am b/services/Makefile.am deleted file mode 100644 index 2ac4a03d..00000000 --- a/services/Makefile.am +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright (c) 2009 Red Hat, Inc. -# -# Authors: Andrew Beekhof -# Steven Dake (sdake@redhat.com) -# -# This software licensed under BSD license, the text of which follows: -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# - Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# - Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# - Neither the name of the MontaVista Software, Inc. nor the names of its -# contributors may be used to endorse or promote products derived from this -# software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -# THE POSSIBILITY OF SUCH DAMAGE. - -MAINTAINERCLEANFILES = Makefile.in - -AM_CFLAGS = -fPIC - -INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include \ - -I$(top_builddir)/include/corosync \ - -I$(top_srcdir)/include/corosync - -SERVICE_LCRSO = evs cfg cpg pload cmap -if BUILD_WATCHDOG -SERVICE_LCRSO += wd -endif -if BUILD_MONITORING -SERVICE_LCRSO += mon -endif - -QUORUM_LCRSO = votequorum testquorum - -SOURCES = $(SERVICE_LCRSO:%=%.c) $(QUORUM_LCRSO:%=%.c) - -EXTRA_DIST = $(SOURCES) - -LCRSO = $(SERVICE_LCRSO:%=service_%.lcrso) $(QUORUM_LCRSO:%=quorum_%.lcrso) - -LCRSO_OBJS = $(SOURCES:%.c=%.o) - -if BUILD_DARWIN -quorum_%.lcrso: %.o - $(CC) $(LDFLAGS) $(CFLAGS) -L$(top_builddir)/exec -llogsys -bundle -bundle_loader $(top_builddir)/exec/corosync $^ -o $@ - -service_%.lcrso: %.o - $(CC) $(LDFLAGS) $(CFLAGS) -L$(top_builddir)/exec -llogsys -bundle -bundle_loader $(top_builddir)/exec/corosync $^ -o $@ - -else - -if BUILD_SOLARIS - -quorum_%.lcrso: %.o - $(LD) $(LDFLAGS) -G $^ -o $@ - -service_%.lcrso: %.o - $(LD) $(LDFLAGS) -G $^ -o $@ - -else -quorum_%.lcrso: %.o - $(CC) $(LDFLAGS) $(CFLAGS) $(COVERAGE_LCRSO_EXTRA_LDFLAGS) -shared -Wl,-soname=$@ $^ -o $@ - -service_%.lcrso: %.o - $(CC) $(LDFLAGS) $(CFLAGS) $(COVERAGE_LCRSO_EXTRA_LDFLAGS) -shared -Wl,-soname=$@ $^ -o $@ -endif - -endif - -%.o: %.c - $(CC) $(AM_CFLAGS) $(CFLAGS) $(CPPFLAGS) $(INCLUDES) -c -o $@ $< - -lint: - -splint $(INCLUDES) $(LINT_FLAGS) $(CFLAGS) *.c - -all-local: $(LCRSO_OBJS) $(LCRSO) - @echo Built Service Engines - -install-exec-local: - $(INSTALL) -d $(DESTDIR)/$(LCRSODIR) - $(INSTALL) -m 755 $(LCRSO) $(DESTDIR)/$(LCRSODIR) - -uninstall-local: - cd $(DESTDIR)/$(LCRSODIR) && \ - rm -f $(LCRSO) - -clean-local: - rm -f *.o *.a *.so* *.da *.bb *.bbg *.lcrso diff --git a/services/testquorum.c b/services/testquorum.c deleted file mode 100644 index 7f351590..00000000 --- a/services/testquorum.c +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (c) 2008, 2009 Red Hat, Inc. - * - * All rights reserved. - * - * Author: Christine Caulfield (ccaulfie@redhat.com) - * - * This software licensed under BSD license, the text of which follows: - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Neither the name of Red Hat, Inc. nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -LOGSYS_DECLARE_SUBSYS ("TEST"); - -static void test_init(struct corosync_api_v1 *api, quorum_set_quorate_fn_t report); - -/* - * lcrso object definition - */ -static struct quorum_services_api_ver1 test_quorum_iface_ver0 = { - .init = test_init -}; - -static struct lcr_iface corosync_test_quorum_ver0[1] = { - { - .name = "testquorum", - .version = 0, - .versions_replace = 0, - .versions_replace_count = 0, - .dependencies = 0, - .dependency_count = 0, - .constructor = NULL, - .destructor = NULL, - .interfaces = (void **)(void *)&test_quorum_iface_ver0, - }, -}; - -static struct lcr_comp test_quorum_comp_ver0 = { - .iface_count = 1, - .ifaces = corosync_test_quorum_ver0 -}; - -#ifdef COROSYNC_SOLARIS -void corosync_lcr_component_register (void); - -void corosync_lcr_component_register (void) { - logsys_subsys_init(); -#else -__attribute__ ((constructor)) static void corosync_lcr_component_register (void) { -#endif - lcr_interfaces_set (&corosync_test_quorum_ver0[0], &test_quorum_iface_ver0); - lcr_component_register (&test_quorum_comp_ver0); -} - -/* -------------------------------------------------- */ - -static quorum_set_quorate_fn_t set_quorum; - -static void key_change_notify( - int32_t event, - const char *key_name, - struct icmap_notify_value new_val, - struct icmap_notify_value old_val, - void *user_data) -{ - struct memb_ring_id ring_id; - unsigned int members[1]; - uint8_t u8; - - memset(&ring_id, 0, sizeof(ring_id)); - if (icmap_get_uint8(key_name, &u8) == CS_OK) { - set_quorum(members, 0, u8, &ring_id); - } -} - -static void quorum_callback(int quorate, void *context) -{ - log_printf(LOGSYS_LEVEL_DEBUG, "quorum callback: quorate = %d\n", quorate); -} - -static void test_init(struct corosync_api_v1 *api, - quorum_set_quorate_fn_t report) -{ - - icmap_track_t icmap_track; - - set_quorum = report; - - /* - * Register for icmap changes on quorum.quorate - */ - icmap_track_add("quorum.quorate", - ICMAP_TRACK_ADD | ICMAP_TRACK_DELETE | ICMAP_TRACK_MODIFY, - key_change_notify, - NULL, - &icmap_track); - - /* Register for quorum changes too! */ - api->quorum_register_callback(quorum_callback, NULL); -}