X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/d6b422a61cc082428904d4b7a7c51260e7cd49e9..4fd842f98df4970f6e49a0365dbed60774e56c09:/uidlist.c diff --git a/uidlist.c b/uidlist.c index 93fc10ea..bce11e9b 100644 --- a/uidlist.c +++ b/uidlist.c @@ -6,7 +6,7 @@ * Copyright (C) 2004-2007 Wayne Davison * * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as + * it under the terms of the GNU General Public License version 3 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, @@ -15,8 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + * with this program; if not, visit the http://fsf.org website. */ /* If the source username/group does not exist on the target then use @@ -26,12 +25,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 +32,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 +215,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. */