local_pw->pw_gecos = estrdup(pw->pw_gecos); #ifdef HAVE_LOGIN_CAP_H local_pw->pw_class = estrdup(pw->pw_class); #endif
static struct passwd *sudo_pwdup	__P((struct passwd *));/* * Return the user's shell based on either the SHELL * environment variable or the passwd(5) entry (in that order). */static char *sudo_getshell(pw)    struct passwd *pw;{    char *pw_shell;    if ((pw_shell = getenv("SHELL")) == NULL)	pw_shell = pw->pw_shell;#ifdef _PATH_BSHELL    /* empty string "" means bourne shell */    if (*pw_shell == '\0')	pw_shell = _PATH_BSHELL;#endif /* _PATH_BSHELL */    return(pw_shell);}/* * Return the encrypted password for the user described by pw.  If shadow * passwords are in use, look in the shadow file. */char *sudo_getepw(pw)    struct passwd *pw;{    /* If there is a function to check for shadow enabled, use it... */#ifdef HAVE_ISCOMSEC    if (!iscomsec())	return(pw->pw_passwd);#endif /* HAVE_ISCOMSEC */#ifdef HAVE_ISSECURE    if (!issecure())	return(pw->pw_passwd);#endif /* HAVE_ISSECURE */#ifdef HAVE_GETPRPWNAM    {	struct pr_passwd *spw;	spw = getprpwnam(pw->pw_name);	if (spw != NULL && spw->ufld.fd_encrypt != NULL) {# ifdef __alpha	    crypt_type = spw->ufld.fd_oldcrypt;# endif /* __alpha */	    return(spw->ufld.fd_encrypt);	}    }#endif /* HAVE_GETPRPWNAM */#ifdef HAVE_GETSPNAM    {	struct spwd *spw;	if ((spw = getspnam(pw->pw_name)) && spw->sp_pwdp)	    return(spw->sp_pwdp);    }#endif /* HAVE_GETSPNAM */#ifdef HAVE_GETSPWUID    {	struct s_passwd *spw;	if ((spw = getspwuid(pw->pw_uid)) && spw->pw_passwd)	    return(spw->pw_passwd);    }#endif /* HAVE_GETSPWUID */#ifdef HAVE_GETPWANAM    {	struct passwd_adjunct *spw;	if ((spw = getpwanam(pw->pw_name)) && spw->pwa_passwd)	    return(spw->pwa_passwd);    }#endif /* HAVE_GETPWANAM */#ifdef HAVE_GETAUTHUID    {	AUTHORIZATION *spw;	if ((spw = getauthuid(pw->pw_uid)) && spw->a_password)	    return(spw->a_password);    }#endif /* HAVE_GETAUTHUID */    /* Fall back on normal password. */    return(pw->pw_passwd);}/* * Dynamically allocate space for a struct password and the constituent parts * that we care about.  Fills in pw_passwd from shadow file if necessary. */static struct passwd *sudo_pwdup(pw)    struct passwd *pw;{    struct passwd *local_pw;    /* Allocate space for a local copy of pw. */    local_pw = (struct passwd *) emalloc(sizeof(struct passwd));    /*     * Copy the struct passwd and the interesting strings...     */    (void) memcpy(local_pw, pw, sizeof(struct passwd));    local_pw->pw_name = estrdup(pw->pw_name);    local_pw->pw_dir = estrdup(pw->pw_dir);    /* pw_shell is a special case since we overide with $SHELL */    local_pw->pw_shell = estrdup(sudo_getshell(pw));    /* pw_passwd gets a shadow password if applicable */    local_pw->pw_passwd = estrdup(sudo_getepw(pw));    return(local_pw);}