X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/142a5e7b8b128797db27c1a31af7d05c9cc4928e..f57ab2f71889ca2e0f3f6c2c784e7ff76db20db0:/uidlist.c diff --git a/uidlist.c b/uidlist.c index 790e9c16..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 @@ -216,25 +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 == 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. */ @@ -360,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); }