--- pam_unix2-2.1/src/support.c.badz 2006-11-11 12:36:36.000000000 +0100 +++ pam_unix2-2.1/src/support.c 2006-11-11 12:36:45.000000000 +0100 @@ -207,6 +207,7 @@ } else if (ask_password && !ask_user) { +#if defined (HAVE_PAM_PROMPT) char *cresp = NULL; retval = pam_prompt (pamh, PAM_PROMPT_ECHO_OFF, &cresp, _("Password: ")); @@ -220,8 +221,46 @@ } *password = strdup (cresp ? cresp : ""); _pam_drop (cresp); - } +#else + struct pam_message msg[1], *pmsg[1]; + struct pam_response *resp; + struct pam_conv *conv; + void *conv_void; + + /* set up conversation call */ + + pmsg[0] = &msg[0]; + msg[0].msg_style = PAM_PROMPT_ECHO_OFF; + msg[0].msg = _("Password: "); + resp = NULL; + + retval = pam_get_item (pamh, PAM_CONV, (const void **)&conv_void); + conv = (struct pam_conv *) conv_void; + if (retval == PAM_SUCCESS) + { + retval = conv->conv (1, (const struct pam_message **)pmsg, + &resp, conv->appdata_ptr); + if (retval == PAM_CONV_AGAIN) + retval = PAM_INCOMPLETE; + if (retval != PAM_SUCCESS) + return retval; + } + else + return retval; + + if (resp) + { + if (resp->resp) + *password = strdup (resp->resp); + else + *password = strdup (""); + _pam_drop_reply (resp, 1); + } + else + return PAM_CONV_ERR; +#endif + } if (*password) { pam_set_item (pamh, PAM_AUTHTOK, *password);