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/exec/libcsupport/src/getgrent.c | 119 +++++++++++++++++++++++++++++++ c/src/exec/libcsupport/src/getpwent.c | 129 ++++++++++++++++++++++++++++++++++ c/src/lib/libc/Makefile.in | 6 +- c/src/lib/libc/getgrent.c | 119 +++++++++++++++++++++++++++++++ c/src/lib/libc/getpwent.c | 129 ++++++++++++++++++++++++++++++++++ 5 files changed, 501 insertions(+), 1 deletion(-) create mode 100644 c/src/exec/libcsupport/src/getgrent.c create mode 100644 c/src/exec/libcsupport/src/getpwent.c create mode 100644 c/src/lib/libc/getgrent.c create mode 100644 c/src/lib/libc/getpwent.c (limited to 'c') diff --git a/c/src/exec/libcsupport/src/getgrent.c b/c/src/exec/libcsupport/src/getgrent.c new file mode 100644 index 0000000000..080187d178 --- /dev/null +++ b/c/src/exec/libcsupport/src/getgrent.c @@ -0,0 +1,119 @@ +/* + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +static struct group gr_group; /* password structure */ +static FILE *group_fp; + +static char groupname[8]; +static char password[1024]; +static char groups[1024]; +static char *gr_mem[16] = { } ; + +struct group * +getgrnam (name) + const char *name; +{ + FILE *fp; + char buf[1024]; + + if ((fp = fopen ("/etc/group", "r")) == NULL) + { + return NULL; + } + + while (fgets (buf, sizeof (buf), fp)) + { + sscanf (buf, "%[^:]:%[^:]:%d:%s\n", + groupname, password, &gr_group.gr_gid, + groups); + gr_group.gr_name = groupname; + gr_group.gr_passwd = password; + gr_group.gr_mem = gr_mem ; + + if (!strcmp (groupname, name)) + { + fclose (fp); + return &gr_group; + } + } + fclose (fp); + return NULL; +} + +struct group * +getgrgid (gid_t gid) +{ + FILE *fp; + char buf[1024]; + + if ((fp = fopen ("/etc/group", "r")) == NULL) + { + return NULL; + } + + while (fgets (buf, sizeof (buf), fp)) + { + sscanf (buf, "%[^:]:%[^:]:%d:%s\n", + groupname, password, &gr_group.gr_gid, + groups); + gr_group.gr_name = groupname; + gr_group.gr_passwd = password; + gr_group.gr_mem = gr_mem ; + + + if (gid == gr_group.gr_gid) + { + fclose (fp); + return &gr_group; + } + } + fclose (fp); + return NULL; +} + +struct group * +getgrent () +{ + char buf[1024]; + + if (group_fp == NULL) + return NULL; + + if (fgets (buf, sizeof (buf), group_fp) == NULL) + return NULL; + + sscanf (buf, "%[^:]:%[^:]:%d:%s\n", + groupname, password, &gr_group.gr_gid, + groups); + gr_group.gr_name = groupname; + gr_group.gr_passwd = password; + gr_group.gr_mem = gr_mem ; + + return &gr_group; +} + +void +setgrent () +{ + if (group_fp != NULL) + fclose (group_fp); + + group_fp = fopen ("/etc/group", "r"); +} + +void +endgrent () +{ + if (group_fp != NULL) + fclose (group_fp); +} diff --git a/c/src/exec/libcsupport/src/getpwent.c b/c/src/exec/libcsupport/src/getpwent.c new file mode 100644 index 0000000000..23a35f49bd --- /dev/null +++ b/c/src/exec/libcsupport/src/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); +} diff --git a/c/src/lib/libc/Makefile.in b/c/src/lib/libc/Makefile.in index bb2ec1a3d4..3b5dc10273 100644 --- a/c/src/lib/libc/Makefile.in +++ b/c/src/lib/libc/Makefile.in @@ -44,7 +44,10 @@ DIRECTORY_SCAN_PIECES=\ opendir closedir readdir rewinddir scandir seekdir telldir getcwd MALLOC_PIECES=\ - malloc __brk __sbrk \ + malloc __brk __sbrk + +PASSWORD_GROUP_PIECES=\ + getpwent getgwent LIBC_GLUE_PIECES=\ __gettod __times \ @@ -78,6 +81,7 @@ C_PIECES=\ $(LIBC_GLUE_PIECES) \ $(BASE_FS_PIECES) \ $(MALLOC_PIECES) \ + $(PASSWORD_GROUP_PIECES) \ $(TERMIOS_PIECES) \ $(SYSTEM_CALL_PIECES) \ $(DIRECTORY_SCAN_PIECES) \ diff --git a/c/src/lib/libc/getgrent.c b/c/src/lib/libc/getgrent.c new file mode 100644 index 0000000000..080187d178 --- /dev/null +++ b/c/src/lib/libc/getgrent.c @@ -0,0 +1,119 @@ +/* + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +static struct group gr_group; /* password structure */ +static FILE *group_fp; + +static char groupname[8]; +static char password[1024]; +static char groups[1024]; +static char *gr_mem[16] = { } ; + +struct group * +getgrnam (name) + const char *name; +{ + FILE *fp; + char buf[1024]; + + if ((fp = fopen ("/etc/group", "r")) == NULL) + { + return NULL; + } + + while (fgets (buf, sizeof (buf), fp)) + { + sscanf (buf, "%[^:]:%[^:]:%d:%s\n", + groupname, password, &gr_group.gr_gid, + groups); + gr_group.gr_name = groupname; + gr_group.gr_passwd = password; + gr_group.gr_mem = gr_mem ; + + if (!strcmp (groupname, name)) + { + fclose (fp); + return &gr_group; + } + } + fclose (fp); + return NULL; +} + +struct group * +getgrgid (gid_t gid) +{ + FILE *fp; + char buf[1024]; + + if ((fp = fopen ("/etc/group", "r")) == NULL) + { + return NULL; + } + + while (fgets (buf, sizeof (buf), fp)) + { + sscanf (buf, "%[^:]:%[^:]:%d:%s\n", + groupname, password, &gr_group.gr_gid, + groups); + gr_group.gr_name = groupname; + gr_group.gr_passwd = password; + gr_group.gr_mem = gr_mem ; + + + if (gid == gr_group.gr_gid) + { + fclose (fp); + return &gr_group; + } + } + fclose (fp); + return NULL; +} + +struct group * +getgrent () +{ + char buf[1024]; + + if (group_fp == NULL) + return NULL; + + if (fgets (buf, sizeof (buf), group_fp) == NULL) + return NULL; + + sscanf (buf, "%[^:]:%[^:]:%d:%s\n", + groupname, password, &gr_group.gr_gid, + groups); + gr_group.gr_name = groupname; + gr_group.gr_passwd = password; + gr_group.gr_mem = gr_mem ; + + return &gr_group; +} + +void +setgrent () +{ + if (group_fp != NULL) + fclose (group_fp); + + group_fp = fopen ("/etc/group", "r"); +} + +void +endgrent () +{ + if (group_fp != NULL) + fclose (group_fp); +} 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