X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/ee297522170840710abacbde52fd1ad97d6ba1d4..b98f040ef25bc692ad3864244eed620611f79048:/receiver.c diff --git a/receiver.c b/receiver.c index b4a32d5c..bb3097a7 100644 --- a/receiver.c +++ b/receiver.c @@ -40,6 +40,7 @@ extern int io_error; extern char *tmpdir; extern char *partial_dir; extern char *basis_dir[]; +extern int basis_dir_cnt; extern int make_backups; extern int do_progress; extern char *backup_dir; @@ -56,29 +57,6 @@ extern int inplace; extern struct exclude_list_struct server_exclude_list; -static void delete_one(char *fn, int is_dir) -{ - if (!is_dir) { - if (robust_unlink(fn) != 0) { - rsyserr(FERROR, errno, "delete_one: unlink %s failed", - full_fname(fn)); - } else if (verbose) - rprintf(FINFO, "deleting %s\n", safe_fname(fn)); - } else { - if (do_rmdir(fn) != 0) { - if (errno != ENOTEMPTY && errno != EEXIST) { - rsyserr(FERROR, errno, - "delete_one: rmdir %s failed", - full_fname(fn)); - } - } else if (verbose) { - rprintf(FINFO, "deleting directory %s\n", - safe_fname(fn)); - } - } -} - - static int is_backup_file(char *fn) { int k = strlen(fn) - backup_suffix_len; @@ -104,7 +82,7 @@ void delete_files(struct file_list *flist) } for (j = 0; j < flist->count; j++) { - if (!(flist->files[j]->flags & FLAG_TOP_DIR) + if (!(flist->files[j]->flags & FLAG_DEL_START) || !S_ISDIR(flist->files[j]->mode)) continue; @@ -131,8 +109,10 @@ void delete_files(struct file_list *flist) rprintf(FINFO, "deleting %s\n", safe_fname(f)); } - } else - delete_one(f, S_ISDIR(mode) != 0); + } else { + delete_file(f, S_ISDIR(mode) + ? DEL_DIR | DEL_RECURSE : 0); + } deletion_count++; } } @@ -209,18 +189,18 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, static char file_sum2[MD4_SUM_LENGTH]; struct map_struct *mapbuf; struct sum_struct sum; - unsigned int len; + int32 len; OFF_T offset = 0; OFF_T offset2; char *data; - int i; + int32 i; char *map = NULL; read_sum_head(f_in, &sum); if (fd_r >= 0 && size_r > 0) { - OFF_T map_size = MAX(sum.blength * 2, 16*1024); - mapbuf = map_file(fd_r, size_r, map_size, sum.blength); + int32 read_size = MAX(sum.blength * 2, 16*1024); + mapbuf = map_file(fd_r, size_r, read_size, sum.blength); if (verbose > 2) { rprintf(FINFO, "recv mapped %s of size %.0f\n", safe_fname(fname_r), (double)size_r); @@ -243,7 +223,7 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, stats.literal_data += i; cleanup_got_literal = 1; - sum_update(data,i); + sum_update(data, i); if (fd != -1 && write_file(fd,data,i) != i) goto report_write_error; @@ -252,22 +232,24 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, } i = -(i+1); - offset2 = i*(OFF_T)sum.blength; + offset2 = i * (OFF_T)sum.blength; len = sum.blength; if (i == (int)sum.count-1 && sum.remainder != 0) len = sum.remainder; stats.matched_data += len; - if (verbose > 3) - rprintf(FINFO,"chunk[%d] of size %d at %.0f offset=%.0f\n", - i,len,(double)offset2,(double)offset); + if (verbose > 3) { + rprintf(FINFO, + "chunk[%d] of size %ld at %.0f offset=%.0f\n", + i, (long)len, (double)offset2, (double)offset); + } if (mapbuf) { map = map_ptr(mapbuf,offset2,len); see_token(map, len); - sum_update(map,len); + sum_update(map, len); } if (inplace) { @@ -289,7 +271,8 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, offset += len; } - flush_write_file(fd); + if (flush_write_file(fd) < 0) + goto report_write_error; #ifdef HAVE_FTRUNCATE if (inplace && fd != -1) @@ -378,7 +361,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, if (verbose > 2) rprintf(FINFO, "recv_files phase=%d\n", phase); send_msg(MSG_DONE, "", 0); - if (keep_partial) + if (keep_partial && !partial_dir) make_backups = 0; /* prevents double backup */ continue; } @@ -450,8 +433,13 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, case FNAMECMP_BACKUP: fnamecmp = get_backup_name(fname); break; - case FNAMECMP_BASIS_DIR: default: + if (j >= basis_dir_cnt) { + rprintf(FERROR, + "invalid basis_dir index: %d.\n", + j); + exit_cleanup(RERR_PROTOCOL); + } pathjoin(fnamecmpbuf, sizeof fnamecmpbuf, basis_dir[j], fname); fnamecmp = fnamecmpbuf; @@ -563,21 +551,21 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, exit_cleanup(RERR_FILEIO); } - if (recv_ok || inplace) - finish_transfer(fname, fnametmp, file, recv_ok); - else if (keep_partial && partialptr - && handle_partial_dir(partialptr, PDIR_CREATE)) - finish_transfer(partialptr, fnametmp, file, 0); - else { + if (recv_ok || inplace) { + finish_transfer(fname, fnametmp, file, recv_ok, 1); + if (partialptr != fname && fnamecmp == partialptr) { + do_unlink(partialptr); + handle_partial_dir(partialptr, PDIR_DELETE); + } + } else if (keep_partial && partialptr + && handle_partial_dir(partialptr, PDIR_CREATE)) { + finish_transfer(partialptr, fnametmp, file, recv_ok, + !partial_dir); + } else { partialptr = NULL; do_unlink(fnametmp); } - if (partialptr != fname && fnamecmp == partialptr && recv_ok) { - do_unlink(partialptr); - handle_partial_dir(partialptr, PDIR_DELETE); - } - cleanup_disable(); if (!recv_ok) {