/* msdos compile bombs without blank line here */

/* see unix man 3 getpwent for documentation */

#include <stdio.h>
#include "../include/passwd.h"

#define PASSWD "/etc/passwd"
static	FILE	*vsl_pw_file ;

vsl_endpwent()
	{
	if (vsl_pw_file != (FILE *)0)
		{
		(void) fclose(vsl_pw_file) ;
		vsl_pw_file = (FILE *)0 ;
		}
	}

/* null terminate given string, & return pointer to next string */
	static char *
tskip(str)
	char *str ;
	{
	if (*str == '\0') return(str) ;
	while (*str && (*str != ':')) str++ ;
	if (*str) *str++ = '\0' ;
	return(str) ;
	}

	struct	passwd *
vsl_getpwnam(name)
	char	*name ;
	{
	static	char	pbuf[BUFSIZ] ;
	static	struct	passwd	vsl_pwent ;
	char	*p ;
	int	c ;
	char	*dummy ;

#ifdef	DEBUG
	printf("Looking for |%s|\n", name) ;
#endif
	if(vsl_pw_file == (FILE *)0)
		{
		if (( vsl_pw_file = fopen(PASSWD, "r") ) == (FILE *)0)
			{
			printf("Cannot open passwd file\n") ;
			return(	(struct passwd *)0) ;
			}
		}
	else (void) fseek(vsl_pw_file, 0L, 0) ;
#ifdef	DEBUG
	printf("Still Looking for |%s|\n", name) ;
#endif
	for( ;;){
		for(p =	pbuf ; (c = getc(vsl_pw_file)) != EOF; *p++ = c)
			if(c ==	'\n') { *p = '\0' ; break ; }
		if(c ==	EOF) return( (struct passwd *)0) ;
		vsl_pwent.pw_name	=	pbuf ;
		vsl_pwent.pw_passwd	= tskip(pbuf) ;
		/* uid */ dummy		= tskip(vsl_pwent.pw_passwd) ;
		/* gid */ dummy		= tskip(dummy) ;
		/* gcos */ dummy	= tskip(dummy) ;
		vsl_pwent.pw_dir	= tskip(dummy) ;
		vsl_pwent.pw_shell	= tskip(vsl_pwent.pw_dir) ;
		vsl_pwent.pw_shargs	= tskip(vsl_pwent.pw_shell) ;
#ifdef DEBUG
		printf(
		"Got user %s\npasswd %s\ndir %s\nshell %s\nargs %s\n%s\n",
			vsl_pwent.pw_name, vsl_pwent.pw_passwd,
			vsl_pwent.pw_dir, vsl_pwent.pw_shell,
			vsl_pwent.pw_shargs, "===========" ) ;
		printf("About to compare|%s|%s|%d\n",vsl_pwent.pw_name, name,
			strcmp(vsl_pwent.pw_name, name)) ;
#endif
		if (strcmp(vsl_pwent.pw_name, name) == 0) return( &vsl_pwent) ;
		}
	}

#ifdef UNNECESSARY
	int
vsl_setpwent()
	{
	if(vsl_pw_file != (FILE *)0) fseek(vsl_pw_file, 0L, 0) ;
	}
#endif
