static lcb_error_t config_nodes(int mode, lcb_t instance, int cmd, void *arg) { const char *node_strs = arg; clconfig_provider *target; hostlist_t nodes_obj; lcb_error_t err; if (mode != LCB_CNTL_SET) { return LCB_EINVAL; } nodes_obj = hostlist_create(); if (!nodes_obj) { return LCB_CLIENT_ENOMEM; } err = hostlist_add_stringz(nodes_obj, node_strs, cmd == LCB_CNTL_CONFIG_HTTP_NODES ? LCB_CONFIG_HTTP_PORT : LCB_CONFIG_MCD_PORT); if (err != LCB_SUCCESS) { hostlist_destroy(nodes_obj); return err; } if (cmd == LCB_CNTL_CONFIG_HTTP_NODES) { target = lcb_confmon_get_provider(instance->confmon, LCB_CLCONFIG_HTTP); lcb_clconfig_http_set_nodes(target, nodes_obj); } else { target = lcb_confmon_get_provider(instance->confmon, LCB_CLCONFIG_CCCP); lcb_clconfig_cccp_set_nodes(target, nodes_obj); } hostlist_destroy(nodes_obj); return LCB_SUCCESS; }
lcb_error_t lcb_init_providers(lcb_t obj, const struct lcb_create_st2 *e_options) { hostlist_t mc_nodes; lcb_error_t err; const char *hosts; int http_enabled = 1; int cccp_enabled = 1; clconfig_provider *http = lcb_confmon_get_provider(obj->confmon, LCB_CLCONFIG_HTTP); clconfig_provider *cccp = lcb_confmon_get_provider(obj->confmon, LCB_CLCONFIG_CCCP); if (e_options->transports) { int cccp_found = 0; int http_found = 0; const lcb_config_transport_t *cur; for (cur = e_options->transports; *cur != LCB_CONFIG_TRANSPORT_LIST_END; cur++) { if (*cur == LCB_CONFIG_TRANSPORT_CCCP) { cccp_found = 1; } else if (*cur == LCB_CONFIG_TRANSPORT_HTTP) { http_found = 1; } else { return LCB_EINVAL; } } if (http_found || cccp_found) { cccp_enabled = cccp_found; http_enabled = http_found; } } if (lcb_getenv_boolean("LCB_NO_CCCP")) { cccp_enabled = 0; } if (lcb_getenv_boolean("LCB_NO_HTTP")) { http_enabled = 0; } /** The only way we can get to here is if one of the vars are set */ if (cccp_enabled == 0 && http_enabled == 0) { return LCB_BAD_ENVIRONMENT; } if (http_enabled) { lcb_clconfig_http_enable(http); lcb_clconfig_http_set_nodes(http, obj->usernodes); } else { lcb_confmon_set_provider_active(obj->confmon, LCB_CLCONFIG_HTTP, 0); } if (!cccp_enabled) { lcb_confmon_set_provider_active(obj->confmon, LCB_CLCONFIG_CCCP, 0); return LCB_SUCCESS; } hosts = get_nonempty_string(e_options->mchosts); mc_nodes = hostlist_create(); if (!mc_nodes) { return LCB_CLIENT_ENOMEM; } if (hosts) { err = hostlist_add_stringz(mc_nodes, hosts, LCB_CONFIG_MCD_PORT); if (err != LCB_SUCCESS) { hostlist_destroy(mc_nodes); return err; } } else { lcb_size_t ii; for (ii = 0; ii < obj->usernodes->nentries; ii++) { lcb_host_t *cur = obj->usernodes->entries + ii; hostlist_add_stringz(mc_nodes, cur->host, LCB_CONFIG_MCD_PORT); } } lcb_clconfig_cccp_enable(cccp, obj); lcb_clconfig_cccp_set_nodes(cccp, mc_nodes); hostlist_destroy(mc_nodes); return LCB_SUCCESS; }