X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/5e58e3f9cf3db5c3958fe6505eb59a2f814887fb..82ad07c4182f744c07b96a15df4572e559ed7dc8:/uidlist.c diff --git a/uidlist.c b/uidlist.c index b9ab1b6c..8104eca7 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., + * 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, 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) { @@ -128,12 +126,10 @@ static int is_in_group(gid_t gid) char *gidbuf = new_array(char, ngroups*21+32); if (!gidbuf) out_of_memory("is_in_group"); - sprintf(gidbuf, "process has %d gid%s: ", - ngroups, ngroups == 1? "" : "s"); - pos = strlen(gidbuf); + pos = snprintf(gidbuf, 32, "process has %d gid%s: ", + ngroups, ngroups == 1? "" : "s"); for (n = 0; n < ngroups; n++) { - sprintf(gidbuf+pos, " %d", (int)gidset[n]); - pos += strlen(gidbuf+pos); + pos += snprintf(gidbuf+pos, 21, " %d", (int)gidset[n]); } rprintf(FINFO, "%s\n", gidbuf); free(gidbuf); @@ -274,9 +270,6 @@ void send_uid_list(int f) { struct idlist *list; - if (numeric_ids) - return; - if (preserve_uid) { int len; /* we send sequences of uid/byte-length/name */ @@ -310,7 +303,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,32 +332,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++) + F_UID(flist->files[i]) = match_uid(F_UID(flist->files[i])); } 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) -{ - int i; - - for (i = 0; i < pair_cnt; i++) { - if (uid == pair_list[i].uid && gid == pair_list[i].gid) - return pair_list + i; - } - - if (pair_cnt == pair_alloc) { - pair_alloc += 128; - pair_list = realloc_array(pair_list, struct id_pair, - pair_alloc); + for (i = 0; i < flist->count; i++) + F_GID(flist->files[i]) = match_gid(F_GID(flist->files[i])); } - pair_list[pair_cnt].uid = uid; - pair_list[pair_cnt].gid = gid; - return pair_list + pair_cnt++; }