- fprintf(stderr, "check_pam(%s)\n", user);
-
- int ret;
- pam_handle_t *pamh = NULL;
-
- ret = pam_start(PAM_SERVICE, user, &conv, &pamh);
- if (ret != 0) {
- fprintf(stderr, "pam_start(\"%s\", \"%s\", ?, ?): failed\n",
- PAM_SERVICE, user);
- return -1;
- }
-
- if ((ret = pam_close_session(pamh, 0)) != 0) {
- fprintf(stderr, "pam_close_session(): %s\n", pam_strerror(pamh, ret));
- return -1;
+ int i, style;
+ struct pam_response *rsp;
+
+ if (!(rsp = calloc(nmsgs, sizeof(struct pam_response))))
+ errx(1, "couldn't malloc pam_response");
+ *rsps = rsp;
+
+ for (i = 0; i < nmsgs; i++) {
+ switch (style = msgs[i]->msg_style) {
+ case PAM_PROMPT_ECHO_OFF:
+ case PAM_PROMPT_ECHO_ON:
+ rsp[i].resp = pam_prompt(msgs[i]->msg,
+ style == PAM_PROMPT_ECHO_ON);
+ break;
+
+ case PAM_ERROR_MSG:
+ case PAM_TEXT_INFO:
+ fprintf(style == PAM_ERROR_MSG ? stderr : stdout,
+ "%s\n", msgs[i]->msg);
+ break;
+
+ default:
+ errx(1, "invalid PAM msg_style %d", style);
+ }