Listing 2. A Basic Implementation of pam_sm_authenticate()
PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags
,int argc, const char **argv)
{
unsigned int ctrl;
int retval;
const char *name, *p;
/* get the user'name' */
retval = pam_get_user(pamh, &name, "login: ");
if (retval == PAM_SUCCESS) {
printf("username [%s] obtained", name);
} else {
printf("trouble reading username\n");
pam_set_data(pamh, "unix_setcred_return", (void *) retval, NULL);
return retval;
}
/* get this user's authentication token */
retval = _read_password(pamh, ctrl, NULL, "Password: ", NULL
, UNIX_AUTHTOK, &p);
if (retval != PAM_SUCCESS) {
printf("could not read password for %s\n", name);
name = NULL;
pam_set_data(pamh, "unix_setcred_return", (void *) retval, NULL);
return retval;
}
/* verify the password of this user */
retval = _verify_password(pamh, name, p, ctrl);
name = p = NULL;
pam_set_data(pamh, "unix_setcred_return", (void *) retval, NULL);
return retval;
}