X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/187e9c24f1cf93cc8ef2a5dd50a43bc894db6779..dbd8811b85ad43507dd04b31812322596e59f3b4:/uidlist.c diff --git a/uidlist.c b/uidlist.c index 930a01a7..c3322dbd 100644 --- a/uidlist.c +++ b/uidlist.c @@ -25,7 +25,10 @@ #include "rsync.h" -#ifdef GETGROUPS_T +#ifdef HAVE_GETGROUPS +# if !defined(GETGROUPS_T) +# define GETGROUPS_T gid_t +# endif # ifndef NGROUPS_MAX /* It ought to be defined, but just in case. */ # define NGROUPS_MAX 32 @@ -117,7 +120,7 @@ static uid_t match_uid(uid_t uid) static int is_in_group(gid_t gid) { -#ifdef GETGROUPS_T +#ifdef HAVE_GETGROUPS static gid_t last_in = GID_NONE, last_out; static int ngroups = -2; static GETGROUPS_T *gidset; @@ -126,11 +129,9 @@ static int is_in_group(gid_t gid) if (gid == last_in) return last_out; if (ngroups < -1) { - gid_t mygid = getgid(); - ngroups = getgroups(0, 0); - /* If that didn't work, perhaps 0 isn't treated specially? */ - if (ngroups <= 0) - ngroups = NGROUPS_MAX; + gid_t mygid = MY_GID(); + if ((ngroups = getgroups(0, 0)) < 0) + ngroups = 0; gidset = new_array(GETGROUPS_T, ngroups+1); if (ngroups > 0) ngroups = getgroups(ngroups, gidset); @@ -165,7 +166,7 @@ static int is_in_group(gid_t gid) #else static gid_t mygid = GID_NONE; if (mygid == GID_NONE) { - mygid = getgid(); + mygid = MY_GID(); if (verbose > 3) rprintf(FINFO, "process has gid %ld\n", (long)mygid); } @@ -191,7 +192,7 @@ static gid_t match_gid(gid_t gid) list = list->next; } - if (am_root) + if (am_root || is_in_group(gid)) last_out = gid; else last_out = GID_NONE;