/* msdos compile bombs without blank line here */ /* see unix man 3 getpwent for documentation */ #include #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