From: Markus Duft Date: Thu, 8 Sep 2011 11:09:27 +0000 (+0200) Subject: build: use getgr*_nomembers functions on Interix X-Git-Tag: v8.14~13 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=07498748d2808e47e4a513f190d74b86c14aa54c;p=thirdparty%2Fcoreutils.git build: use getgr*_nomembers functions on Interix Interix provides faster replacements for getgr{gid,nam,ent} where group member information is not fetched from domain controllers. This makes 'id' usable on domain controlled interix boxes. * m4/jm-macros.m4: Check for _nomembers functions. * src/system.h: Redefine function to _nomembers when available. --- diff --git a/m4/jm-macros.m4 b/m4/jm-macros.m4 index 58b000d3f7..dc68f3b618 100644 --- a/m4/jm-macros.m4 +++ b/m4/jm-macros.m4 @@ -89,6 +89,16 @@ AC_DEFUN([coreutils_MACROS], tcgetpgrp \ ) + # These checks are for Interix, to avoid its getgr* functions, in favor + # of these replacements. The replacement functions are much more efficient + # because they do not query the domain controller for user information + # when it is not needed. + AC_CHECK_FUNCS_ONCE([ + getgrgid_nomembers + getgrnam_nomembers + getgrent_nomembers + ]) + dnl This can't use AC_REQUIRE; I'm not quite sure why. cu_PREREQ_STAT_PROG diff --git a/src/system.h b/src/system.h index ec64cd0d87..18ac0cc9f5 100644 --- a/src/system.h +++ b/src/system.h @@ -213,6 +213,24 @@ struct passwd *getpwuid (); struct group *getgrgid (); #endif +/* Interix has replacements for getgr{gid,nam,ent}, that don't + query the domain controller for group members when not required. + This speeds up the calls tremendously (<1 ms vs. >3 s). */ +/* To protect any system that could provide _nomembers functions + other than interix, check for HAVE_SETGROUPS, as interix is + one of the very few (the only?) platform that lacks it */ +#if ! HAVE_SETGROUPS +# if HAVE_GETGRGID_NOMEMBERS +# define getgrgid(gid) getgrgid_nomembers(gid) +# endif +# if HAVE_GETGRNAM_NOMEMBERS +# define getgrnam(nam) getgrnam_nomembers(nam) +# endif +# if HAVE_GETGRENT_NOMEMBERS +# define getgrent() getgrent_nomembers() +# endif +#endif + #if !HAVE_DECL_GETUID uid_t getuid (); #endif