X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/575f2fca9ab74cb30cca67323a414d7b0cdd0845..d5c973ccb7da1bc87c5caa5d5ac594bc217016f7:/uidlist.c diff --git a/uidlist.c b/uidlist.c index 4aa098f8..14611a55 100644 --- a/uidlist.c +++ b/uidlist.c @@ -28,6 +28,7 @@ extern int preserve_uid; extern int preserve_gid; extern int numeric_ids; +extern int am_root; struct idlist { struct idlist *next; @@ -67,38 +68,19 @@ static char *gid_to_name(gid_t gid) return NULL; } - -/* turn a user name into a uid */ -static uid_t name_to_uid(char *name) -{ - struct passwd *pass; - if (!name || !*name) return 0; - pass = getpwnam(name); - if (pass) return(pass->pw_uid); - return 0; -} - -/* turn a group name into a gid */ -static gid_t name_to_gid(char *name) -{ - struct group *grp; - if (!name || !*name) return 0; - grp = getgrnam(name); - if (grp) return(grp->gr_gid); - return 0; -} - static int map_uid(int id, char *name) { - uid_t uid = name_to_uid(name); - if (uid != 0) return uid; + uid_t uid; + if (name_to_uid(name, &uid) && uid != 0) + return uid; return id; } static int map_gid(int id, char *name) { - gid_t gid = name_to_gid(name); - if (gid != 0) return gid; + gid_t gid; + if (name_to_gid(name, &gid) && gid != 0) + return gid; return id; } @@ -141,7 +123,10 @@ static gid_t match_gid(gid_t gid) list = list->next; } - last_out = gid; + if (am_root) + last_out = gid; + else + last_out = (gid_t) -1; return last_out; } @@ -295,12 +280,12 @@ void recv_uid_list(int f, struct file_list *flist) } } - if (!uidlist && !gidlist) return; + if (!(am_root && preserve_uid) && !preserve_gid) return; /* now convert the uid/gid of all files in the list to the mapped uid/gid */ for (i=0;icount;i++) { - if (preserve_uid && flist->files[i]->uid != 0) { + if (am_root && preserve_uid && flist->files[i]->uid != 0) { flist->files[i]->uid = match_uid(flist->files[i]->uid); } if (preserve_gid && flist->files[i]->gid != 0) {