X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/1ed91a04fe62c11d339866fc8e4afde88af80fbe..bec617b934dc2ef90b7acd1c7ef4b5db74821e91:/receiver.c diff --git a/receiver.c b/receiver.c index 53537c38..d348cf87 100644 --- a/receiver.c +++ b/receiver.c @@ -21,7 +21,7 @@ #include "rsync.h" extern int verbose; -extern int dry_run; +extern int do_xfers; extern int am_daemon; extern int am_server; extern int do_progress; @@ -30,6 +30,7 @@ extern int log_format_has_i; extern int daemon_log_format_has_i; extern int csum_length; extern int read_batch; +extern int write_batch; extern int batch_gen_fd; extern int protocol_version; extern int relative_paths; @@ -44,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; @@ -211,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); @@ -416,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; } @@ -452,13 +477,19 @@ int recv_files(int f_in, struct file_list *flist, char *local_name) exit_cleanup(RERR_PROTOCOL); } - if (dry_run) { /* log the transfer */ + if (!do_xfers) { /* log the transfer */ if (!am_server && log_format) log_item(file, &stats, iflags, NULL); if (read_batch) discard_receive_data(f_in, file->length); continue; } + if (write_batch < 0) { + log_item(file, &stats, iflags, NULL); + if (!am_server) + discard_receive_data(f_in, file->length); + continue; + } if (read_batch) { next_gen_i = get_next_gen_i(batch_gen_fd, next_gen_i, i);