X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/da9d12f5d93724cb07a4107aa7aff92be9fb2ddb..80707c983c5a12f3c3f95ba3d26dd1aac866135a:/generator.c diff --git a/generator.c b/generator.c index d0177623..7c818743 100644 --- a/generator.c +++ b/generator.c @@ -46,8 +46,7 @@ extern int link_dest; /* choose whether to skip a particular file */ -static int skip_file(char *fname, - struct file_struct *file, STRUCT_STAT *st) +static int skip_file(char *fname, struct file_struct *file, STRUCT_STAT *st) { if (st->st_size != file->length) { return 0; @@ -79,11 +78,8 @@ static int skip_file(char *fname, } } file_checksum(fname,sum,st->st_size); - if (protocol_version < 21) { - return (memcmp(sum,file->sum,2) == 0); - } else { - return (memcmp(sum,file->sum,MD4_SUM_LENGTH) == 0); - } + return memcmp(sum, file->sum, protocol_version < 21? 2 + : MD4_SUM_LENGTH) == 0; } if (size_only) { @@ -99,9 +95,8 @@ static int skip_file(char *fname, /* - * NULL sum_struct means we have no checksums + * NULL sum_struct means we have no checksums */ - void write_sum_head(int f, struct sum_struct *sum) { static struct sum_struct null_sum; @@ -192,8 +187,8 @@ static void sum_sizes_sqroot(struct sum_struct *sum, uint64 len) sum->remainder = (len % blength); if (sum->count && verbose > 2) { - rprintf(FINFO, "count=%ld rem=%u blength=%u s2length=%d flength=%.0f\n", - (long)sum->count, sum->remainder, sum->blength, + rprintf(FINFO, "count=%.0f rem=%u blength=%u s2length=%d flength=%.0f\n", + (double)sum->count, sum->remainder, sum->blength, sum->s2length, (double)sum->flength); } } @@ -237,7 +232,7 @@ static void generate_and_send_sums(struct map_struct *buf, size_t len, int f_out write_sum_head(f_out, &sum); for (i = 0; i < sum.count; i++) { - int n1 = MIN(len, sum.blength); + unsigned int n1 = MIN(len, sum.blength); char *map = map_ptr(buf, offset, n1); uint32 sum1 = get_checksum1(map, n1); char sum2[SUM_LENGTH]; @@ -246,8 +241,9 @@ static void generate_and_send_sums(struct map_struct *buf, size_t len, int f_out if (verbose > 3) { rprintf(FINFO, - "chunk[%ld] offset=%.0f len=%d sum1=%08lx\n", - (long)i,(double)offset,n1,(unsigned long)sum1); + "chunk[%.0f] offset=%.0f len=%u sum1=%08lx\n", + (double)i, (double)offset, n1, + (unsigned long)sum1); } write_int(f_out, sum1); write_buf(f_out, sum2, sum.s2length); @@ -266,13 +262,12 @@ static void generate_and_send_sums(struct map_struct *buf, size_t len, int f_out * @note This comment was added later by mbp who was trying to work it * out. It might be wrong. **/ -void recv_generator(char *fname, struct file_list *flist, int i, int f_out) +void recv_generator(char *fname, struct file_struct *file, int i, int f_out) { int fd; STRUCT_STAT st; struct map_struct *mapbuf; int statret; - struct file_struct *file = flist->files[i]; char *fnamecmp; char fnamecmpbuf[MAXPATHLEN]; extern char *compare_dest; @@ -280,7 +275,8 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out) extern int only_existing; extern int orig_umask; - if (list_only) return; + if (list_only) + return; if (verbose > 2) rprintf(FINFO,"recv_generator(%s,%d)\n",fname,i); @@ -510,8 +506,10 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out) else mapbuf = NULL; - if (verbose > 3) - rprintf(FINFO,"gen mapped %s of size %.0f\n",fnamecmp,(double)st.st_size); + if (verbose > 3) { + rprintf(FINFO,"gen mapped %s of size %.0f\n", fnamecmp, + (double)st.st_size); + } if (verbose > 2) rprintf(FINFO, "generating and sending sums for %d\n", i); @@ -524,7 +522,6 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out) } - void generate_files(int f,struct file_list *flist,char *local_name,int f_recv) { int i; @@ -549,22 +546,23 @@ void generate_files(int f,struct file_list *flist,char *local_name,int f_recv) for (i = 0; i < flist->count; i++) { struct file_struct *file = flist->files[i]; - mode_t saved_mode = file->mode; - if (!file->basename) continue; + struct file_struct copy; + if (!file->basename) + continue; /* we need to ensure that any directories we create have writeable permissions initially so that we can create the files within them. This is then fixed after the files are transferred */ - if (!am_root && S_ISDIR(file->mode)) { - file->mode |= S_IWUSR; /* user write */ + if (!am_root && S_ISDIR(file->mode) && !(file->mode & S_IWUSR)) { + copy = *file; /* XXX: Could this be causing a problem on SCO? Perhaps their * handling of permissions is strange? */ + copy.mode |= S_IWUSR; /* user write */ + file = © } recv_generator(local_name? local_name - : f_name_to(file,fbuf,sizeof fbuf), flist, i, f); - - file->mode = saved_mode; + : f_name_to(file,fbuf,sizeof fbuf), file, i, f); } phase++; @@ -578,10 +576,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)) { + while ((i = read_int(f_recv)) != -1) { struct file_struct *file = flist->files[i]; recv_generator(local_name? local_name - : f_name_to(file,fbuf,sizeof fbuf), flist, i, f); + : f_name_to(file,fbuf,sizeof fbuf), file, i, f); } phase++;