>From 80cdb0125e626d77b5ede31d61bd01daa29dd66c Mon Sep 17 00:00:00 2001 From: eindenbom Date: Tue, 29 Jun 2010 17:48:31 +0400 Subject: [PATCH 11/12] Use new LDAP connection framework in IPA dynamic DNS forwarder. --- src/providers/ipa/ipa_dyndns.c | 8 +++- src/providers/ldap/sdap_async_connection.c | 7 --- src/providers/ldap/sdap_id_op.c | 57 ++++++++++++++++++++++++++++ src/providers/ldap/sdap_id_op.h | 6 +++ 4 files changed, 70 insertions(+), 8 deletions(-) diff --git a/src/providers/ipa/ipa_dyndns.c b/src/providers/ipa/ipa_dyndns.c index a86c696..8e572d0 100644 --- a/src/providers/ipa/ipa_dyndns.c +++ b/src/providers/ipa/ipa_dyndns.c @@ -86,6 +86,7 @@ ipa_dyndns_update_send(struct ipa_options *ctx) char *iface; char *ipa_hostname; struct ipa_dyndns_ctx *state; + struct sdap_handle *sh; struct sockaddr sa; socklen_t sa_len = sizeof(sa); struct ifaddrs *ifaces; @@ -143,8 +144,13 @@ ipa_dyndns_update_send(struct ipa_options *ctx) } else { + sh = sdap_id_get_cached_connection(ctx->id_ctx->conn_cache); + if (!sh || !sh->ldap) { + goto failed; + } + /* Get the file descriptor for the primary LDAP connection */ - ret = get_fd_from_ldap(ctx->id_ctx->gsh->ldap, &fd); + ret = get_fd_from_ldap(sh->ldap, &fd); if (ret != EOK) { goto failed; } diff --git a/src/providers/ldap/sdap_async_connection.c b/src/providers/ldap/sdap_async_connection.c index 999cb65..3770fea 100644 --- a/src/providers/ldap/sdap_async_connection.c +++ b/src/providers/ldap/sdap_async_connection.c @@ -1181,8 +1181,6 @@ static void sdap_cli_auth_done(struct tevent_req *subreq) { struct tevent_req *req = tevent_req_callback_data(subreq, struct tevent_req); - struct sdap_cli_connect_state *state = tevent_req_data(req, - struct sdap_cli_connect_state); enum sdap_result result; int ret; @@ -1197,11 +1195,6 @@ static void sdap_cli_auth_done(struct tevent_req *subreq) return; } - /* Reconnection succeeded - * Run any post-connection routines - */ - be_run_online_cb(state->be); - tevent_req_done(req); } diff --git a/src/providers/ldap/sdap_id_op.c b/src/providers/ldap/sdap_id_op.c index 16fba6c..32c787a 100644 --- a/src/providers/ldap/sdap_id_op.c +++ b/src/providers/ldap/sdap_id_op.c @@ -627,6 +627,10 @@ static void sdap_id_op_connect_done(struct tevent_req *subreq) if (ret == EOK && conn_data->sh->connected && !be_is_offline(conn_cache->be)) { DEBUG(9, ("caching successful connection after %d notifies\n", notify_count)); conn_cache->cached_connection = conn_data; + + /* Run any post-connection routines */ + be_run_online_cb(conn_cache->be); + } else { if (conn_cache->cached_connection == conn_data) { conn_cache->cached_connection = NULL; @@ -676,6 +680,59 @@ int sdap_id_op_connect_recv(struct tevent_req *req, int *dp_error) return state->result; } +/* Acquire a cached connection to LDAP server if any. */ +struct sdap_handle *sdap_id_op_connect_cached(struct sdap_id_op *op) +{ + struct sdap_id_conn_data *conn_data; + + if (!op || op->connect_req) { + /* Connection already in progress, invalid operation */ + return NULL; + } + + conn_data = op->conn_data; + if (conn_data) { + return conn_data->sh; + } + + conn_data = op->conn_cache->cached_connection; + if (!conn_data) { + return NULL; + } + + if (conn_data->connect_req) { + /* Connection is still in progress */ + return NULL; + } + + if (!sdap_can_reuse_connection(conn_data)) { + DEBUG(9, ("releasing expired cached connection\n")); + op->conn_cache->cached_connection = NULL; + sdap_id_release_conn_data(conn_data); + return NULL; + } + + sdap_id_op_hook_conn_data(op, conn_data); + return conn_data->sh; +} + +/* Get a cached connection to LDAP server if any. */ +struct sdap_handle *sdap_id_get_cached_connection(struct sdap_id_conn_cache *conn_cache) +{ + struct sdap_id_conn_data *conn_data; + + if (!conn_cache) { + return NULL; + } + + conn_data = conn_cache->cached_connection; + if (!conn_data || conn_data->connect_req) { + return NULL; + } + + return conn_data->sh; +} + /* Report completion of LDAP operation and release associated connection. * Returns operation result (possible updated) passed in ret parameter. * diff --git a/src/providers/ldap/sdap_id_op.h b/src/providers/ldap/sdap_id_op.h index 658c151..a1cffa3 100644 --- a/src/providers/ldap/sdap_id_op.h +++ b/src/providers/ldap/sdap_id_op.h @@ -61,6 +61,12 @@ struct tevent_req *sdap_id_op_connect_send(struct sdap_id_op *op, */ int sdap_id_op_connect_recv(struct tevent_req *req, int *dp_error); +/* Acquire a cached connection to LDAP server if any. */ +struct sdap_handle *sdap_id_op_connect_cached(struct sdap_id_op *conn_cache); + +/* Get a cached connection to LDAP server if any (to query attributes only). */ +struct sdap_handle *sdap_id_get_cached_connection(struct sdap_id_conn_cache *op); + /* Report completion of LDAP operation and release associated connection. * Returns operation result (possible updated) passed in ret parameter. * -- 1.6.6.1