87 lines
1.3 KiB
C
87 lines
1.3 KiB
C
#include <sys/param.h>
|
|
#include <stdio.h>
|
|
#include <pwd.h>
|
|
|
|
extern void rewind();
|
|
extern long atol();
|
|
extern FILE *fopen();
|
|
extern int fclose();
|
|
extern char *fgets();
|
|
|
|
static char PASSWD[] = "/etc/passwd";
|
|
static char EMPTY[] = "";
|
|
static FILE *pwf = NULL;
|
|
static char line[BUFSIZ+1];
|
|
static struct passwd passwd;
|
|
|
|
void
|
|
setpwent()
|
|
{
|
|
if(pwf == NULL)
|
|
pwf = fopen(PASSWD, "r");
|
|
else
|
|
rewind(pwf);
|
|
}
|
|
|
|
void
|
|
endpwent()
|
|
{
|
|
if(pwf != NULL) {
|
|
(void) fclose(pwf);
|
|
pwf = NULL;
|
|
}
|
|
}
|
|
|
|
static char *
|
|
pwskip(p)
|
|
register char *p;
|
|
{
|
|
while(*p && *p != ':' && *p != '\n')
|
|
++p;
|
|
if(*p == '\n')
|
|
*p = '\0';
|
|
else if(*p)
|
|
*p++ = '\0';
|
|
return(p);
|
|
}
|
|
|
|
struct passwd *
|
|
getpwent()
|
|
{
|
|
register char *p;
|
|
long x;
|
|
|
|
if(pwf == NULL) {
|
|
if((pwf = fopen(PASSWD, "r")) == NULL)
|
|
return(0);
|
|
}
|
|
p = fgets(line, BUFSIZ, pwf);
|
|
if(p == NULL)
|
|
return(0);
|
|
passwd.pw_name = p;
|
|
p = pwskip(p);
|
|
passwd.pw_passwd = p;
|
|
p = pwskip(p);
|
|
x = atol(p);
|
|
passwd.pw_uid = (x < 0 || x > MAXUID)? (MAXUID+1): x;
|
|
p = pwskip(p);
|
|
x = atol(p);
|
|
passwd.pw_gid = (x < 0 || x > MAXUID)? (MAXUID+1): x;
|
|
passwd.pw_comment = EMPTY;
|
|
p = pwskip(p);
|
|
passwd.pw_gecos = p;
|
|
p = pwskip(p);
|
|
passwd.pw_dir = p;
|
|
p = pwskip(p);
|
|
passwd.pw_shell = p;
|
|
(void) pwskip(p);
|
|
|
|
p = passwd.pw_passwd;
|
|
while(*p && *p != ',')
|
|
p++;
|
|
if(*p)
|
|
*p++ = '\0';
|
|
passwd.pw_age = p;
|
|
return(&passwd);
|
|
}
|