>From b1a1450d454698a765a625804fe336305209c696 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 30 Jun 2015 09:32:07 -0700 Subject: [PATCH] mgetgroups: port to strict OS X The previous fix wasn't working, so use a bigger hammer (Bug#20923). * lib/mgetgroups.c: Ignore -Wpointer-sign diagnostics. (getgrouplist_gids) [HAVE_GETGROUPLIST]: Remove. All uses removed. * m4/mgetgroups.m4 (gl_MGETGROUPS): Revert recent changes. --- ChangeLog | 8 ++++++++ lib/mgetgroups.c | 14 +++++++------- m4/mgetgroups.m4 | 35 +---------------------------------- 3 files changed, 16 insertions(+), 41 deletions(-) diff --git a/ChangeLog b/ChangeLog index cb6ca08..37120cd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2015-06-30 Paul Eggert + + mgetgroups: port to strict OS X + The previous fix wasn't working, so use a bigger hammer (Bug#20923). + * lib/mgetgroups.c: Ignore -Wpointer-sign diagnostics. + (getgrouplist_gids) [HAVE_GETGROUPLIST]: Remove. All uses removed. + * m4/mgetgroups.m4 (gl_MGETGROUPS): Revert recent changes. + 2015-06-29 Paul Eggert mgetgroups: port to strict OS X diff --git a/lib/mgetgroups.c b/lib/mgetgroups.c index dd0c7a5..6acb019 100644 --- a/lib/mgetgroups.c +++ b/lib/mgetgroups.c @@ -33,6 +33,12 @@ #include "getugroups.h" #include "xalloc-oversized.h" +/* Work around an incompatibility of OS X 10.11: getgrouplist + accepts int *, not gid_t *, and int and gid_t differ in sign. */ +#if 4 < __GNUC__ + (3 <= __GNUC_MINOR__) +# pragma GCC diagnostic ignored "-Wpointer-sign" +#endif + static gid_t * realloc_groupbuf (gid_t *g, size_t num) { @@ -64,11 +70,6 @@ mgetgroups (char const *username, gid_t gid, gid_t **groups) gid_t *g; #if HAVE_GETGROUPLIST -# if HAVE_GETGROUPLIST_WITH_INT -# define getgrouplist_gids(g) ((int *) (g)) -# else -# define getgrouplist_gids(g) (g) -# endif /* We prefer to use getgrouplist if available, because it has better performance characteristics. @@ -92,8 +93,7 @@ mgetgroups (char const *username, gid_t gid, gid_t **groups) int last_n_groups = max_n_groups; /* getgrouplist updates max_n_groups to num required. */ - ng = getgrouplist (username, gid, getgrouplist_gids (g), - &max_n_groups); + ng = getgrouplist (username, gid, g, &max_n_groups); /* Some systems (like Darwin) have a bug where they never increase max_n_groups. */ diff --git a/m4/mgetgroups.m4 b/m4/mgetgroups.m4 index 5747148..42b5cf8 100644 --- a/m4/mgetgroups.m4 +++ b/m4/mgetgroups.m4 @@ -1,4 +1,4 @@ -#serial 7 +#serial 5 dnl Copyright (C) 2007-2015 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -6,38 +6,5 @@ dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_MGETGROUPS], [ - AC_CHECK_HEADERS_ONCE([grp.h]) AC_CHECK_FUNCS_ONCE([getgrouplist]) - if test "$ac_cv_func_getgrouplist" = yes; then - AC_CACHE_CHECK([for getgrouplist with int signature], - [gl_cv_getgrouplist_with_int], - [gl_cv_getgrouplist_with_int=no - gl_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - AC_COMPILE_IFELSE( - [AC_LANG_PROGRAM( - [[#if HAVE_GRP_H - #include - #endif - int groups[1]; - int ngroups = 1; - ]], - [[return - getgrouplist ("root", 0, groups, &ngroups);]])], - [], - [AC_COMPILE_IFELSE( - [AC_LANG_PROGRAM( - [[#if HAVE_GRP_H - #include - #endif - int groups[sizeof (gid_t) == sizeof (int) ? 1 : -1]; - int ngroups = 1; - ]], - [[return - getgrouplist ("root", 0, groups, &ngroups);]])], - [gl_cv_getgrouplist_with_int=yes])]) - ac_c_werror_flag=$gl_save_c_werror_flag]) - if test "$gl_cv_getgrouplist_with_int" = yes; then - AC_DEFINE([HAVE_GETGROUPLIST_WITH_INT], 1, - [Define to 1 if getgrouplist accepts and returns int and not gid_t.]) - fi - fi ]) -- 2.1.0