Blame SOURCES/0060-BE-IPA-AD-LDAP-Initialize-the-refresh-callback-from-.patch

5fca41
From 09901039f2b6a34552ce6ed82d06d4ab04f890a9 Mon Sep 17 00:00:00 2001
5fca41
From: Jakub Hrozek <jhrozek@redhat.com>
5fca41
Date: Tue, 25 Jun 2019 15:05:59 +0200
5fca41
Subject: [PATCH 60/64] BE/IPA/AD/LDAP: Initialize the refresh callback from a
5fca41
 list to reduce logic duplication
5fca41
5fca41
Related: https://pagure.io/SSSD/sssd/issue/4012
5fca41
5fca41
This patch slightly increases the line count, but on the other hand the
5fca41
code is now more declarative and contains less logic, which should
5fca41
hopefully decrease the maintenance cost in the future.
5fca41
5fca41
Reviewed-by: Sumit Bose <sbose@redhat.com>
5fca41
(cherry picked from commit 792235097b9b63593dc717440aab48e8671fbf12)
5fca41
5fca41
Reviewed-by: Sumit Bose <sbose@redhat.com>
5fca41
---
5fca41
 src/providers/ad/ad_refresh.c     |  66 ++++++----------
5fca41
 src/providers/be_refresh.c        | 126 +++++++++++++++++++++++-------
5fca41
 src/providers/be_refresh.h        |  17 ++--
5fca41
 src/providers/ipa/ipa_refresh.c   |  70 ++++++-----------
5fca41
 src/providers/ldap/sdap_refresh.c |  58 ++++++--------
5fca41
 5 files changed, 179 insertions(+), 158 deletions(-)
5fca41
5fca41
diff --git a/src/providers/ad/ad_refresh.c b/src/providers/ad/ad_refresh.c
5fca41
index f0130cbaf..ed51b305a 100644
5fca41
--- a/src/providers/ad/ad_refresh.c
5fca41
+++ b/src/providers/ad/ad_refresh.c
5fca41
@@ -260,52 +260,32 @@ errno_t ad_refresh_init(struct be_ctx *be_ctx,
5fca41
                         struct ad_id_ctx *id_ctx)
5fca41
 {
5fca41
     errno_t ret;
5fca41
-
5fca41
-    ret = be_refresh_ctx_init(be_ctx, SYSDB_SID_STR);
5fca41
+    struct be_refresh_cb ad_refresh_callbacks[] = {
5fca41
+        { .send_fn = ad_refresh_initgroups_send,
5fca41
+          .recv_fn = ad_refresh_initgroups_recv,
5fca41
+          .pvt = id_ctx,
5fca41
+        },
5fca41
+        { .send_fn = ad_refresh_users_send,
5fca41
+          .recv_fn = ad_refresh_users_recv,
5fca41
+          .pvt = id_ctx,
5fca41
+        },
5fca41
+        { .send_fn = ad_refresh_groups_send,
5fca41
+          .recv_fn = ad_refresh_groups_recv,
5fca41
+          .pvt = id_ctx,
5fca41
+        },
5fca41
+        { .send_fn = ad_refresh_netgroups_send,
5fca41
+          .recv_fn = ad_refresh_netgroups_recv,
5fca41
+          .pvt = id_ctx,
5fca41
+        },
5fca41
+    };
5fca41
+
5fca41
+    ret = be_refresh_ctx_init_with_callbacks(be_ctx,
5fca41
+                                             SYSDB_SID_STR,
5fca41
+                                             ad_refresh_callbacks);
5fca41
     if (ret != EOK) {
5fca41
-        DEBUG(SSSDBG_FATAL_FAILURE, "Unable to initialize refresh_ctx\n");
5fca41
+        DEBUG(SSSDBG_FATAL_FAILURE, "Unable to initialize background refresh\n");
5fca41
         return ret;
5fca41
     }
5fca41
 
5fca41
-    ret = be_refresh_add_cb(be_ctx->refresh_ctx,
5fca41
-                            BE_REFRESH_TYPE_INITGROUPS,
5fca41
-                            ad_refresh_initgroups_send,
5fca41
-                            ad_refresh_initgroups_recv,
5fca41
-                            id_ctx);
5fca41
-    if (ret != EOK && ret != EEXIST) {
5fca41
-        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of users "
5fca41
-              "will not work [%d]: %s\n", ret, strerror(ret));
5fca41
-    }
5fca41
-
5fca41
-    ret = be_refresh_add_cb(be_ctx->refresh_ctx,
5fca41
-                            BE_REFRESH_TYPE_USERS,
5fca41
-                            ad_refresh_users_send,
5fca41
-                            ad_refresh_users_recv,
5fca41
-                            id_ctx);
5fca41
-    if (ret != EOK && ret != EEXIST) {
5fca41
-        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of users "
5fca41
-              "will not work [%d]: %s\n", ret, strerror(ret));
5fca41
-    }
5fca41
-
5fca41
-    ret = be_refresh_add_cb(be_ctx->refresh_ctx,
5fca41
-                            BE_REFRESH_TYPE_GROUPS,
5fca41
-                            ad_refresh_groups_send,
5fca41
-                            ad_refresh_groups_recv,
5fca41
-                            id_ctx);
5fca41
-    if (ret != EOK && ret != EEXIST) {
5fca41
-        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of groups "
5fca41
-              "will not work [%d]: %s\n", ret, strerror(ret));
5fca41
-    }
5fca41
-
5fca41
-    ret = be_refresh_add_cb(be_ctx->refresh_ctx,
5fca41
-                            BE_REFRESH_TYPE_NETGROUPS,
5fca41
-                            ad_refresh_netgroups_send,
5fca41
-                            ad_refresh_netgroups_recv,
5fca41
-                            id_ctx);
5fca41
-    if (ret != EOK && ret != EEXIST) {
5fca41
-        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of netgroups "
5fca41
-              "will not work [%d]: %s\n", ret, strerror(ret));
5fca41
-    }
5fca41
-
5fca41
     return ret;
5fca41
 }
5fca41
diff --git a/src/providers/be_refresh.c b/src/providers/be_refresh.c
5fca41
index 6945ca9e3..8f50e231d 100644
5fca41
--- a/src/providers/be_refresh.c
5fca41
+++ b/src/providers/be_refresh.c
5fca41
@@ -138,21 +138,19 @@ static errno_t be_refresh_get_values(TALLOC_CTX *mem_ctx,
5fca41
     return ret;
5fca41
 }
5fca41
 
5fca41
-struct be_refresh_cb {
5fca41
+struct be_refresh_cb_ctx {
5fca41
     const char *name;
5fca41
     const char *attr_name;
5fca41
     bool enabled;
5fca41
-    be_refresh_send_t send_fn;
5fca41
-    be_refresh_recv_t recv_fn;
5fca41
-    void *pvt;
5fca41
+    struct be_refresh_cb cb;
5fca41
 };
5fca41
 
5fca41
 struct be_refresh_ctx {
5fca41
-    struct be_refresh_cb callbacks[BE_REFRESH_TYPE_SENTINEL];
5fca41
+    struct be_refresh_cb_ctx callbacks[BE_REFRESH_TYPE_SENTINEL];
5fca41
 };
5fca41
 
5fca41
-errno_t be_refresh_ctx_init(struct be_ctx *be_ctx,
5fca41
-                            const char *attr_name)
5fca41
+static errno_t be_refresh_ctx_init(struct be_ctx *be_ctx,
5fca41
+                                   const char *attr_name)
5fca41
 {
5fca41
     struct be_refresh_ctx *ctx = NULL;
5fca41
     uint32_t refresh_interval;
5fca41
@@ -193,13 +191,11 @@ errno_t be_refresh_ctx_init(struct be_ctx *be_ctx,
5fca41
     return EOK;
5fca41
 }
5fca41
 
5fca41
-errno_t be_refresh_add_cb(struct be_refresh_ctx *ctx,
5fca41
-                          enum be_refresh_type type,
5fca41
-                          be_refresh_send_t send_fn,
5fca41
-                          be_refresh_recv_t recv_fn,
5fca41
-                          void *pvt)
5fca41
+static errno_t be_refresh_add_cb(struct be_refresh_ctx *ctx,
5fca41
+                                 enum be_refresh_type type,
5fca41
+                                 struct be_refresh_cb *cb)
5fca41
 {
5fca41
-    if (ctx == NULL || send_fn == NULL || recv_fn == NULL
5fca41
+    if (ctx == NULL || cb->send_fn == NULL || cb->recv_fn == NULL
5fca41
             || type >= BE_REFRESH_TYPE_SENTINEL) {
5fca41
         return EINVAL;
5fca41
     }
5fca41
@@ -209,9 +205,78 @@ errno_t be_refresh_add_cb(struct be_refresh_ctx *ctx,
5fca41
     }
5fca41
 
5fca41
     ctx->callbacks[type].enabled = true;
5fca41
-    ctx->callbacks[type].send_fn = send_fn;
5fca41
-    ctx->callbacks[type].recv_fn = recv_fn;
5fca41
-    ctx->callbacks[type].pvt = pvt;
5fca41
+    ctx->callbacks[type].cb.send_fn = cb->send_fn;
5fca41
+    ctx->callbacks[type].cb.recv_fn = cb->recv_fn;
5fca41
+    ctx->callbacks[type].cb.pvt = cb->pvt;
5fca41
+
5fca41
+    return EOK;
5fca41
+}
5fca41
+
5fca41
+static errno_t be_refresh_set_callbacks(struct be_refresh_ctx *refresh_ctx,
5fca41
+                                        struct be_refresh_cb *callbacks)
5fca41
+{
5fca41
+    errno_t ret;
5fca41
+
5fca41
+    if (callbacks == NULL || refresh_ctx == NULL) {
5fca41
+        return EINVAL;
5fca41
+    }
5fca41
+
5fca41
+    ret = be_refresh_add_cb(refresh_ctx,
5fca41
+                            BE_REFRESH_TYPE_INITGROUPS,
5fca41
+                            &callbacks[BE_REFRESH_TYPE_INITGROUPS]);
5fca41
+    if (ret != EOK && ret != EEXIST) {
5fca41
+        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of initgroups "
5fca41
+              "will not work [%d]: %s\n", ret, strerror(ret));
5fca41
+    }
5fca41
+
5fca41
+    ret = be_refresh_add_cb(refresh_ctx,
5fca41
+                            BE_REFRESH_TYPE_USERS,
5fca41
+                            &callbacks[BE_REFRESH_TYPE_USERS]);
5fca41
+    if (ret != EOK && ret != EEXIST) {
5fca41
+        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of users "
5fca41
+              "will not work [%d]: %s\n", ret, strerror(ret));
5fca41
+    }
5fca41
+
5fca41
+    ret = be_refresh_add_cb(refresh_ctx,
5fca41
+                            BE_REFRESH_TYPE_GROUPS,
5fca41
+                            &callbacks[BE_REFRESH_TYPE_GROUPS]);
5fca41
+    if (ret != EOK && ret != EEXIST) {
5fca41
+        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of groups "
5fca41
+              "will not work [%d]: %s\n", ret, strerror(ret));
5fca41
+    }
5fca41
+
5fca41
+    ret = be_refresh_add_cb(refresh_ctx,
5fca41
+                            BE_REFRESH_TYPE_NETGROUPS,
5fca41
+                            &callbacks[BE_REFRESH_TYPE_NETGROUPS]);
5fca41
+    if (ret != EOK && ret != EEXIST) {
5fca41
+        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of netgroups "
5fca41
+              "will not work [%d]: %s\n", ret, strerror(ret));
5fca41
+    }
5fca41
+
5fca41
+    return EOK;
5fca41
+}
5fca41
+
5fca41
+errno_t be_refresh_ctx_init_with_callbacks(struct be_ctx *be_ctx,
5fca41
+                                           const char *attr_name,
5fca41
+                                           struct be_refresh_cb *callbacks)
5fca41
+{
5fca41
+    errno_t ret;
5fca41
+
5fca41
+    if (be_ctx == NULL || attr_name == NULL || callbacks == NULL) {
5fca41
+        return EINVAL;
5fca41
+    }
5fca41
+
5fca41
+    ret = be_refresh_ctx_init(be_ctx, attr_name);
5fca41
+    if (ret != EOK) {
5fca41
+        DEBUG(SSSDBG_FATAL_FAILURE, "Unable to initialize refresh_ctx\n");
5fca41
+        return ret;
5fca41
+    }
5fca41
+
5fca41
+    ret = be_refresh_set_callbacks(be_ctx->refresh_ctx, callbacks);
5fca41
+    if (ret != EOK) {
5fca41
+        DEBUG(SSSDBG_FATAL_FAILURE, "Unable to initialize refresh callbacks\n");
5fca41
+        return ENOMEM;
5fca41
+    }
5fca41
 
5fca41
     return EOK;
5fca41
 }
5fca41
@@ -220,7 +285,7 @@ struct be_refresh_state {
5fca41
     struct tevent_context *ev;
5fca41
     struct be_ctx *be_ctx;
5fca41
     struct be_refresh_ctx *ctx;
5fca41
-    struct be_refresh_cb *cb;
5fca41
+    struct be_refresh_cb_ctx *cb_ctx;
5fca41
 
5fca41
     struct sss_domain_info *domain;
5fca41
     enum be_refresh_type index;
5fca41
@@ -308,10 +373,11 @@ static errno_t be_refresh_step(struct tevent_req *req)
5fca41
 
5fca41
     while (state->domain != NULL) {
5fca41
         /* find first enabled callback */
5fca41
-        state->cb = &state->ctx->callbacks[state->index];
5fca41
-        while (state->index != BE_REFRESH_TYPE_SENTINEL && !state->cb->enabled) {
5fca41
+        state->cb_ctx = &state->ctx->callbacks[state->index];
5fca41
+        while (state->index != BE_REFRESH_TYPE_SENTINEL
5fca41
+                && !state->cb_ctx->enabled) {
5fca41
             state->index++;
5fca41
-            state->cb = &state->ctx->callbacks[state->index];
5fca41
+            state->cb_ctx = &state->ctx->callbacks[state->index];
5fca41
         }
5fca41
 
5fca41
         /* if not found than continue with next domain */
5fca41
@@ -322,14 +388,16 @@ static errno_t be_refresh_step(struct tevent_req *req)
5fca41
             continue;
5fca41
         }
5fca41
 
5fca41
-        if (state->cb->send_fn == NULL || state->cb->recv_fn == NULL) {
5fca41
+        if (state->cb_ctx->cb.send_fn == NULL
5fca41
+                || state->cb_ctx->cb.recv_fn == NULL) {
5fca41
             DEBUG(SSSDBG_CRIT_FAILURE, "Invalid parameters!\n");
5fca41
             ret = ERR_INTERNAL;
5fca41
             goto done;
5fca41
         }
5fca41
 
5fca41
         talloc_zfree(state->refresh_values);
5fca41
-        ret = be_refresh_get_values(state, state->index, state->cb->attr_name,
5fca41
+        ret = be_refresh_get_values(state, state->index,
5fca41
+                                    state->cb_ctx->attr_name,
5fca41
                                     state->domain, state->period,
5fca41
                                     &state->refresh_values);
5fca41
         if (ret != EOK) {
5fca41
@@ -343,7 +411,9 @@ static errno_t be_refresh_step(struct tevent_req *req)
5fca41
              state->refresh_val_size++);
5fca41
 
5fca41
         DEBUG(SSSDBG_TRACE_FUNC, "Refreshing %zu %s in domain %s\n",
5fca41
-              state->refresh_val_size, state->cb->name, state->domain->name);
5fca41
+              state->refresh_val_size,
5fca41
+              state->cb_ctx->name,
5fca41
+              state->domain->name);
5fca41
 
5fca41
         ret = be_refresh_batch_step(req, 0);
5fca41
         if (ret == EOK) {
5fca41
@@ -416,10 +486,10 @@ static void be_refresh_batch_step_wakeup(struct tevent_context *ev,
5fca41
     state = tevent_req_data(req, struct be_refresh_state);
5fca41
 
5fca41
     DEBUG(SSSDBG_TRACE_INTERNAL, "Issuing refresh\n");
5fca41
-    subreq = state->cb->send_fn(state, state->ev, state->be_ctx,
5fca41
-                                state->domain,
5fca41
-                                state->refresh_batch,
5fca41
-                                state->cb->pvt);
5fca41
+    subreq = state->cb_ctx->cb.send_fn(state, state->ev, state->be_ctx,
5fca41
+                                       state->domain,
5fca41
+                                       state->refresh_batch,
5fca41
+                                       state->cb_ctx->cb.pvt);
5fca41
     if (subreq == NULL) {
5fca41
         tevent_req_error(req, ENOMEM);
5fca41
         return;
5fca41
@@ -436,7 +506,7 @@ static void be_refresh_done(struct tevent_req *subreq)
5fca41
     req = tevent_req_callback_data(subreq, struct tevent_req);
5fca41
     state = tevent_req_data(req, struct be_refresh_state);
5fca41
 
5fca41
-    ret = state->cb->recv_fn(subreq);
5fca41
+    ret = state->cb_ctx->cb.recv_fn(subreq);
5fca41
     talloc_zfree(subreq);
5fca41
     if (ret != EOK) {
5fca41
         goto done;
5fca41
diff --git a/src/providers/be_refresh.h b/src/providers/be_refresh.h
5fca41
index 4ac5b70c2..42d73d938 100644
5fca41
--- a/src/providers/be_refresh.h
5fca41
+++ b/src/providers/be_refresh.h
5fca41
@@ -51,16 +51,17 @@ enum be_refresh_type {
5fca41
     BE_REFRESH_TYPE_SENTINEL
5fca41
 };
5fca41
 
5fca41
-struct be_refresh_ctx;
5fca41
+struct be_refresh_cb {
5fca41
+    be_refresh_send_t send_fn;
5fca41
+    be_refresh_recv_t recv_fn;
5fca41
+    void *pvt;
5fca41
+};
5fca41
 
5fca41
-errno_t be_refresh_ctx_init(struct be_ctx *be_ctx,
5fca41
-                            const char *attr_name);
5fca41
+struct be_refresh_ctx;
5fca41
 
5fca41
-errno_t be_refresh_add_cb(struct be_refresh_ctx *ctx,
5fca41
-                          enum be_refresh_type type,
5fca41
-                          be_refresh_send_t send_fn,
5fca41
-                          be_refresh_recv_t recv_fn,
5fca41
-                          void *pvt);
5fca41
+errno_t be_refresh_ctx_init_with_callbacks(struct be_ctx *be_ctx,
5fca41
+                                           const char *attr_name,
5fca41
+                                           struct be_refresh_cb *callbacks);
5fca41
 
5fca41
 struct tevent_req *be_refresh_send(TALLOC_CTX *mem_ctx,
5fca41
                                    struct tevent_context *ev,
5fca41
diff --git a/src/providers/ipa/ipa_refresh.c b/src/providers/ipa/ipa_refresh.c
5fca41
index bb47b0edf..7b05cf9e4 100644
5fca41
--- a/src/providers/ipa/ipa_refresh.c
5fca41
+++ b/src/providers/ipa/ipa_refresh.c
5fca41
@@ -240,52 +240,32 @@ errno_t ipa_refresh_init(struct be_ctx *be_ctx,
5fca41
                          struct ipa_id_ctx *id_ctx)
5fca41
 {
5fca41
     errno_t ret;
5fca41
-
5fca41
-    ret = be_refresh_ctx_init(be_ctx, SYSDB_NAME);
5fca41
+    struct be_refresh_cb ipa_refresh_callbacks[] = {
5fca41
+        { .send_fn = ipa_refresh_initgroups_send,
5fca41
+          .recv_fn = ipa_refresh_initgroups_recv,
5fca41
+          .pvt = id_ctx,
5fca41
+        },
5fca41
+        { .send_fn = ipa_refresh_users_send,
5fca41
+          .recv_fn = ipa_refresh_users_recv,
5fca41
+          .pvt = id_ctx,
5fca41
+        },
5fca41
+        { .send_fn = ipa_refresh_groups_send,
5fca41
+          .recv_fn = ipa_refresh_groups_recv,
5fca41
+          .pvt = id_ctx,
5fca41
+        },
5fca41
+        { .send_fn = ipa_refresh_netgroups_send,
5fca41
+          .recv_fn = ipa_refresh_netgroups_recv,
5fca41
+          .pvt = id_ctx,
5fca41
+        },
5fca41
+    };
5fca41
+
5fca41
+    ret = be_refresh_ctx_init_with_callbacks(be_ctx,
5fca41
+                                             SYSDB_NAME,
5fca41
+                                             ipa_refresh_callbacks);
5fca41
     if (ret != EOK) {
5fca41
-        DEBUG(SSSDBG_FATAL_FAILURE, "Unable to initialize refresh_ctx\n");
5fca41
-        return ENOMEM;
5fca41
-    }
5fca41
-
5fca41
-    ret = be_refresh_add_cb(be_ctx->refresh_ctx,
5fca41
-                            BE_REFRESH_TYPE_USERS,
5fca41
-                            ipa_refresh_initgroups_send,
5fca41
-                            ipa_refresh_initgroups_recv,
5fca41
-                            id_ctx);
5fca41
-    if (ret != EOK && ret != EEXIST) {
5fca41
-        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of initgroups "
5fca41
-              "will not work [%d]: %s\n", ret, strerror(ret));
5fca41
+        DEBUG(SSSDBG_FATAL_FAILURE, "Unable to initialize background refresh\n");
5fca41
+        return ret;
5fca41
     }
5fca41
 
5fca41
-    ret = be_refresh_add_cb(be_ctx->refresh_ctx,
5fca41
-                            BE_REFRESH_TYPE_USERS,
5fca41
-                            ipa_refresh_users_send,
5fca41
-                            ipa_refresh_users_recv,
5fca41
-                            id_ctx);
5fca41
-    if (ret != EOK && ret != EEXIST) {
5fca41
-        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of users "
5fca41
-              "will not work [%d]: %s\n", ret, strerror(ret));
5fca41
-    }
5fca41
-
5fca41
-    ret = be_refresh_add_cb(be_ctx->refresh_ctx,
5fca41
-                            BE_REFRESH_TYPE_GROUPS,
5fca41
-                            ipa_refresh_groups_send,
5fca41
-                            ipa_refresh_groups_recv,
5fca41
-                            id_ctx);
5fca41
-    if (ret != EOK && ret != EEXIST) {
5fca41
-        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of groups "
5fca41
-              "will not work [%d]: %s\n", ret, strerror(ret));
5fca41
-    }
5fca41
-
5fca41
-    ret = be_refresh_add_cb(be_ctx->refresh_ctx,
5fca41
-                            BE_REFRESH_TYPE_NETGROUPS,
5fca41
-                            ipa_refresh_netgroups_send,
5fca41
-                            ipa_refresh_netgroups_recv,
5fca41
-                            id_ctx);
5fca41
-    if (ret != EOK && ret != EEXIST) {
5fca41
-        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of netgroups "
5fca41
-              "will not work [%d]: %s\n", ret, strerror(ret));
5fca41
-    }
5fca41
-
5fca41
-    return ret;
5fca41
+    return EOK;
5fca41
 }
5fca41
diff --git a/src/providers/ldap/sdap_refresh.c b/src/providers/ldap/sdap_refresh.c
5fca41
index 3ceddb61e..ff4d2116d 100644
5fca41
--- a/src/providers/ldap/sdap_refresh.c
5fca41
+++ b/src/providers/ldap/sdap_refresh.c
5fca41
@@ -258,41 +258,31 @@ errno_t sdap_refresh_init(struct be_ctx *be_ctx,
5fca41
                           struct sdap_id_ctx *id_ctx)
5fca41
 {
5fca41
     errno_t ret;
5fca41
-
5fca41
-    ret = be_refresh_ctx_init(be_ctx, SYSDB_NAME);
5fca41
+    struct be_refresh_cb sdap_refresh_callbacks[] = {
5fca41
+        { .send_fn = sdap_refresh_initgroups_send,
5fca41
+          .recv_fn = sdap_refresh_initgroups_recv,
5fca41
+          .pvt = id_ctx,
5fca41
+        },
5fca41
+        { .send_fn = sdap_refresh_users_send,
5fca41
+          .recv_fn = sdap_refresh_users_recv,
5fca41
+          .pvt = id_ctx,
5fca41
+        },
5fca41
+        { .send_fn = sdap_refresh_groups_send,
5fca41
+          .recv_fn = sdap_refresh_groups_recv,
5fca41
+          .pvt = id_ctx,
5fca41
+        },
5fca41
+        { .send_fn = sdap_refresh_netgroups_send,
5fca41
+          .recv_fn = sdap_refresh_netgroups_recv,
5fca41
+          .pvt = id_ctx,
5fca41
+        },
5fca41
+    };
5fca41
+
5fca41
+    ret = be_refresh_ctx_init_with_callbacks(be_ctx,
5fca41
+                                             SYSDB_NAME,
5fca41
+                                             sdap_refresh_callbacks);
5fca41
     if (ret != EOK) {
5fca41
-        DEBUG(SSSDBG_FATAL_FAILURE, "Unable to initialize refresh_ctx\n");
5fca41
-        return ENOMEM;
5fca41
-    }
5fca41
-
5fca41
-    ret = be_refresh_add_cb(be_ctx->refresh_ctx,
5fca41
-                            BE_REFRESH_TYPE_USERS,
5fca41
-                            sdap_refresh_users_send,
5fca41
-                            sdap_refresh_users_recv,
5fca41
-                            id_ctx);
5fca41
-    if (ret != EOK && ret != EEXIST) {
5fca41
-        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of users "
5fca41
-              "will not work [%d]: %s\n", ret, strerror(ret));
5fca41
-    }
5fca41
-
5fca41
-    ret = be_refresh_add_cb(be_ctx->refresh_ctx,
5fca41
-                            BE_REFRESH_TYPE_USERS,
5fca41
-                            sdap_refresh_groups_send,
5fca41
-                            sdap_refresh_groups_recv,
5fca41
-                            id_ctx);
5fca41
-    if (ret != EOK && ret != EEXIST) {
5fca41
-        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of groups "
5fca41
-              "will not work [%d]: %s\n", ret, strerror(ret));
5fca41
-    }
5fca41
-
5fca41
-    ret = be_refresh_add_cb(be_ctx->refresh_ctx,
5fca41
-                            BE_REFRESH_TYPE_USERS,
5fca41
-                            sdap_refresh_netgroups_send,
5fca41
-                            sdap_refresh_netgroups_recv,
5fca41
-                            id_ctx);
5fca41
-    if (ret != EOK && ret != EEXIST) {
5fca41
-        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of netgroups "
5fca41
-              "will not work [%d]: %s\n", ret, strerror(ret));
5fca41
+        DEBUG(SSSDBG_FATAL_FAILURE, "Unable to initialize background refresh\n");
5fca41
+        return ret;
5fca41
     }
5fca41
 
5fca41
     return ret;
5fca41
-- 
5fca41
2.20.1
5fca41