X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/ecc81fce17f2e32fbe33c0050693899ce4d6c3cf..c52461f91136b5e073f150da3f3790699f438e57:/receiver.c diff --git a/receiver.c b/receiver.c index 97b12049..35f964e9 100644 --- a/receiver.c +++ b/receiver.c @@ -247,11 +247,8 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, sum_update(data,i); - if (fd != -1 && write_file(fd,data,i) != i) { - rsyserr(FERROR, errno, "write failed on %s", - full_fname(fname)); - exit_cleanup(RERR_FILEIO); - } + if (fd != -1 && write_file(fd,data,i) != i) + goto report_write_error; offset += i; continue; } @@ -275,29 +272,29 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, sum_update(map,len); } - if (!inplace || offset != offset2) { - if (fd != -1 && write_file(fd, map, len) != (int)len) { - rsyserr(FERROR, errno, "write failed on %s", - full_fname(fname)); - exit_cleanup(RERR_FILEIO); - } - } else { - flush_write_file(fd); - if (do_lseek(fd,(OFF_T)len,SEEK_CUR) != offset+len) { - rprintf(FERROR, "lseek failed on %s: %s, %lli, %lli, %i\n", - full_fname(fname), strerror(errno), - do_lseek(fd, 0, SEEK_CUR), - offset + len, i); - exit_cleanup(RERR_FILEIO); + if (inplace) { + if (offset == offset2 && fd != -1) { + if (flush_write_file(fd) < 0) + goto report_write_error; + offset += len; + if (do_lseek(fd, len, SEEK_CUR) != offset) { + rsyserr(FERROR, errno, + "lseek failed on %s", + full_fname(fname)); + exit_cleanup(RERR_FILEIO); + } + continue; } } + if (fd != -1 && write_file(fd, map, len) != (int)len) + goto report_write_error; offset += len; } flush_write_file(fd); #ifdef HAVE_FTRUNCATE - if (inplace) + if (inplace && fd != -1) ftruncate(fd, offset); #endif @@ -305,6 +302,7 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, end_progress(total_size); if (fd != -1 && offset > 0 && sparse_end(fd) != 0) { + report_write_error: rsyserr(FERROR, errno, "write failed on %s", full_fname(fname)); exit_cleanup(RERR_FILEIO);