static int load_quorum_instance(struct corosync_api_v1 *api) { const char *error_string; int res; error_string = votequorum_init(api, quorum_fn); if (error_string) { fprintf(stderr, "Votequorum init failed: %s\n", error_string); return -1; } engine = votequorum_get_service_engine_ver0(); error_string = engine->exec_init_fn(api); if (error_string) { fprintf(stderr, "votequorum exec init failed: %s\n", error_string); return -1; } private_data = malloc(engine->private_data_size); if (!private_data) { perror("Malloc in child failed"); return -1; } res = engine->lib_init_fn(fake_conn); return res; }
static char *quorum_exec_init_fn (struct corosync_api_v1 *api) { char *quorum_module = NULL; char *error; corosync_api = api; list_init (&lib_trackers_list); list_init (&internal_trackers_list); /* * Tell corosync we have a quorum engine. */ api->quorum_initialize(&callins); /* * Look for a quorum provider */ if (icmap_get_string("quorum.provider", &quorum_module) == CS_OK) { log_printf (LOGSYS_LEVEL_NOTICE, "Using quorum provider %s", quorum_module); error = (char *)"Invalid quorum provider"; if (strcmp (quorum_module, "corosync_votequorum") == 0) { error = votequorum_init (api, quorum_api_set_quorum); quorum_type = 1; } if (strcmp (quorum_module, "corosync_ykd") == 0) { error = ykd_init (api, quorum_api_set_quorum); quorum_type = 1; } if (error) { log_printf (LOGSYS_LEVEL_CRIT, "Quorum provider: %s failed to initialize.", quorum_module); free(quorum_module); return (error); } } if (quorum_module) { free(quorum_module); quorum_module = NULL; } /* * setting quorum_type and primary_designated in the right order is important * always try to lookup/init a quorum module, then revert back to be quorate */ if (quorum_type == 0) { primary_designated = 1; } return (NULL); }