X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/423dba8ea1327230ca267e4907b2739531734f91..a60e2dca6b475e41882d9070c90079dfedf6b5bc:/generator.c diff --git a/generator.c b/generator.c index 3274c75b..ba889703 100644 --- a/generator.c +++ b/generator.c @@ -30,6 +30,9 @@ extern int preserve_links; extern int am_root; extern int preserve_devices; extern int preserve_hard_links; +extern int preserve_perms; +extern int preserve_uid; +extern int preserve_gid; extern int update_only; extern int opt_ignore_existing; extern int csum_length; @@ -38,7 +41,6 @@ extern int size_only; extern int io_timeout; extern int protocol_version; extern int always_checksum; -extern int modify_window; extern char *compare_dest; extern int link_dest; @@ -51,18 +53,15 @@ static int skip_file(char *fname, return 0; } if (link_dest) { - extern int preserve_perms; - extern int preserve_uid; - extern int preserve_gid; - - if(preserve_perms - && (st->st_mode & ~_S_IFMT) != (file->mode & ~_S_IFMT)) + if (preserve_perms + && (st->st_mode & ~_S_IFMT) != (file->mode & ~_S_IFMT)) return 0; - if (preserve_uid && st->st_uid != file->uid) + if (am_root && preserve_uid && st->st_uid != file->uid) return 0; - if (preserve_gid && st->st_gid != file->gid) + if (preserve_gid && file->gid != GID_NONE + && st->st_gid != file->gid) return 0; } @@ -227,7 +226,7 @@ static BOOL disable_deltas_p(void) * * Generate approximately one checksum every block_len bytes. */ -static void generate_and_send_sums(struct map_struct *buf, OFF_T len, int f_out) +static void generate_and_send_sums(struct map_struct *buf, size_t len, int f_out) { size_t i; struct sum_struct sum; @@ -271,14 +270,13 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out) { int fd; STRUCT_STAT st; - struct map_struct *buf; + struct map_struct *mapbuf; int statret; struct file_struct *file = flist->files[i]; char *fnamecmp; char fnamecmpbuf[MAXPATHLEN]; extern char *compare_dest; extern int list_only; - extern int preserve_perms; extern int only_existing; extern int orig_umask; @@ -404,8 +402,10 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out) #endif if (preserve_hard_links && check_hard_link(file)) { - if (verbose > 1) - rprintf(FINFO, "recv_generator: \"%s\" is a hard link\n",f_name(file)); + if (verbose > 1) { + rprintf(FINFO, "recv_generator: \"%s\" is a hard link\n", + f_name(file)); + } return; } @@ -428,11 +428,11 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out) #if HAVE_LINK else if (link_dest && !dry_run) { if (do_link(fnamecmpbuf, fname) != 0) { - if (verbose > 0) + if (verbose > 0) { rprintf(FINFO,"link %s => %s : %s\n", - fnamecmpbuf, - fname, + fnamecmpbuf, fname, strerror(errno)); + } } fnamecmp = fnamecmpbuf; } @@ -505,11 +505,10 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out) return; } - if (st.st_size > 0) { - buf = map_file(fd,st.st_size); - } else { - buf = NULL; - } + if (st.st_size > 0) + mapbuf = map_file(fd,st.st_size); + else + mapbuf = NULL; if (verbose > 3) rprintf(FINFO,"gen mapped %s of size %.0f\n",fnamecmp,(double)st.st_size); @@ -518,10 +517,10 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out) rprintf(FINFO, "generating and sending sums for %d\n", i); write_int(f_out,i); - generate_and_send_sums(buf, st.st_size, f_out); + generate_and_send_sums(mapbuf, st.st_size, f_out); close(fd); - if (buf) unmap_file(buf); + if (mapbuf) unmap_file(mapbuf); } @@ -530,6 +529,7 @@ void generate_files(int f,struct file_list *flist,char *local_name,int f_recv) { int i; int phase=0; + char fbuf[MAXPATHLEN]; if (verbose > 2) rprintf(FINFO,"generator starting pid=%d count=%d\n", @@ -561,7 +561,8 @@ void generate_files(int f,struct file_list *flist,char *local_name,int f_recv) * handling of permissions is strange? */ } - recv_generator(local_name?local_name:f_name(file), flist,i,f); + recv_generator(local_name? local_name + : f_name_to(file,fbuf,sizeof fbuf), flist, i, f); file->mode = saved_mode; } @@ -577,9 +578,10 @@ void generate_files(int f,struct file_list *flist,char *local_name,int f_recv) /* files can cycle through the system more than once * to catch initial checksum errors */ - for (i=read_int(f_recv); i != -1; i=read_int(f_recv)) { + for (i = read_int(f_recv); i != -1; i = read_int(f_recv)) { struct file_struct *file = flist->files[i]; - recv_generator(local_name?local_name:f_name(file), flist,i,f); + recv_generator(local_name? local_name + : f_name_to(file,fbuf,sizeof fbuf), flist, i, f); } phase++;