diff options
author | Jakub Hrozek <jhrozek@redhat.com> | 2012-01-05 20:23:04 +0100 |
---|---|---|
committer | Stephen Gallagher <sgallagh@redhat.com> | 2012-02-05 19:16:16 -0500 |
commit | 98076cabc2a8b8f71dc3bc1263519827f71a5fcc (patch) | |
tree | 86af86db1d547be63bf72c3471b23fb6f0a96286 /src/responder/nss/nsssrv_cmd.c | |
parent | 5708dc97b69a468f077616d7a75e81f4172f63fa (diff) | |
download | sssd-98076cabc2a8b8f71dc3bc1263519827f71a5fcc.tar.gz sssd-98076cabc2a8b8f71dc3bc1263519827f71a5fcc.tar.xz sssd-98076cabc2a8b8f71dc3bc1263519827f71a5fcc.zip |
RESPONDERS: Refactor setent_req_list
Makes the setent_add_ref() and setent_notify_*() functions more generic
to be reusable by the autofs responder.
Diffstat (limited to 'src/responder/nss/nsssrv_cmd.c')
-rw-r--r-- | src/responder/nss/nsssrv_cmd.c | 75 |
1 files changed, 24 insertions, 51 deletions
diff --git a/src/responder/nss/nsssrv_cmd.c b/src/responder/nss/nsssrv_cmd.c index 1dff829ee..43ae947c5 100644 --- a/src/responder/nss/nsssrv_cmd.c +++ b/src/responder/nss/nsssrv_cmd.c @@ -77,31 +77,26 @@ int nss_cmd_done(struct nss_cmd_ctx *cmdctx, int ret) /*************************** * Enumeration procedures * ***************************/ - -errno_t setent_add_ref(TALLOC_CTX *memctx, - struct getent_ctx *getent_ctx, - struct tevent_req *req) +struct tevent_req *nss_setent_get_req(struct getent_ctx *getent_ctx) { - struct setent_req_list *entry = - talloc_zero(memctx, struct setent_req_list); - if (!entry) { - return ENOMEM; - } + return setent_get_req(getent_ctx->reqs); +} - entry->req = req; - entry->getent_ctx = getent_ctx; - DLIST_ADD_END(getent_ctx->reqs, entry, struct setent_req_list *); +errno_t nss_setent_add_ref(TALLOC_CTX *memctx, + struct getent_ctx *getent_ctx, + struct tevent_req *req) +{ + return setent_add_ref(memctx, getent_ctx, &getent_ctx->reqs, req); +} - talloc_set_destructor((TALLOC_CTX *)entry, setent_remove_ref); - return EOK; +void nss_setent_notify_error(struct getent_ctx *getent_ctx, errno_t ret) +{ + return setent_notify(getent_ctx->reqs, ret); } -int setent_remove_ref(TALLOC_CTX *ctx) +void nss_setent_notify_done(struct getent_ctx *getent_ctx) { - struct setent_req_list *entry = - talloc_get_type(ctx, struct setent_req_list); - DLIST_REMOVE(entry->getent_ctx->reqs, entry); - return 0; + return setent_notify_done(getent_ctx->reqs); } struct setent_ctx { @@ -1246,7 +1241,7 @@ struct tevent_req *nss_cmd_setpwent_send(TALLOC_CTX *mem_ctx, * Register for notification when it's * ready. */ - ret = setent_add_ref(state->client, state->nctx->pctx, req); + ret = nss_setent_add_ref(state->client, state->nctx->pctx, req); if (ret != EOK) { talloc_free(req); return NULL; @@ -1268,7 +1263,8 @@ struct tevent_req *nss_cmd_setpwent_send(TALLOC_CTX *mem_ctx, state->getent_ctx = nctx->pctx; /* Add a callback reference for ourselves */ - setent_add_ref(state->client, state->nctx->pctx, req); + ret = nss_setent_add_ref(state->client, state->nctx->pctx, req); + if (ret) goto error; /* ok, start the searches */ step_ctx = talloc_zero(state->getent_ctx, struct setent_step_ctx); @@ -1323,7 +1319,6 @@ static errno_t nss_cmd_setpwent_step(struct setent_step_ctx *step_ctx) struct nss_ctx *nctx = step_ctx->nctx; struct sysdb_ctx *sysdb; struct ldb_result *res; - struct setent_req_list *req; struct timeval tv; struct tevent_timer *te; struct tevent_req *dpreq; @@ -1434,13 +1429,7 @@ static errno_t nss_cmd_setpwent_step(struct setent_step_ctx *step_ctx) } /* Notify the waiting clients */ - while (nctx->pctx->reqs) { - tevent_req_done(nctx->pctx->reqs->req); - /* Freeing each entry in the list removes it from the dlist */ - req = nctx->pctx->reqs; - nctx->pctx->reqs = nctx->pctx->reqs->next; - talloc_free(req); - } + setent_notify_done(nctx->pctx->reqs); if (step_ctx->returned_to_mainloop) { return EAGAIN; @@ -1470,7 +1459,6 @@ static void nss_cmd_setpwent_dp_callback(uint16_t err_maj, uint32_t err_min, { struct setent_step_ctx *step_ctx = talloc_get_type(ptr, struct setent_step_ctx); - struct getent_ctx *pctx = step_ctx->nctx->pctx; int ret; if (err_maj) { @@ -1483,11 +1471,7 @@ static void nss_cmd_setpwent_dp_callback(uint16_t err_maj, uint32_t err_min, ret = nss_cmd_setpwent_step(step_ctx); if (ret != EOK && ret != EAGAIN) { /* Notify any waiting processes of failure */ - while(step_ctx->nctx->pctx->reqs) { - tevent_req_error(pctx->reqs->req, ret); - /* Freeing each entry in the list removes it from the dlist */ - talloc_free(pctx->reqs); - } + nss_setent_notify_error(step_ctx->nctx->pctx, ret); } } @@ -2555,7 +2539,7 @@ struct tevent_req *nss_cmd_setgrent_send(TALLOC_CTX *mem_ctx, * Register for notification when it's * ready. */ - ret = setent_add_ref(state->client, state->nctx->gctx, req); + ret = nss_setent_add_ref(state->client, state->nctx->gctx, req); if (ret != EOK) { talloc_free(req); return NULL; @@ -2577,7 +2561,8 @@ struct tevent_req *nss_cmd_setgrent_send(TALLOC_CTX *mem_ctx, state->getent_ctx = nctx->gctx; /* Add a callback reference for ourselves */ - setent_add_ref(state->client, state->nctx->gctx, req); + ret = nss_setent_add_ref(state->client, state->nctx->gctx, req); + if (ret) goto error; /* ok, start the searches */ step_ctx = talloc_zero(state->getent_ctx, struct setent_step_ctx); @@ -2632,7 +2617,6 @@ static errno_t nss_cmd_setgrent_step(struct setent_step_ctx *step_ctx) struct nss_ctx *nctx = step_ctx->nctx; struct sysdb_ctx *sysdb; struct ldb_result *res; - struct setent_req_list *req; struct timeval tv; struct tevent_timer *te; struct tevent_req *dpreq; @@ -2741,13 +2725,7 @@ static errno_t nss_cmd_setgrent_step(struct setent_step_ctx *step_ctx) } /* Notify the waiting clients */ - while (nctx->gctx->reqs) { - tevent_req_done(nctx->gctx->reqs->req); - /* Freeing each entry in the list removes it from the dlist */ - req = nctx->gctx->reqs; - nctx->gctx->reqs = nctx->gctx->reqs->next; - talloc_free(req); - } + setent_notify_done(nctx->gctx->reqs); if (step_ctx->returned_to_mainloop) { return EAGAIN; @@ -2778,7 +2756,6 @@ static void nss_cmd_setgrent_dp_callback(uint16_t err_maj, uint32_t err_min, { struct setent_step_ctx *step_ctx = talloc_get_type(ptr, struct setent_step_ctx); - struct getent_ctx *gctx = step_ctx->nctx->gctx; int ret; if (err_maj) { @@ -2791,11 +2768,7 @@ static void nss_cmd_setgrent_dp_callback(uint16_t err_maj, uint32_t err_min, ret = nss_cmd_setgrent_step(step_ctx); if (ret != EOK && ret != EAGAIN) { /* Notify any waiting processes of failure */ - while(step_ctx->nctx->gctx->reqs) { - tevent_req_error(gctx->reqs->req, ret); - /* Freeing each entry in the list removes it from the dlist */ - talloc_free(gctx->reqs); - } + nss_setent_notify_error(step_ctx->nctx->gctx, ret); } } |