summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2013-05-19 17:36:54 +0200
committerJakub Hrozek <jhrozek@redhat.com>2013-05-27 19:34:51 +0200
commit3bd78eb2faf09635b8d307e4440ccb1420f80716 (patch)
treec6a5c38c6ad0edf82b81949772e7a14723cf89df
parentbfdb2eeed95bde6cd065a9a47a7cb1773990ccfb (diff)
downloadsssd-3bd78eb2faf09635b8d307e4440ccb1420f80716.tar.gz
sssd-3bd78eb2faf09635b8d307e4440ccb1420f80716.tar.xz
sssd-3bd78eb2faf09635b8d307e4440ccb1420f80716.zip
Fix dyndns timer initialization
The dyndns init function was starting the timer even if the updates were set to False. This patch splits the init of dynamic updates and the timer into two functions so that the back end can start the updates separately from reading the options.
-rw-r--r--src/providers/ad/ad_common.c4
-rw-r--r--src/providers/ad/ad_dyndns.c7
-rw-r--r--src/providers/dp_dyndns.c16
-rw-r--r--src/providers/dp_dyndns.h7
-rw-r--r--src/providers/ipa/ipa_common.c3
-rw-r--r--src/providers/ipa/ipa_dyndns.c7
-rw-r--r--src/tests/cmocka/test_dyndns.c6
7 files changed, 39 insertions, 11 deletions
diff --git a/src/providers/ad/ad_common.c b/src/providers/ad/ad_common.c
index e0a55c6dc..e34199959 100644
--- a/src/providers/ad/ad_common.c
+++ b/src/providers/ad/ad_common.c
@@ -705,8 +705,8 @@ errno_t ad_get_dyndns_options(struct be_ctx *be_ctx,
{
errno_t ret;
- ret = be_nsupdate_init(ad_opts, be_ctx, ad_dyndns_opts, ad_dyndns_timer,
- ad_opts, &ad_opts->dyndns_ctx);
+ ret = be_nsupdate_init(ad_opts, be_ctx, ad_dyndns_opts,
+ &ad_opts->dyndns_ctx);
if (ret != EOK) {
DEBUG(SSSDBG_OP_FAILURE,
("Cannot initialize AD dyndns opts [%d]: %s\n",
diff --git a/src/providers/ad/ad_dyndns.c b/src/providers/ad/ad_dyndns.c
index 2b2d24625..4e9ed852f 100644
--- a/src/providers/ad/ad_dyndns.c
+++ b/src/providers/ad/ad_dyndns.c
@@ -70,6 +70,13 @@ errno_t ad_dyndns_init(struct be_ctx *be_ctx,
return EINVAL;
}
+ ret = be_nsupdate_init_timer(ad_opts->dyndns_ctx, be_ctx->ev,
+ ad_dyndns_timer, ad_opts);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Could not set up periodic update\n"));
+ return ret;
+ }
+
ret = be_add_online_cb(be_ctx, be_ctx,
ad_dyndns_update,
ad_opts, NULL);
diff --git a/src/providers/dp_dyndns.c b/src/providers/dp_dyndns.c
index 8cf42443a..1b710b554 100644
--- a/src/providers/dp_dyndns.c
+++ b/src/providers/dp_dyndns.c
@@ -1181,8 +1181,6 @@ static struct dp_option default_dyndns_opts[] = {
errno_t
be_nsupdate_init(TALLOC_CTX *mem_ctx, struct be_ctx *be_ctx,
struct dp_option *defopts,
- nsupdate_timer_fn_t timer_callback,
- void *timer_pvt,
struct be_nsupdate_ctx **_ctx)
{
errno_t ret;
@@ -1212,10 +1210,20 @@ be_nsupdate_init(TALLOC_CTX *mem_ctx, struct be_ctx *be_ctx,
return EINVAL;
}
+ *_ctx = ctx;
+ return ERR_OK;
+}
+
+errno_t be_nsupdate_init_timer(struct be_nsupdate_ctx *ctx,
+ struct tevent_context *ev,
+ nsupdate_timer_fn_t timer_callback,
+ void *timer_pvt)
+{
+ if (ctx == NULL) return EINVAL;
+
ctx->timer_callback = timer_callback;
ctx->timer_pvt = timer_pvt;
- be_nsupdate_timer_schedule(be_ctx->ev, ctx);
+ be_nsupdate_timer_schedule(ev, ctx);
- *_ctx = ctx;
return ERR_OK;
}
diff --git a/src/providers/dp_dyndns.h b/src/providers/dp_dyndns.h
index 14b2dd08b..1e81c9b91 100644
--- a/src/providers/dp_dyndns.h
+++ b/src/providers/dp_dyndns.h
@@ -67,10 +67,13 @@ errno_t be_nsupdate_check(void);
errno_t
be_nsupdate_init(TALLOC_CTX *mem_ctx, struct be_ctx *be_ctx,
struct dp_option *defopts,
- nsupdate_timer_fn_t timer_callback,
- void *timer_pvt,
struct be_nsupdate_ctx **_ctx);
+errno_t be_nsupdate_init_timer(struct be_nsupdate_ctx *ctx,
+ struct tevent_context *ev,
+ nsupdate_timer_fn_t timer_callback,
+ void *timer_pvt);
+
void be_nsupdate_timer_schedule(struct tevent_context *ev,
struct be_nsupdate_ctx *ctx);
diff --git a/src/providers/ipa/ipa_common.c b/src/providers/ipa/ipa_common.c
index baece274e..509b2abd0 100644
--- a/src/providers/ipa/ipa_common.c
+++ b/src/providers/ipa/ipa_common.c
@@ -1019,8 +1019,7 @@ errno_t ipa_get_dyndns_options(struct be_ctx *be_ctx,
bool update;
int ttl;
- ret = be_nsupdate_init(ctx, be_ctx, ipa_dyndns_opts, ipa_dyndns_timer,
- ctx, &ctx->dyndns_ctx);
+ ret = be_nsupdate_init(ctx, be_ctx, ipa_dyndns_opts, &ctx->dyndns_ctx);
if (ret != EOK) {
DEBUG(SSSDBG_OP_FAILURE,
("Cannot initialize IPA dyndns opts [%d]: %s\n",
diff --git a/src/providers/ipa/ipa_dyndns.c b/src/providers/ipa/ipa_dyndns.c
index 81dae94a5..4e75a197a 100644
--- a/src/providers/ipa/ipa_dyndns.c
+++ b/src/providers/ipa/ipa_dyndns.c
@@ -44,6 +44,13 @@ errno_t ipa_dyndns_init(struct be_ctx *be_ctx,
return EINVAL;
}
+ ret = be_nsupdate_init_timer(ctx->dyndns_ctx, be_ctx->ev,
+ ipa_dyndns_timer, ctx);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Could not set up periodic update\n"));
+ return ret;
+ }
+
ret = be_add_online_cb(be_ctx, be_ctx,
ipa_dyndns_update,
ctx, NULL);
diff --git a/src/tests/cmocka/test_dyndns.c b/src/tests/cmocka/test_dyndns.c
index 6d5219d71..f804d7926 100644
--- a/src/tests/cmocka/test_dyndns.c
+++ b/src/tests/cmocka/test_dyndns.c
@@ -311,10 +311,14 @@ void dyndns_test_interval(void **state)
check_leaks_push(tmp_ctx);
ret = be_nsupdate_init(tmp_ctx, dyndns_test_ctx->be_ctx, NULL,
- dyndns_test_timer, dyndns_test_ctx,
&dyndns_test_ctx->update_ctx);
assert_int_equal(ret, EOK);
+ ret = be_nsupdate_init_timer(dyndns_test_ctx->update_ctx,
+ dyndns_test_ctx->be_ctx->ev,
+ dyndns_test_timer, dyndns_test_ctx);
+ assert_int_equal(ret, EOK);
+
/* Wait until the timer hits */
ret = test_ev_loop(dyndns_test_ctx->tctx);
DEBUG(SSSDBG_TRACE_LIBS,