X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/fb55e28d83ab11c17b8932019362a8926598efcd..2ef2e822d17aaeb713648f73f106e4cf1239b55f:/generator.c diff --git a/generator.c b/generator.c index 48273f0c..2fd90e3b 100644 --- a/generator.c +++ b/generator.c @@ -30,15 +30,17 @@ 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; extern int ignore_times; extern int size_only; extern int io_timeout; -extern int remote_version; +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_t)-1 + && st->st_gid != file->gid) return 0; } @@ -80,7 +79,7 @@ static int skip_file(char *fname, } } file_checksum(fname,sum,st->st_size); - if (remote_version < 21) { + if (protocol_version < 21) { return (memcmp(sum,file->sum,2) == 0); } else { return (memcmp(sum,file->sum,MD4_SUM_LENGTH) == 0); @@ -112,7 +111,7 @@ void write_sum_head(int f, struct sum_struct *sum) write_int(f, sum->count); write_int(f, sum->blength); - if (remote_version >= 27) + if (protocol_version >= 27) write_int(f, sum->s2length); write_int(f, sum->remainder); } @@ -135,7 +134,7 @@ void write_sum_head(int f, struct sum_struct *sum) * This might be made one of several selectable heuristics. */ -static void sum_sizes_sqroot_baarda(struct sum_struct *sum, uint64 len) +static void sum_sizes_sqroot(struct sum_struct *sum, uint64 len) { extern int block_size; int blength, s2length, b; @@ -162,7 +161,7 @@ static void sum_sizes_sqroot_baarda(struct sum_struct *sum, uint64 len) blength = MAX(blength, BLOCK_SIZE); } - if (remote_version < 27) { + if (protocol_version < 27) { s2length = csum_length; } else if (csum_length == SUM_LENGTH) { s2length = SUM_LENGTH; @@ -233,7 +232,7 @@ static void generate_and_send_sums(struct map_struct *buf, OFF_T len, int f_out) struct sum_struct sum; OFF_T offset = 0; - sum_sizes_sqroot_baarda(&sum, len); + sum_sizes_sqroot(&sum, len); write_sum_head(f_out, &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; @@ -314,9 +312,9 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out) if (dry_run) return; /* XXXX -- might cause inaccuracies?? -- mbp */ if (statret == 0 && !S_ISDIR(st.st_mode)) { if (robust_unlink(fname) != 0) { - rprintf(FERROR, RSYNC_NAME - ": recv_generator: unlink \"%s\" to make room for directory: %s\n", - fname,strerror(errno)); + rprintf(FERROR, + "recv_generator: unlink %s to make room for directory: %s\n", + full_fname(fname), strerror(errno)); return; } statret = -1; @@ -325,8 +323,8 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out) if (!(relative_paths && errno==ENOENT && create_directory_path(fname, orig_umask)==0 && do_mkdir(fname,file->mode)==0)) { - rprintf(FERROR, RSYNC_NAME ": recv_generator: mkdir \"%s\": %s (2)\n", - fname,strerror(errno)); + rprintf(FERROR, "recv_generator: mkdir %s failed: %s\n", + full_fname(fname), strerror(errno)); } } /* f_out is set to -1 when doing final directory @@ -344,8 +342,8 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out) if (safe_symlinks && unsafe_symlink(file->link, fname)) { if (verbose) { - rprintf(FINFO,"ignoring unsafe symlink \"%s\" -> \"%s\"\n", - fname,file->link); + rprintf(FINFO, "ignoring unsafe symlink %s -> \"%s\"\n", + full_fname(fname), file->link); } return; } @@ -367,8 +365,8 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out) delete_file(fname); } if (do_symlink(file->link,fname) != 0) { - rprintf(FERROR,RSYNC_NAME": symlink \"%s\" -> \"%s\": %s\n", - fname,file->link,strerror(errno)); + rprintf(FERROR, "symlink %s -> \"%s\" failed: %s\n", + full_fname(fname), file->link, strerror(errno)); } else { set_perms(fname,file,NULL,0); if (verbose) { @@ -389,7 +387,8 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out) rprintf(FINFO,"mknod(%s,0%o,0x%x)\n", fname,(int)file->mode,(int)file->rdev); if (do_mknod(fname,file->mode,file->rdev) != 0) { - rprintf(FERROR,"mknod %s : %s\n",fname,strerror(errno)); + rprintf(FERROR, "mknod %s failed: %s\n", + full_fname(fname), strerror(errno)); } else { set_perms(fname,file,NULL,0); if (verbose) @@ -403,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; } @@ -427,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; } @@ -444,11 +445,10 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out) if (errno == ENOENT) { write_int(f_out,i); if (!dry_run) write_sum_head(f_out, NULL); - } else { - if (verbose > 1) - rprintf(FERROR, RSYNC_NAME - ": recv_generator failed to open \"%s\": %s\n", - fname, strerror(errno)); + } else if (verbose > 1) { + rprintf(FERROR, + "recv_generator: failed to open %s: %s\n", + full_fname(fname), strerror(errno)); } return; } @@ -497,18 +497,18 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out) fd = do_open(fnamecmp, O_RDONLY, 0); if (fd == -1) { - rprintf(FERROR,RSYNC_NAME": failed to open \"%s\", continuing : %s\n",fnamecmp,strerror(errno)); + rprintf(FERROR, "failed to open %s, continuing: %s\n", + full_fname(fnamecmp), strerror(errno)); /* pretend the file didn't exist */ write_int(f_out,i); write_sum_head(f_out, NULL); 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); @@ -517,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); } @@ -529,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", @@ -560,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; } @@ -576,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++;