From: Wayne Davison Date: Thu, 22 Jan 2004 09:16:21 +0000 (+0000) Subject: Made the getgroups() code a little more portable. This will hopefully X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/commitdiff_plain/72fc7ec59bd5c4c34214cf911a27f16b6749679a Made the getgroups() code a little more portable. This will hopefully make the chgrp test work on the NetBSD and OpenBSD systems where it is failing. --- diff --git a/uidlist.c b/uidlist.c index bee35384..896e16ca 100644 --- a/uidlist.c +++ b/uidlist.c @@ -25,6 +25,13 @@ #include "rsync.h" +#ifdef GETGROUPS_T +# ifndef NGROUPS_MAX +/* It ought to be defined, but just in case. */ +# define NGROUPS_MAX 32 +# endif +#endif + extern int preserve_uid; extern int preserve_gid; extern int numeric_ids; @@ -117,12 +124,21 @@ static int is_in_group(gid_t gid) if (gid == last_in) return last_out; if (ngroups < -1) { - /* treat failure (-1) as if not member of any group */ + gid_t mygid = getgid(); ngroups = getgroups(0, 0); - if (ngroups > 0) { - gidset = new_array(GETGROUPS_T, ngroups); + /* If that didn't work, perhaps 0 isn't treated specially? */ + if (ngroups < 0) + ngroups = NGROUPS_MAX; + gidset = new_array(GETGROUPS_T, ngroups+1); + if (ngroups > 0) ngroups = getgroups(ngroups, gidset); + /* The default gid might not be in the list on some systems. */ + for (n = 0; n < ngroups; n++) { + if (gidset[n] == mygid) + break; } + if (n == ngroups) + gidset[ngroups++] = mygid; } last_in = gid;