summaryrefslogtreecommitdiff
path: root/grp
diff options
context:
space:
mode:
Diffstat (limited to 'grp')
-rw-r--r--grp/Makefile29
-rw-r--r--grp/fgetgrent.c41
-rw-r--r--grp/getgrent.c67
-rw-r--r--grp/getgrgid.c50
-rw-r--r--grp/getgrnam.c50
-rw-r--r--grp/grp.h101
-rw-r--r--grp/grpopen.c28
-rw-r--r--grp/grpread.c135
-rw-r--r--grp/initgroups.c73
-rw-r--r--grp/testgrp.c45
10 files changed, 619 insertions, 0 deletions
diff --git a/grp/Makefile b/grp/Makefile
new file mode 100644
index 0000000000..6444aab5ff
--- /dev/null
+++ b/grp/Makefile
@@ -0,0 +1,29 @@
+# Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public License as
+# published by the Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version.
+
+# The GNU C Library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+
+# You should have received a copy of the GNU Library General Public
+# License along with the GNU C Library; see the file COPYING.LIB. If
+# not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+# Cambridge, MA 02139, USA.
+
+#
+# Sub-makefile for grp portion of the library.
+#
+subdir := grp
+
+routines := grpopen grpread fgetgrent getgrent getgrgid getgrnam \
+ initgroups setgroups
+
+tests := testgrp
+
+include ../Rules
diff --git a/grp/fgetgrent.c b/grp/fgetgrent.c
new file mode 100644
index 0000000000..bef3e3f745
--- /dev/null
+++ b/grp/fgetgrent.c
@@ -0,0 +1,41 @@
+/* Copyright (C) 1991 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <ansidecl.h>
+#include <errno.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <grp.h>
+
+
+/* Read a group entry from STREAM. */
+struct group *
+DEFUN(fgetgrent, (stream), FILE *stream)
+{
+ static PTR info = NULL;
+ if (info == NULL)
+ {
+ info = __grpalloc();
+ if (info == NULL)
+ return NULL;
+ }
+
+ return __grpread(stream, info);
+}
diff --git a/grp/getgrent.c b/grp/getgrent.c
new file mode 100644
index 0000000000..105572f9a0
--- /dev/null
+++ b/grp/getgrent.c
@@ -0,0 +1,67 @@
+/* Copyright (C) 1991 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <ansidecl.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <grp.h>
+
+static FILE *stream = NULL;
+
+/* Rewind the stream. */
+void
+DEFUN_VOID(setgrent)
+{
+ if (stream != NULL)
+ rewind(stream);
+}
+
+
+/* Close the stream. */
+void
+DEFUN_VOID(endgrent)
+{
+ if (stream != NULL)
+ {
+ (void) fclose(stream);
+ stream = NULL;
+ }
+}
+
+
+/* Read an entry from the stream. */
+struct group *
+DEFUN_VOID(getgrent)
+{
+ static PTR info = NULL;
+ if (info == NULL)
+ {
+ info = __grpalloc();
+ if (info == NULL)
+ return(NULL);
+ }
+
+ if (stream == NULL)
+ {
+ stream = __grpopen();
+ if (stream == NULL)
+ return(NULL);
+ }
+
+ return(__grpread(stream, info));
+}
diff --git a/grp/getgrgid.c b/grp/getgrgid.c
new file mode 100644
index 0000000000..1375f5ff56
--- /dev/null
+++ b/grp/getgrgid.c
@@ -0,0 +1,50 @@
+/* Copyright (C) 1991 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <ansidecl.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <grp.h>
+
+/* Search for an entry with a matching group ID. */
+struct group *
+DEFUN(getgrgid, (gid), register gid_t gid)
+{
+ static PTR info = NULL;
+ register FILE *stream;
+ register struct group *g;
+
+ if (info == NULL)
+ {
+ info = __grpalloc();
+ if (info == NULL)
+ return NULL;
+ }
+
+ stream = __grpopen();
+ if (stream == NULL)
+ return NULL;
+
+ while ((g = __grpread(stream, info)) != NULL)
+ if (g->gr_gid == (gid_t) gid)
+ break;
+
+ (void) fclose(stream);
+ return g;
+}
diff --git a/grp/getgrnam.c b/grp/getgrnam.c
new file mode 100644
index 0000000000..1f88ea3ff3
--- /dev/null
+++ b/grp/getgrnam.c
@@ -0,0 +1,50 @@
+/* Copyright (C) 1991 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <ansidecl.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <grp.h>
+
+/* Search for an entry with a matching name. */
+struct group *
+DEFUN(getgrnam, (name), register CONST char *name)
+{
+ static PTR info = NULL;
+ register FILE *stream;
+ register struct group *g;
+
+ if (info == NULL)
+ {
+ info = __grpalloc();
+ if (info == NULL)
+ return NULL;
+ }
+
+ stream = __grpopen();
+ if (stream == NULL)
+ return NULL;
+
+ while ((g = __grpread(stream, info)) != NULL)
+ if (!strcmp(g->gr_name, name))
+ break;
+
+ (void) fclose(stream);
+ return g;
+}
diff --git a/grp/grp.h b/grp/grp.h
new file mode 100644
index 0000000000..2562671885
--- /dev/null
+++ b/grp/grp.h
@@ -0,0 +1,101 @@
+/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the, 1992 Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+/*
+ * POSIX Standard: 9.2.1 Group Database Access <grp.h>
+ */
+
+#ifndef _GRP_H
+
+#define _GRP_H 1
+#include <features.h>
+
+__BEGIN_DECLS
+
+#include <gnu/types.h>
+
+
+/* The group structure. */
+struct group
+ {
+ char *gr_name; /* Group name. */
+ char *gr_passwd; /* Password. */
+ __gid_t gr_gid; /* Group ID. */
+ char **gr_mem; /* Member list. */
+ };
+
+
+#if defined(__USE_SVID) || defined(__USE_GNU)
+#define __need_FILE
+#include <stdio.h>
+#endif
+
+#ifdef __USE_GNU
+/* Return a new stream open on the group file. */
+extern FILE *__grpopen __P ((void));
+
+/* Read a group entry from STREAM, filling in G.
+ Return the `struct group' of G if successful, NULL on failure. */
+extern struct group *__grpread __P ((FILE * __stream, __ptr_t __g));
+
+/* Return a chunk of memory containing pre-initialized data for __grpread. */
+extern __ptr_t __grpalloc __P ((void));
+#endif
+
+
+#if defined(__USE_SVID) || defined(__USE_MISC) || defined (__USE_BSD)
+/* Rewind the group-file stream. */
+extern void setgrent __P ((void));
+
+/* Close the group-file stream. */
+extern void endgrent __P ((void));
+
+/* Read an entry from the group-file stream, opening it if necessary. */
+extern struct group *getgrent __P ((void));
+#endif
+
+#ifdef __USE_SVID
+/* Read a group entry from STREAM. */
+extern struct group *fgetgrent __P ((FILE * __stream));
+#endif
+
+/* Search for an entry with a matching group ID. */
+extern struct group *getgrgid __P ((__gid_t __gid));
+
+/* Search for an entry with a matching group name. */
+extern struct group *getgrnam __P ((__const char *__name));
+
+
+#ifdef __USE_BSD
+
+#define __need_size_t
+#include <stddef.h>
+
+/* Set the group set for the current user to GROUPS (N of them). */
+extern int setgroups __P ((size_t __n, __const __gid_t * groups));
+
+/* Initialize the group set for the current user
+ by reading the group database and using all groups
+ of which USER is a member. Also include GROUP. */
+extern int initgroups __P ((__const char *user, __gid_t group));
+
+#endif /* Use BSD. */
+
+__END_DECLS
+
+#endif /* grp.h */
diff --git a/grp/grpopen.c b/grp/grpopen.c
new file mode 100644
index 0000000000..77d15979f1
--- /dev/null
+++ b/grp/grpopen.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 1991 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <ansidecl.h>
+#include <stdio.h>
+#include <grp.h>
+
+/* Return a new stream open on the group file. */
+FILE *
+DEFUN_VOID(__grpopen)
+{
+ return fopen("/etc/group", "r");
+}
diff --git a/grp/grpread.c b/grp/grpread.c
new file mode 100644
index 0000000000..b7bac4c192
--- /dev/null
+++ b/grp/grpread.c
@@ -0,0 +1,135 @@
+/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <ansidecl.h>
+#include <errno.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <grp.h>
+
+/* This is the function that all the others are based on.
+ The format of the group file is known only here. */
+
+/* Structure containing info kept by each __grpread caller. */
+typedef struct
+ {
+ char *buf;
+ size_t buflen;
+ size_t max_members;
+ char **members;
+ struct group g;
+ } grpread_info;
+
+
+/* Return a chunk of memory containing a pre-initialized `grpread_info'. */
+PTR
+DEFUN_VOID(__grpalloc)
+{
+ grpread_info *info = (PTR) malloc (sizeof(grpread_info));
+ if (info == NULL)
+ return NULL;
+
+ info->buf = NULL;
+ info->buflen = 0;
+
+ info->max_members = 5;
+ info->members = (char **) malloc (5 * sizeof(char *));
+ if (info->members == NULL)
+ {
+ free ((PTR) info);
+ return NULL;
+ }
+
+ return info;
+}
+
+/* Read a group entry from STREAM, filling in G. */
+struct group *
+DEFUN(__grpread, (stream, g), FILE *stream AND PTR CONST g)
+{
+ register grpread_info *CONST info = (grpread_info *) g;
+ char *start, *end;
+ register size_t i;
+
+ /* Idiocy checks. */
+ if (stream == NULL)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ do
+ if (__getline (&info->buf, &info->buflen, stream) == -1)
+ return NULL;
+ while (info->buf[0] == '#');
+
+ start = info->buf;
+ end = strchr (start, ':');
+ if (end == NULL)
+ return NULL;
+ *end = '\0';
+ info->g.gr_name = start;
+
+ start = end + 1;
+ end = strchr (start, ':');
+ if (end == NULL)
+ return NULL;
+ *end = '\0';
+ info->g.gr_passwd = start;
+
+ info->g.gr_gid = (gid_t) strtol (end + 1, &end, 10);
+ if (*end != ':')
+ return NULL;
+
+ i = 0;
+ do
+ {
+ start = end + 1;
+ end = strchr (start, ',');
+ if (end == NULL)
+ {
+ end = strchr (start, '\n');
+ if (end == start)
+ break;
+ if (end == NULL)
+ return NULL;
+ *end = '\0';
+ end = NULL;
+ }
+ else
+ *end = '\0';
+
+ if (i == info->max_members - 2)
+ {
+ info->max_members += 5;
+ info->members = (char **)
+ realloc ((PTR) info->members, info->max_members * sizeof (char *));
+ if (info->members == NULL)
+ return NULL;
+ }
+
+ info->members[i++] = start;
+ } while (end != NULL);
+ info->members[i] = NULL;
+ info->g.gr_mem = info->members;
+
+ return &info->g;
+}
diff --git a/grp/initgroups.c b/grp/initgroups.c
new file mode 100644
index 0000000000..5af1926742
--- /dev/null
+++ b/grp/initgroups.c
@@ -0,0 +1,73 @@
+/* Copyright (C) 1989, 1991, 1993 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <ansidecl.h>
+#include <unistd.h>
+#include <string.h>
+#include <grp.h>
+#include <limits.h>
+#include <sys/types.h>
+
+
+/* Initialize the group set for the current user
+ by reading the group database and using all groups
+ of which USER is a member. Also include GROUP. */
+int
+DEFUN(initgroups, (user, group),
+ CONST char *user AND gid_t group)
+{
+#ifdef NGROUPS_MAX
+#if NGROUPS_MAX == 0
+ return 0;
+#else
+ static PTR info = NULL;
+ register FILE *stream;
+ register struct group *g;
+ gid_t groups[NGROUPS_MAX];
+ register size_t n;
+
+ if (info == NULL)
+ {
+ info = __grpalloc();
+ if (info == NULL)
+ return -1;
+ }
+
+ stream = __grpopen();
+ if (stream == NULL)
+ return -1;
+
+ n = 0;
+ groups[n++] = group;
+
+ while (n < NGROUPS_MAX && (g = __grpread(stream, info)) != NULL)
+ if (g->gr_gid != group)
+ {
+ register char **m;
+
+ for (m = g->gr_mem; *m != NULL; ++m)
+ if (!strcmp(*m, user))
+ groups[n++] = g->gr_gid;
+ }
+
+ return setgroups(n, groups);
+#endif
+#else
+ return 0;
+#endif
+}
diff --git a/grp/testgrp.c b/grp/testgrp.c
new file mode 100644
index 0000000000..109d1a46d3
--- /dev/null
+++ b/grp/testgrp.c
@@ -0,0 +1,45 @@
+#include <ansidecl.h>
+#include <grp.h>
+#include <pwd.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+int
+DEFUN_VOID(main)
+{
+ uid_t me;
+ struct passwd *my_passwd;
+ struct group *my_group;
+ char **members;
+
+ me = getuid ();
+ my_passwd = getpwuid (me);
+ if (my_passwd == NULL)
+ perror ("getpwuid");
+ else
+ {
+ printf ("My login name is %s.\n", my_passwd->pw_name);
+ printf ("My uid is %d.\n", (int)(my_passwd->pw_uid));
+ printf ("My home directory is %s.\n", my_passwd->pw_dir);
+ printf ("My default shell is %s.\n", my_passwd->pw_shell);
+
+ my_group = getgrgid (my_passwd->pw_gid);
+ if (my_group == NULL)
+ perror ("getgrgid");
+ else
+ {
+ printf ("My default group is %s (%d).\n",
+ my_group->gr_name, (int)(my_passwd->pw_gid));
+ printf ("The members of this group are:\n");
+ for (members = my_group->gr_mem; *members != NULL; ++members)
+ printf (" %s\n", *members);
+ }
+ }
+
+ exit (my_passwd && my_group ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+
+
+