X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/d6b422a61cc082428904d4b7a7c51260e7cd49e9..f57ab2f71889ca2e0f3f6c2c784e7ff76db20db0:/uidlist.c diff --git a/uidlist.c b/uidlist.c index 93fc10ea..7477f36d 100644 --- a/uidlist.c +++ b/uidlist.c @@ -6,8 +6,9 @@ * 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 - * published by the Free Software Foundation. + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -15,8 +16,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 +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. */ @@ -361,11 +359,11 @@ void recv_id_list(int f, struct file_list *flist) match_acl_ids(); #endif if (am_root && preserve_uid && !numeric_ids) { - for (i = 0; i < flist->count; i++) + for (i = 0; i < flist->used; i++) F_OWNER(flist->files[i]) = match_uid(F_OWNER(flist->files[i])); } if (preserve_gid && (!am_root || !numeric_ids)) { - for (i = 0; i < flist->count; i++) { + for (i = 0; i < flist->used; i++) { F_GROUP(flist->files[i]) = match_gid(F_GROUP(flist->files[i]), &flist->files[i]->flags); }