 
/*****************************************************************************
 *                             Listing 2                                     *
 *****************************************************************************/

/*
 * Possible password versions:
 *     ETCSECURITY    - For IBM AIX, needs -ls at load time (security library)
 *     ETCSHADOW      - For Systems using the shadow password file
 *     ETCPASSWD      - For Systems using the standard password file
 */

#include	<stdio.h>

#if ETCSECURITY
#include    <usersec.h>
#include    <userpw.h>

struct userpw *pass;
#endif

#define 	SHADOWFILE       "/etc/shadow"
#define 	PASSWDFILE       "/etc/passwd"

#define 	SEPARATOR        ':'
#define 	NULLCHAR         '\0'

#define 	PASSWDLEN        13

#define 	ENTRYFOUND       0
#define 	NOENTRYFOUND     -1
#define 	NOFILEACCESS     -2

static int  second_field     ();
static char *myindex         ();

int
get_encrypted (uname, password)
char *uname;
char *password;
{
	int  ret;

	ret = -1;

#if ETCSECURITY
	/*
	 * Use AIX "security" routines to get entry
	 */
	if ((pass = getuserpw (uname)) != NULL)
	{
		if (pass->upw_passwd != (char *) NULL)
		{
			strcpy (password, pass->upw_passwd);
			ret = 0;
		}
	}

	return ret;
#endif

#if ETCSHADOW
	/*
	 * If the shadow password file does not exist, then check the
	 * standard /etc/password file
	 */
	if (ret = second_field (uname, SHADOWFILE, password) == NOFILEACCESS)
		ret = second_field (uname, PASSWDFILE, password);
#endif

#if ETCPASSWD
	ret = second_field (uname, PASSWDFILE, password);
#endif

	return ret;
}

static int
second_field (uname, filename, password)
char *uname;
char *filename;
char *password;
{
	char buf [BUFSIZ];
	char *cp1;
	char *cp2;
	int  ret;
	FILE *ffd;

	ret = NOENTRYFOUND;

	if ((ffd = fopen (filename, "r")) != NULL)
	{
		/*
		 * Find the desired entry
		 */
		while (fgets (buf, BUFSIZ, ffd) != NULL)
		{
			if ((cp1 = myindex (buf, SEPARATOR)) != NULL)
			{
				*cp1 = NULLCHAR;
				if (strcmp (buf, uname) == 0)
				{
					/*
					 * Found entry for user. Now get password in second field
					 */
					if ((cp2 = myindex (++cp1, SEPARATOR)) != NULL)
					{
						*cp2 = NULLCHAR;

						/*
						 * Only take first PASSWLEN characters in order to
						 * ingore any possible password ageing information
						 */
						strncpy (password, cp1, PASSWDLEN);
						password [PASSWDLEN] = NULLCHAR;

						ret = ENTRYFOUND;
						break;
					}
				}
			}
		}

		fclose (ffd);
		return ret;
	}
	else
		ret = NOFILEACCESS;

	return ret;
}

static char *
myindex (s, c)
char *s;
char  c;
{
	while (*s)
	{
		if (*s == c)
			return s;
		s++;
	}

	return (*s == c) ? s : NULL;
}


