From 28f540f45bbacd939bfd07f213bcad2bf730b1bf Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Sat, 18 Feb 1995 01:27:10 +0000 Subject: initial import --- grp/Makefile | 29 ++++++++++++ grp/fgetgrent.c | 41 +++++++++++++++++ grp/getgrent.c | 67 +++++++++++++++++++++++++++ grp/getgrgid.c | 50 +++++++++++++++++++++ grp/getgrnam.c | 50 +++++++++++++++++++++ grp/grp.h | 101 +++++++++++++++++++++++++++++++++++++++++ grp/grpopen.c | 28 ++++++++++++ grp/grpread.c | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ grp/initgroups.c | 73 ++++++++++++++++++++++++++++++ grp/testgrp.c | 45 +++++++++++++++++++ 10 files changed, 619 insertions(+) create mode 100644 grp/Makefile create mode 100644 grp/fgetgrent.c create mode 100644 grp/getgrent.c create mode 100644 grp/getgrgid.c create mode 100644 grp/getgrnam.c create mode 100644 grp/grp.h create mode 100644 grp/grpopen.c create mode 100644 grp/grpread.c create mode 100644 grp/initgroups.c create mode 100644 grp/testgrp.c (limited to 'grp') 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 +#include +#include +#include +#include +#include +#include + + +/* 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 +#include +#include +#include + +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 +#include +#include +#include +#include + +/* 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 +#include +#include +#include +#include + +/* 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 + */ + +#ifndef _GRP_H + +#define _GRP_H 1 +#include + +__BEGIN_DECLS + +#include + + +/* 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 +#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 + +/* 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 +#include +#include + +/* 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 +#include +#include +#include +#include +#include +#include +#include + +/* 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 +#include +#include +#include +#include +#include + + +/* 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 +#include +#include +#include +#include +#include +#include + +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); +} + + + -- cgit v1.2.3