From a16e7a370d0b564a5edad7791d2421d175c0787a Mon Sep 17 00:00:00 2001 From: Pavel Březina Date: Aug 09 2016 08:37:42 +0000 Subject: DP: Initialize D-Bus as soon as possible Resolves: https://fedorahosted.org/sssd/ticket/3111 Reviewed-by: Petr Cech --- diff --git a/src/providers/data_provider/dp.c b/src/providers/data_provider/dp.c index c4590e3..b672370 100644 --- a/src/providers/data_provider/dp.c +++ b/src/providers/data_provider/dp.c @@ -86,6 +86,7 @@ errno_t dp_init(struct tevent_context *ev, provider->gid = gid; provider->be_ctx = be_ctx; + /* Initialize request table. */ ret = dp_req_table_init(provider, &provider->requests.reply_table); if (ret != EOK) { DEBUG(SSSDBG_CRIT_FAILURE, "Unable to initialize request table " @@ -93,6 +94,22 @@ errno_t dp_init(struct tevent_context *ev, goto done; } + /* Initialize data provider bus. Data provider can receive client + * registration and other D-Bus methods. However no data provider + * request will be executed as long as the modules and targets + * are not initialized. + */ + talloc_set_destructor(provider, dp_destructor); + + ret = dp_init_dbus_server(provider); + if (ret != EOK) { + DEBUG(SSSDBG_FATAL_FAILURE, "Unable to setup service bus [%d]: %s\n", + ret, sss_strerror(ret)); + goto done; + } + + be_ctx->provider = provider; + ret = dp_init_modules(provider, &provider->modules); if (ret != EOK) { DEBUG(SSSDBG_CRIT_FAILURE, "Unable to initialize DP modules " @@ -107,17 +124,6 @@ errno_t dp_init(struct tevent_context *ev, goto done; } - talloc_set_destructor(provider, dp_destructor); - - ret = dp_init_dbus_server(provider); - if (ret != EOK) { - DEBUG(SSSDBG_FATAL_FAILURE, "Unable to setup service bus [%d]: %s\n", - ret, sss_strerror(ret)); - goto done; - } - - be_ctx->provider = provider; - ret = EOK; done: diff --git a/src/providers/data_provider/dp_methods.c b/src/providers/data_provider/dp_methods.c index e4290be..498676d 100644 --- a/src/providers/data_provider/dp_methods.c +++ b/src/providers/data_provider/dp_methods.c @@ -76,6 +76,12 @@ bool dp_method_enabled(struct data_provider *provider, return false; } + if (provider == NULL || provider->targets == NULL) { + DEBUG(SSSDBG_TRACE_FUNC, "Target %s is not yet initialized\n", + dp_target_to_string(target)); + return false; + } + dp_target = provider->targets[target]; if (dp_target == NULL || dp_target->initialized == false) { DEBUG(SSSDBG_TRACE_FUNC, "Target %s is not configured\n",