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