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

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