X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/d6b422a61cc082428904d4b7a7c51260e7cd49e9..b5ae4e25c26f006e686dcefde9fe7d489f840248:/uidlist.c diff --git a/uidlist.c b/uidlist.c index 93fc10ea..dea3804e 100644 --- a/uidlist.c +++ b/uidlist.c @@ -26,12 +26,6 @@ #include "rsync.h" #include "io.h" -#ifdef HAVE_GETGROUPS -# ifndef GETGROUPS_T -# define GETGROUPS_T gid_t -# endif -#endif - extern int verbose; extern int am_root; extern int preserve_uid; @@ -39,6 +33,14 @@ extern int preserve_gid; extern int preserve_acls; extern int numeric_ids; +#ifdef HAVE_GETGROUPS +# ifndef GETGROUPS_T +# define GETGROUPS_T gid_t +# endif +#endif + +#define GID_NONE ((gid_t)-1) + struct idlist { struct idlist *next; char *name; @@ -214,28 +216,24 @@ uid_t match_uid(uid_t uid) gid_t match_gid(gid_t gid, uint16 *flags_ptr) { - static gid_t last_in = GID_NONE, last_out = GID_NONE; + static struct idlist *last = NULL; struct idlist *list; - if (gid == GID_NONE) - return GID_NONE; - - if (gid == last_in) - return last_out; - - last_in = gid; - - for (list = gidlist; list; list = list->next) { - if (list->id == gid) - break; + if (last && gid == last->id) + list = last; + else { + for (list = gidlist; list; list = list->next) { + if (list->id == gid) + break; + } + if (!list) + list = recv_add_gid(gid, NULL); + last = list; } - if (!list) - list = recv_add_gid(gid, NULL); - if (flags_ptr && list->flags & FLAG_SKIP_GROUP) *flags_ptr |= FLAG_SKIP_GROUP; - return last_out = list->id2; + return list->id2; } /* Add a uid to the list of uids. Only called on sending side. */