summaryrefslogtreecommitdiffstats
path: root/src/responder/pam/pamsrv_cmd.c
diff options
context:
space:
mode:
authorStephen Gallagher <sgallagh@redhat.com>2011-11-16 14:52:40 -0500
committerStephen Gallagher <sgallagh@redhat.com>2011-11-29 08:41:54 -0500
commit069a5fe72d38f8e15b4416992453ac41a425ce9a (patch)
treefa38b3d25ee3a2abdb42c66e92280990cf4a2b6f /src/responder/pam/pamsrv_cmd.c
parent0aaf73e328ce89fb7e690545234402e1b17dee36 (diff)
downloadsssd-069a5fe72d38f8e15b4416992453ac41a425ce9a.tar.gz
sssd-069a5fe72d38f8e15b4416992453ac41a425ce9a.tar.xz
sssd-069a5fe72d38f8e15b4416992453ac41a425ce9a.zip
RESPONDER: Refactor DP requests into tevent_req style
Diffstat (limited to 'src/responder/pam/pamsrv_cmd.c')
-rw-r--r--src/responder/pam/pamsrv_cmd.c59
1 files changed, 48 insertions, 11 deletions
diff --git a/src/responder/pam/pamsrv_cmd.c b/src/responder/pam/pamsrv_cmd.c
index 18ba3fdf3..2a000f095 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) {