X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/a015788d2199115585634f93142a401ae03310df..6cc119828892f4c28fc55274e11055f8c420515c:/receiver.c diff --git a/receiver.c b/receiver.c index abe1f663..d348cf87 100644 --- a/receiver.c +++ b/receiver.c @@ -45,6 +45,7 @@ extern int remove_sent_files; extern int module_id; extern int ignore_errors; extern int orig_umask; +extern int append_mode; extern int keep_partial; extern int checksum_seed; extern int inplace; @@ -212,6 +213,28 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, sum_init(checksum_seed); + if (append_mode) { + OFF_T j; + sum.flength = (OFF_T)sum.count * sum.blength; + if (sum.remainder) + sum.flength -= sum.blength - sum.remainder; + for (j = CHUNK_SIZE; j < sum.flength; j += CHUNK_SIZE) { + sum_update(map_ptr(mapbuf, offset, CHUNK_SIZE), + CHUNK_SIZE); + offset = j; + } + if (offset < sum.flength) { + int32 len = sum.flength - offset; + sum_update(map_ptr(mapbuf, offset, len), len); + offset = sum.flength; + } + if (fd != -1 && do_lseek(fd, offset, SEEK_SET) != offset) { + rsyserr(FERROR, errno, "lseek failed on %s", + full_fname(fname)); + exit_cleanup(RERR_FILEIO); + } + } + while ((i = recv_token(f_in, &data)) != 0) { if (do_progress) show_progress(offset, total_size); @@ -417,6 +440,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name) send_msg(MSG_DONE, "", 0); if (keep_partial && !partial_dir) make_backups = 0; /* prevents double backup */ + append_mode = 0; continue; }