X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/67e4043e8c098c223db3b44c91666afdd1dc590f..0f78b81511be65d8fe21af1e6ac674f9e80ac29d:/uidlist.c diff --git a/uidlist.c b/uidlist.c index c992f079..5b252439 100644 --- a/uidlist.c +++ b/uidlist.c @@ -1,27 +1,28 @@ /* - Copyright (C) Andrew Tridgell 1996 - Copyright (C) Paul Mackerras 1996 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 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 - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - 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., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -/* handle the mapping of uid/gid and user/group names between systems. - If the source username/group does not exist on the target then use - the numeric IDs. Never do any mapping for uid=0 or gid=0 as these - are special. -*/ + * Handle the mapping of uid/gid and user/group names between systems. + * + * Copyright (C) 1996 Andrew Tridgell + * Copyright (C) 1996 Paul Mackerras + * Copyright (C) 2004, 2005, 2006 Wayne Davison + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* If the source username/group does not exist on the target then use + * the numeric IDs. Never do any mapping for uid=0 or gid=0 as these + * are special. */ #include "rsync.h" @@ -46,9 +47,6 @@ struct idlist { static struct idlist *uidlist; static struct idlist *gidlist; -static struct id_pair *pair_list; -static int pair_cnt = 0, pair_alloc = 0; - static struct idlist *add_to_list(struct idlist **root, int id, char *name, int id2) { @@ -310,7 +308,7 @@ void send_uid_list(int f) /* recv a complete uid/gid mapping from the peer and map the uid/gid * in the file list to local names */ -void recv_uid_list(int f) +void recv_uid_list(int f, struct file_list *flist) { int id, i; char *name; @@ -339,44 +337,13 @@ void recv_uid_list(int f) } } - /* Now convert the id_pair array over to mapped uid/gid values. */ + /* Now convert all the uids/gids from sender values to our values. */ if (am_root && preserve_uid && !numeric_ids) { - for (i = 0; i < pair_cnt; i++) - pair_list[i].uid = match_uid(pair_list[i].uid); + for (i = 0; i < flist->count; i++) + flist->files[i]->uid = match_uid(flist->files[i]->uid); } if (preserve_gid && (!am_root || !numeric_ids)) { - for (i = 0; i < pair_cnt; i++) - pair_list[i].gid = match_gid(pair_list[i].gid); - } -} - -struct id_pair *id_pair(uid_t uid, gid_t gid) -{ - static int j = 0; - - if (pair_cnt) { - int start = j; - fprintf(stderr, "start = %d\n", start); - /* We start our search where we left off because - * the IDs usually come in clumps. */ - do { - fprintf(stderr, "checking %d\n", j); - if (uid == pair_list[j].uid && gid == pair_list[j].gid) - return pair_list + j; - if (++j == pair_cnt) - j = 0; - } while (j != start); + for (i = 0; i < flist->count; i++) + flist->files[i]->gid = match_gid(flist->files[i]->gid); } - - if (pair_cnt == pair_alloc) { - pair_alloc += 128; - pair_list = realloc_array(pair_list, struct id_pair, - pair_alloc); - } - - j = pair_cnt++; - pair_list[j].uid = uid; - pair_list[j].gid = gid; - - return pair_list + j; }