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; }