diff options
| author | Wayne Davison <wayned@samba.org> | 2004-01-22 09:16:21 +0000 |
|---|---|---|
| committer | Wayne Davison <wayned@samba.org> | 2004-01-22 09:16:21 +0000 |
| commit | 72fc7ec59bd5c4c34214cf911a27f16b6749679a (patch) | |
| tree | f479b4f8f8bf3be53ad993763e562a2cde45888f /uidlist.c | |
| parent | 58743a87b8a6b8160c6bd562ed4dd8dcfcb2d4e2 (diff) | |
| download | android_external_rsync-72fc7ec59bd5c4c34214cf911a27f16b6749679a.tar.gz android_external_rsync-72fc7ec59bd5c4c34214cf911a27f16b6749679a.tar.bz2 android_external_rsync-72fc7ec59bd5c4c34214cf911a27f16b6749679a.zip | |
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.
Diffstat (limited to 'uidlist.c')
| -rw-r--r-- | uidlist.c | 22 |
1 files changed, 19 insertions, 3 deletions
@@ -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; |
