summaryrefslogtreecommitdiffstats
path: root/src/providers/data_provider_callbacks.c
diff options
context:
space:
mode:
authorJan Zeleny <jzeleny@redhat.com>2012-06-20 13:41:53 -0400
committerJakub Hrozek <jhrozek@redhat.com>2012-08-01 16:19:41 +0200
commit75ee7925a9e289bc24f0ce8a7988cca926b71513 (patch)
tree7518ae48dd0cdce43f7e8639144498ad44070be9 /src/providers/data_provider_callbacks.c
parent6c7057667272d6297924a6ccbf68700e791da0a7 (diff)
downloadsssd-75ee7925a9e289bc24f0ce8a7988cca926b71513.tar.gz
sssd-75ee7925a9e289bc24f0ce8a7988cca926b71513.tar.xz
sssd-75ee7925a9e289bc24f0ce8a7988cca926b71513.zip
Primary server support: introduce concept of reconnection
This patch adds two support functions for adding reconnection callbacks and invoking such callbacks. The concept of reconnection is simple: stop using current connection for for new queries to the server without actually going offline.
Diffstat (limited to 'src/providers/data_provider_callbacks.c')
-rw-r--r--src/providers/data_provider_callbacks.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/providers/data_provider_callbacks.c b/src/providers/data_provider_callbacks.c
index 9d8946a84..0f8fca0b1 100644
--- a/src/providers/data_provider_callbacks.c
+++ b/src/providers/data_provider_callbacks.c
@@ -141,6 +141,41 @@ static errno_t be_run_cb(struct be_ctx *be, struct be_cb *cb_list) {
return EOK;
}
+int be_add_reconnect_cb(TALLOC_CTX *mem_ctx, struct be_ctx *ctx, be_callback_t cb,
+ void *pvt, struct be_cb **reconnect_cb)
+{
+ int ret;
+
+ ret = be_add_cb(mem_ctx, ctx, cb, pvt, &ctx->reconnect_cb_list, reconnect_cb);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("be_add_cb failed.\n"));
+ return ret;
+ }
+
+ return EOK;
+}
+
+void be_run_reconnect_cb(struct be_ctx *be)
+{
+ struct be_cb *callback = be->reconnect_cb_list;
+
+ if (callback) {
+ DEBUG(SSSDBG_TRACE_FUNC, ("Reconnecting. Running callbacks.\n"));
+
+ /**
+ * Call the callback: we have to call this right away
+ * so the provider doesn't go into offline even for
+ * a little while
+ */
+ do {
+ callback->cb(callback->pvt);
+ callback = callback->next;
+ } while(callback != NULL);
+ } else {
+ DEBUG(SSSDBG_TRACE_INTERNAL, ("Reconnect call back list is empty, nothing to do.\n"));
+ }
+}
+
int be_add_online_cb(TALLOC_CTX *mem_ctx, struct be_ctx *ctx, be_callback_t cb,
void *pvt, struct be_cb **online_cb)
{