about summary refs log tree commit diff
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);
+}
+
+
+