summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Blake <ebb9@byu.net>2009-11-12 11:59:09 -0700
committerEric Blake <ebb9@byu.net>2009-11-13 07:50:20 -0700
commit6a31fd8d732afd232d6a99708192170e13129374 (patch)
treea02c4dc471e03a5b54820a03776097ffc1a5e08f
parent719a95aa9dca00c83c6da57fbdd5c2ae7acaa1f8 (diff)
downloadcoreutils-6a31fd8d732afd232d6a99708192170e13129374.tar.xz
build: update gnulib, for getgroups improvements
A replacement getgroups is now guaranteed to exist, but it may fail with ENOSYS. mgetgroups is moved to gnulib, and now takes gid_t instead of GETGROUPS_T (but setgroups still needs GETGROUPS_T). * gnulib: Update to latest. * gl/modules/mgetgroups: Delete, moved to gnulib. * gl/m4/mgetgroups.m4: Likewise. * gl/lib/mgetgroups.h: Likewise. * gl/lib/mgetgroups.c: Likewise. * src/group-list.c (print_group_list): Adjust callers. * src/id.c (print_full_info): Likewise.
-rw-r--r--gl/lib/mgetgroups.c142
-rw-r--r--gl/lib/mgetgroups.h19
-rw-r--r--gl/m4/mgetgroups.m411
-rw-r--r--gl/modules/mgetgroups24
m---------gnulib0
-rw-r--r--src/group-list.c6
-rw-r--r--src/id.c6
7 files changed, 4 insertions, 204 deletions
diff --git a/gl/lib/mgetgroups.c b/gl/lib/mgetgroups.c
deleted file mode 100644
index 0ebc2be15..000000000
--- a/gl/lib/mgetgroups.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/* mgetgroups.c -- return a list of the groups a user is in
-
- Copyright (C) 2007-2009 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
-
-/* Extracted from coreutils' src/id.c. */
-
-#include <config.h>
-
-#include "mgetgroups.h"
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <stdint.h>
-#include <string.h>
-#include <errno.h>
-#if HAVE_GETGROUPLIST
-# include <grp.h>
-#endif
-#include "getugroups.h"
-#include "xalloc.h"
-
-
-static GETGROUPS_T *
-realloc_groupbuf (GETGROUPS_T *g, size_t num)
-{
- if (xalloc_oversized (num, sizeof (*g)))
- {
- errno = ENOMEM;
- return NULL;
- }
-
- return realloc (g, num * sizeof (*g));
-}
-
-/* Like getugroups, but store the result in malloc'd storage.
- Set *GROUPS to the malloc'd list of all group IDs of which USERNAME
- is a member. If GID is not -1, store it first. GID should be the
- group ID (pw_gid) obtained from getpwuid, in case USERNAME is not
- listed in the groups database (e.g., /etc/groups). Upon failure,
- don't modify *GROUPS, set errno, and return -1. Otherwise, return
- the number of groups. */
-
-int
-mgetgroups (char const *username, gid_t gid, GETGROUPS_T **groups)
-{
- int max_n_groups;
- int ng;
- GETGROUPS_T *g;
-
-#if HAVE_GETGROUPLIST
- /* We prefer to use getgrouplist if available, because it has better
- performance characteristics.
-
- In glibc 2.3.2, getgrouplist is buggy. If you pass a zero as the
- length of the output buffer, getgrouplist will still write to the
- buffer. Contrary to what some versions of the getgrouplist
- manpage say, this doesn't happen with nonzero buffer sizes.
- Therefore our usage here just avoids a zero sized buffer. */
- if (username)
- {
- enum { N_GROUPS_INIT = 10 };
- max_n_groups = N_GROUPS_INIT;
-
- g = realloc_groupbuf (NULL, max_n_groups);
- if (g == NULL)
- return -1;
-
- while (1)
- {
- GETGROUPS_T *h;
- int last_n_groups = max_n_groups;
-
- /* getgrouplist updates max_n_groups to num required. */
- ng = getgrouplist (username, gid, g, &max_n_groups);
-
- /* Some systems (like Darwin) have a bug where they
- never increase max_n_groups. */
- if (ng < 0 && last_n_groups == max_n_groups)
- max_n_groups *= 2;
-
- if ((h = realloc_groupbuf (g, max_n_groups)) == NULL)
- {
- int saved_errno = errno;
- free (g);
- errno = saved_errno;
- return -1;
- }
- g = h;
-
- if (0 <= ng)
- {
- *groups = g;
- /* On success some systems just return 0 from getgrouplist,
- so return max_n_groups rather than ng. */
- return max_n_groups;
- }
- }
- }
- /* else no username, so fall through and use getgroups. */
-#endif
-
- max_n_groups = (username
- ? getugroups (0, NULL, username, gid)
- : getgroups (0, NULL));
-
- /* If we failed to count groups with NULL for a buffer,
- try again with a non-NULL one, just in case. */
- if (max_n_groups < 0)
- max_n_groups = 5;
-
- g = realloc_groupbuf (NULL, max_n_groups);
- if (g == NULL)
- return -1;
-
- ng = (username
- ? getugroups (max_n_groups, g, username, gid)
- : getgroups (max_n_groups, g));
-
- if (ng < 0)
- {
- int saved_errno = errno;
- free (g);
- errno = saved_errno;
- return -1;
- }
-
- *groups = g;
- return ng;
-}
diff --git a/gl/lib/mgetgroups.h b/gl/lib/mgetgroups.h
deleted file mode 100644
index 4779fecf0..000000000
--- a/gl/lib/mgetgroups.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Get a list of all group IDs associated with a specified user ID.
- Copyright (C) 2007, 2009 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
-
-#include <sys/types.h>
-
-int mgetgroups (const char *username, gid_t gid, GETGROUPS_T **groups);
diff --git a/gl/m4/mgetgroups.m4 b/gl/m4/mgetgroups.m4
deleted file mode 100644
index 4b3f32828..000000000
--- a/gl/m4/mgetgroups.m4
+++ /dev/null
@@ -1,11 +0,0 @@
-#serial 3
-dnl Copyright (C) 2007-2009 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_MGETGROUPS],
-[
- AC_CHECK_FUNCS([getgrouplist])
- AC_LIBOBJ([mgetgroups])
-])
diff --git a/gl/modules/mgetgroups b/gl/modules/mgetgroups
deleted file mode 100644
index 8bce53a56..000000000
--- a/gl/modules/mgetgroups
+++ /dev/null
@@ -1,24 +0,0 @@
-Description:
-Return the group IDs of a user in malloc'd storage.
-
-Files:
-lib/mgetgroups.c
-lib/mgetgroups.h
-m4/mgetgroups.m4
-
-Depends-on:
-getugroups
-xalloc
-
-configure.ac:
-gl_MGETGROUPS
-
-Makefile.am:
-
-Include:
-
-License:
-LGPL
-
-Maintainer:
-Jim Meyering
diff --git a/gnulib b/gnulib
-Subproject 5ca4b90d06ed5871ed0bf7bd59dbbf23b69a00e
+Subproject 8c4c7e9f211d2d5ed1099ca21b049f6ed567e67
diff --git a/src/group-list.c b/src/group-list.c
index 4c5391ddb..1fadd0c57 100644
--- a/src/group-list.c
+++ b/src/group-list.c
@@ -54,14 +54,13 @@ print_group_list (const char *username,
ok = false;
}
-#if HAVE_GETGROUPS
{
- GETGROUPS_T *groups;
+ gid_t *groups;
int i;
int n_groups = mgetgroups (username, (pwd ? pwd->pw_gid : (gid_t) -1),
&groups);
- if (n_groups < 0)
+ if (n_groups < 0 && errno != ENOSYS)
{
if (username)
{
@@ -84,7 +83,6 @@ print_group_list (const char *username,
}
free (groups);
}
-#endif /* HAVE_GETGROUPS */
return ok;
}
diff --git a/src/id.c b/src/id.c
index 601e77077..9a00f5ce4 100644
--- a/src/id.c
+++ b/src/id.c
@@ -292,14 +292,13 @@ print_full_info (const char *username)
printf ("(%s)", grp->gr_name);
}
-#if HAVE_GETGROUPS
{
- GETGROUPS_T *groups;
+ gid_t *groups;
int i;
int n_groups = mgetgroups (username, (pwd ? pwd->pw_gid : (gid_t) -1),
&groups);
- if (n_groups < 0)
+ if (n_groups < 0 && errno != ENOSYS)
{
if (username)
{
@@ -327,7 +326,6 @@ print_full_info (const char *username)
}
free (groups);
}
-#endif /* HAVE_GETGROUPS */
/* POSIX mandates the precise output format, and that it not include
any context=... part, so skip that if POSIXLY_CORRECT is set. */