diff options
author | Stephen Gallagher <sgallagh@redhat.com> | 2011-11-16 14:52:40 -0500 |
---|---|---|
committer | Stephen Gallagher <sgallagh@redhat.com> | 2011-11-29 08:41:54 -0500 |
commit | 069a5fe72d38f8e15b4416992453ac41a425ce9a (patch) | |
tree | fa38b3d25ee3a2abdb42c66e92280990cf4a2b6f /src/responder/pam | |
parent | 0aaf73e328ce89fb7e690545234402e1b17dee36 (diff) | |
download | sssd-069a5fe72d38f8e15b4416992453ac41a425ce9a.tar.gz sssd-069a5fe72d38f8e15b4416992453ac41a425ce9a.tar.bz2 sssd-069a5fe72d38f8e15b4416992453ac41a425ce9a.zip |
RESPONDER: Refactor DP requests into tevent_req style
Diffstat (limited to 'src/responder/pam')
-rw-r--r-- | src/responder/pam/pamsrv_cmd.c | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/src/responder/pam/pamsrv_cmd.c b/src/responder/pam/pamsrv_cmd.c index 18ba3fdf..2a000f09 100644 --- a/src/responder/pam/pamsrv_cmd.c +++ b/src/responder/pam/pamsrv_cmd.c @@ -807,6 +807,8 @@ done: return pam_check_user_done(preq, ret); } +static void pam_dp_send_acct_req_done(struct tevent_req *req); + static int pam_check_user_search(struct pam_auth_req *preq) { struct sss_domain_info *dom = preq->domain; @@ -815,6 +817,8 @@ static int pam_check_user_search(struct pam_auth_req *preq) struct sysdb_ctx *sysdb; time_t cacheExpire; int ret; + struct tevent_req *dpreq; + struct dp_callback_ctx *cb_ctx; while (dom) { /* if it is a domainless search, skip domains that require fully @@ -904,18 +908,28 @@ static int pam_check_user_search(struct pam_auth_req *preq) /* dont loop forever :-) */ preq->check_provider = false; - ret = sss_dp_send_acct_req(preq->cctx->rctx, preq, - pam_check_user_dp_callback, preq, - SSS_CLI_SOCKET_TIMEOUT/2, - dom->name, false, - SSS_DP_INITGROUPS, - name, 0); - if (ret != EOK) { - DEBUG(3, ("Failed to dispatch request: %d(%s)\n", - ret, strerror(ret))); - preq->pd->pam_status = PAM_SYSTEM_ERR; - return EIO; + dpreq = sss_dp_get_account_send(preq, preq->cctx->rctx, + dom, false, SSS_DP_INITGROUPS, + name, 0); + if (!dpreq) { + DEBUG(SSSDBG_CRIT_FAILURE, + ("Out of memory sending data provider request\n")); + return ENOMEM; + } + + cb_ctx = talloc_zero(preq, struct dp_callback_ctx); + if(!cb_ctx) { + talloc_zfree(dpreq); + return ENOMEM; } + + cb_ctx->callback = pam_check_user_dp_callback; + cb_ctx->ptr = preq; + cb_ctx->cctx = preq->cctx; + cb_ctx->mem_ctx = preq; + + tevent_req_set_callback(dpreq, pam_dp_send_acct_req_done, cb_ctx); + /* tell caller we are in an async call */ return EAGAIN; } @@ -924,6 +938,29 @@ static int pam_check_user_search(struct pam_auth_req *preq) return ENOENT; } +static void pam_dp_send_acct_req_done(struct tevent_req *req) +{ + struct dp_callback_ctx *cb_ctx = + tevent_req_callback_data(req, struct dp_callback_ctx); + + errno_t ret; + dbus_uint16_t err_maj; + dbus_uint32_t err_min; + char *err_msg; + + ret = sss_dp_get_account_recv(cb_ctx->mem_ctx, req, + &err_maj, &err_min, + &err_msg); + if (ret != EOK) { + DEBUG(SSSDBG_CRIT_FAILURE, + ("Fatal error, killing connection!\n")); + talloc_free(cb_ctx->cctx); + return; + } + + cb_ctx->callback(err_maj, err_min, err_msg, cb_ctx->ptr); +} + static int pam_check_user_done(struct pam_auth_req *preq, int ret) { switch (ret) { |