summaryrefslogtreecommitdiff
path: root/src/providers/ldap
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2013-04-30 18:55:29 +0200
committerJakub Hrozek <jhrozek@redhat.com>2013-05-03 20:31:38 +0200
commit33df734b39538eeb870b118b7feea76f90bb004b (patch)
tree9b8001f2c585596b33308a4ed233fb7e4b864735 /src/providers/ldap
parente15a9f81eb33066937710d7dee6976a3646d119c (diff)
downloadsssd-33df734b39538eeb870b118b7feea76f90bb004b.tar.gz
sssd-33df734b39538eeb870b118b7feea76f90bb004b.tar.bz2
sssd-33df734b39538eeb870b118b7feea76f90bb004b.zip
Split out the common code from timed DNS updates
Diffstat (limited to 'src/providers/ldap')
-rw-r--r--src/providers/ldap/sdap_dyndns.c108
-rw-r--r--src/providers/ldap/sdap_dyndns.h13
2 files changed, 121 insertions, 0 deletions
diff --git a/src/providers/ldap/sdap_dyndns.c b/src/providers/ldap/sdap_dyndns.c
index fbeb6a3d..d7e20ca4 100644
--- a/src/providers/ldap/sdap_dyndns.c
+++ b/src/providers/ldap/sdap_dyndns.c
@@ -627,3 +627,111 @@ sdap_dyndns_get_addrs_recv(struct tevent_req *req,
*_addresses = talloc_steal(mem_ctx, state->addresses);
return EOK;
}
+
+struct sdap_dyndns_timer_state {
+ struct tevent_context *ev;
+ struct sdap_id_ctx *sdap_ctx;
+ struct be_nsupdate_ctx *dyndns_ctx;
+
+ struct sdap_id_op *sdap_op;
+};
+
+static void sdap_dyndns_timer_conn_done(struct tevent_req *req);
+
+struct tevent_req *
+sdap_dyndns_timer_conn_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct sdap_id_ctx *sdap_ctx,
+ struct be_nsupdate_ctx *dyndns_ctx)
+{
+ struct sdap_dyndns_timer_state *state;
+ struct tevent_req *req;
+ struct tevent_req *subreq;
+ errno_t ret;
+
+ req = tevent_req_create(mem_ctx, &state, struct sdap_dyndns_timer_state);
+ if (req == NULL) {
+ return NULL;
+ }
+ state->ev = ev;
+ state->sdap_ctx = sdap_ctx;
+ state->dyndns_ctx = dyndns_ctx;
+
+ /* In order to prevent the connection triggering an
+ * online callback which would in turn trigger a concurrent DNS
+ * update
+ */
+ state->dyndns_ctx->timer_in_progress = true;
+
+ /* Make sure to have a valid LDAP connection */
+ state->sdap_op = sdap_id_op_create(state, state->sdap_ctx->conn_cache);
+ if (state->sdap_op == NULL) {
+ DEBUG(SSSDBG_OP_FAILURE, ("sdap_id_op_create failed\n"));
+ ret = ENOMEM;
+ goto fail;
+ }
+
+ subreq = sdap_id_op_connect_send(state->sdap_op, state, &ret);
+ if (subreq == NULL) {
+ DEBUG(SSSDBG_OP_FAILURE, ("sdap_id_op_connect_send failed: [%d](%s)\n",
+ ret, sss_strerror(ret)));
+ ret = ENOMEM;
+ goto fail;
+ }
+ tevent_req_set_callback(subreq, sdap_dyndns_timer_conn_done, req);
+ return req;
+
+fail:
+ dyndns_ctx->timer_in_progress = false;
+ be_nsupdate_timer_schedule(ev, dyndns_ctx);
+ tevent_req_error(req, ret);
+ tevent_req_post(req, ev);
+ return req;
+}
+
+
+static void
+sdap_dyndns_timer_conn_done(struct tevent_req *subreq)
+{
+ struct tevent_req *req = tevent_req_callback_data(subreq,
+ struct tevent_req);
+ struct sdap_dyndns_timer_state *state = tevent_req_data(req,
+ struct sdap_dyndns_timer_state);
+ errno_t ret;
+ int dp_error;
+
+ state->dyndns_ctx->timer_in_progress = false;
+
+ ret = sdap_id_op_connect_recv(subreq, &dp_error);
+ talloc_zfree(subreq);
+ if (ret != EOK) {
+ if (dp_error == DP_ERR_OFFLINE) {
+ DEBUG(SSSDBG_MINOR_FAILURE, ("No server is available, "
+ "dynamic DNS update is skipped in offline mode.\n"));
+ /* Another timer will be scheduled when provider goes online */
+ tevent_req_error(req, ERR_DYNDNS_OFFLINE);
+ } else {
+ DEBUG(SSSDBG_OP_FAILURE,
+ ("Failed to connect to LDAP server: [%d](%s)\n",
+ ret, sss_strerror(ret)));
+
+ /* Just schedule another dyndns retry */
+ be_nsupdate_timer_schedule(state->ev, state->dyndns_ctx);
+ tevent_req_error(req, ERR_NETWORK_IO);
+ }
+ return;
+ }
+
+ /* All OK, schedule another refresh and let the user call its
+ * provider-specific update
+ */
+ be_nsupdate_timer_schedule(state->ev, state->dyndns_ctx);
+ tevent_req_done(req);
+}
+
+errno_t
+sdap_dyndns_timer_conn_recv(struct tevent_req *req)
+{
+ TEVENT_REQ_RETURN_ON_ERROR(req);
+ return EOK;
+}
diff --git a/src/providers/ldap/sdap_dyndns.h b/src/providers/ldap/sdap_dyndns.h
index 66de64a5..7aaff5d2 100644
--- a/src/providers/ldap/sdap_dyndns.h
+++ b/src/providers/ldap/sdap_dyndns.h
@@ -47,4 +47,17 @@ sdap_dyndns_update_send(TALLOC_CTX *mem_ctx,
errno_t sdap_dyndns_update_recv(struct tevent_req *req);
+/* Connects to the LDAP server in order to read the address from the
+ * socket and be able to perform dynamic DNS updates. Reschedules the
+ * task automatically on errors and sets/resets the timer_in_progress
+ * guard in be_nsupdate_ctx.
+ */
+struct tevent_req *
+sdap_dyndns_timer_conn_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct sdap_id_ctx *sdap_ctx,
+ struct be_nsupdate_ctx *dyndns_ctx);
+
+errno_t sdap_dyndns_timer_conn_recv(struct tevent_req *req);
+
#endif /* SDAP_DYNDNS_H_ */