summaryrefslogtreecommitdiffstats
path: root/src/providers/ldap/sdap_id_op.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/providers/ldap/sdap_id_op.c')
-rw-r--r--src/providers/ldap/sdap_id_op.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/providers/ldap/sdap_id_op.c b/src/providers/ldap/sdap_id_op.c
index 3036d0cc1..034813012 100644
--- a/src/providers/ldap/sdap_id_op.c
+++ b/src/providers/ldap/sdap_id_op.c
@@ -519,6 +519,8 @@ done:
return ret;
}
+static void sdap_id_op_connect_reinit_done(struct tevent_req *req);
+
/* Subrequest callback for connection completion */
static void sdap_id_op_connect_done(struct tevent_req *subreq)
{
@@ -529,6 +531,8 @@ static void sdap_id_op_connect_done(struct tevent_req *subreq)
struct sdap_server_opts *current_srv_opts = NULL;
bool can_retry = false;
bool is_offline = false;
+ struct tevent_req *reinit_req = NULL;
+ bool reinit = false;
int ret;
ret = sdap_cli_connect_recv(subreq, conn_data, &can_retry,
@@ -570,6 +574,8 @@ static void sdap_id_op_connect_done(struct tevent_req *subreq)
current_srv_opts->max_service_value = 0;
current_srv_opts->max_sudo_value = 0;
current_srv_opts->last_usn = srv_opts->last_usn;
+
+ reinit = true;
}
}
ret = sdap_id_conn_data_set_expire_timer(conn_data);
@@ -694,6 +700,38 @@ static void sdap_id_op_connect_done(struct tevent_req *subreq)
sdap_id_release_conn_data(conn_data);
}
+
+ if (reinit) {
+ DEBUG(SSSDBG_TRACE_FUNC, ("Server reinitialization detected. "
+ "Cleaning cache.\n"));
+ reinit_req = sdap_reinit_cleanup_send(conn_cache->id_ctx->be,
+ conn_cache->id_ctx->be,
+ conn_cache->id_ctx);
+ if (reinit_req == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Unable to perform reinitialization "
+ "clean up.\n"));
+ return;
+ }
+
+ tevent_req_set_callback(reinit_req, sdap_id_op_connect_reinit_done,
+ NULL);
+ }
+}
+
+static void sdap_id_op_connect_reinit_done(struct tevent_req *req)
+{
+ errno_t ret;
+
+ ret = sdap_reinit_cleanup_recv(req);
+ talloc_zfree(req);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Unable to perform reinitialization "
+ "clean up [%d]: %s\n", ret, strerror(ret)));
+ /* not fatal */
+ return;
+ }
+
+ DEBUG(SSSDBG_TRACE_FUNC, ("Reinitialization clean up completed\n"));
}
/* Mark operation connection request as complete */