From 258fd794fd8be46ca44d89992d264045f1cfdab6 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 2 Jul 1999 17:13:27 +0000 Subject: Password and group routines added by Ralf Corsepius . --- c/src/lib/libc/getpwent.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 c/src/lib/libc/getpwent.c (limited to 'c/src/lib/libc/getpwent.c') diff --git a/c/src/lib/libc/getpwent.c b/c/src/lib/libc/getpwent.c new file mode 100644 index 0000000000..23a35f49bd --- /dev/null +++ b/c/src/lib/libc/getpwent.c @@ -0,0 +1,129 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +static struct passwd pw_passwd; /* password structure */ +static FILE *passwd_fp; + +static char logname[8]; +static char password[1024]; +static char comment[1024]; +static char gecos[1024]; +static char dir[1024]; +static char shell[1024]; + +struct passwd * +getpwnam (name) + const char *name; +{ + FILE *fp; + int uid, gid; + char buf[1024]; + + if ((fp = fopen ("/etc/passwd", "r")) == NULL) + { + return NULL; + } + + while (fgets (buf, sizeof (buf), fp)) + { + sscanf (buf, "%[^:]:%[^:]:%d:%d:%[^:]:%[^:]:%s\n", + logname, password, &pw_passwd.pw_uid, + &pw_passwd.pw_gid, comment, gecos, + dir, shell); + pw_passwd.pw_name = logname; + pw_passwd.pw_passwd = password; + pw_passwd.pw_comment = comment; + pw_passwd.pw_gecos = gecos; + pw_passwd.pw_dir = dir; + pw_passwd.pw_shell = shell; + + if (!strcmp (logname, name)) + { + fclose (fp); + return &pw_passwd; + } + } + fclose (fp); + return NULL; +} + +struct passwd * +getpwuid (uid_t uid) +{ + FILE *fp; + char buf[1024]; + + if ((fp = fopen ("/etc/passwd", "r")) == NULL) + { + return NULL; + } + + while (fgets (buf, sizeof (buf), fp)) + { + sscanf (buf, "%[^:]:%[^:]:%d:%d:%[^:]:%[^:]:%s\n", + logname, password, &pw_passwd.pw_uid, + &pw_passwd.pw_gid, comment, gecos, + dir, shell); + pw_passwd.pw_name = logname; + pw_passwd.pw_passwd = password; + pw_passwd.pw_comment = comment; + pw_passwd.pw_gecos = gecos; + pw_passwd.pw_dir = dir; + pw_passwd.pw_shell = shell; + + if (uid == pw_passwd.pw_uid) + { + fclose (fp); + return &pw_passwd; + } + } + fclose (fp); + return NULL; +} + +struct passwd * +getpwent () +{ + char buf[1024]; + + if (passwd_fp == NULL) + return NULL; + + if (fgets (buf, sizeof (buf), passwd_fp) == NULL) + return NULL; + + sscanf (buf, "%[^:]:%[^:]:%d:%d:%[^:]:%[^:]:%s\n", + logname, password, &pw_passwd.pw_uid, + &pw_passwd.pw_gid, comment, gecos, + dir, shell); + pw_passwd.pw_name = logname; + pw_passwd.pw_passwd = password; + pw_passwd.pw_comment = comment; + pw_passwd.pw_gecos = gecos; + pw_passwd.pw_dir = dir; + pw_passwd.pw_shell = shell; + + return &pw_passwd; +} + +void +setpwent () +{ + if (passwd_fp != NULL) + fclose (passwd_fp); + + passwd_fp = fopen ("/etc/passwd", "r"); +} + +void +endpwent () +{ + if (passwd_fp != NULL) + fclose (passwd_fp); +} -- cgit v1.2.3