X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/0e36d9da420af7c7e49bfd5e2c5aad712a85b633..80707c983c5a12f3c3f95ba3d26dd1aac866135a:/generator.c diff --git a/generator.c b/generator.c index 21ab0eb2..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) { @@ -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++;