X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/4fd842f98df4970f6e49a0365dbed60774e56c09..eb7a6e09cba703fdc4687214cb606804061b425f:/receiver.c diff --git a/receiver.c b/receiver.c index efeb2a96..ac19f9c7 100644 --- a/receiver.c +++ b/receiver.c @@ -6,8 +6,9 @@ * Copyright (C) 2003-2007 Wayne Davison * * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 3 as - * published by the Free Software Foundation. + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -53,7 +54,7 @@ extern struct stats stats; extern char *tmpdir; extern char *partial_dir; extern char *basis_dir[]; -extern struct file_list *cur_flist, *first_flist; +extern struct file_list *cur_flist, *first_flist, *dir_flist; extern struct filter_list_struct server_filter_list; static struct bitbag *delayed_bits = NULL; @@ -156,20 +157,22 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, 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) { - if (do_progress) - show_progress(offset, total_size); - sum_update(map_ptr(mapbuf, offset, CHUNK_SIZE), - CHUNK_SIZE); - offset = j; - } - if (offset < sum.flength) { - int32 len = (int32)(sum.flength - offset); - if (do_progress) - show_progress(offset, total_size); - sum_update(map_ptr(mapbuf, offset, len), len); - offset = sum.flength; + if (append_mode == 2) { + for (j = CHUNK_SIZE; j < sum.flength; j += CHUNK_SIZE) { + if (do_progress) + show_progress(offset, total_size); + sum_update(map_ptr(mapbuf, offset, CHUNK_SIZE), + CHUNK_SIZE); + offset = j; + } + if (offset < sum.flength) { + int32 len = (int32)(sum.flength - offset); + if (do_progress) + show_progress(offset, total_size); + sum_update(map_ptr(mapbuf, offset, len), len); + } } + offset = sum.flength; if (fd != -1 && (j = do_lseek(fd, offset, SEEK_SET)) != offset) { rsyserr(FERROR, errno, "lseek of %s returned %.0f, not %.0f", full_fname(fname), (double)j, (double)offset); @@ -320,9 +323,9 @@ static int get_next_gen_ndx(int fd, int next_gen_ndx, int desired_ndx) next_gen_ndx = read_int(fd); if (next_gen_ndx == -1) { if (inc_recurse) - next_gen_ndx = first_flist->prev->count + first_flist->prev->ndx_start; + next_gen_ndx = first_flist->prev->used + first_flist->prev->ndx_start; else - next_gen_ndx = cur_flist->count; + next_gen_ndx = cur_flist->used; } } return next_gen_ndx; @@ -356,10 +359,10 @@ int recv_files(int f_in, char *local_name) int ndx, recv_ok; if (verbose > 2) - rprintf(FINFO, "recv_files(%d) starting\n", cur_flist->count); + rprintf(FINFO, "recv_files(%d) starting\n", cur_flist->used); if (delay_updates) - delayed_bits = bitbag_create(cur_flist->count + 1); + delayed_bits = bitbag_create(cur_flist->used + 1); updating_basis = inplace; @@ -377,8 +380,8 @@ int recv_files(int f_in, char *local_name) } if (read_batch && cur_flist) { int high = inc_recurse - ? first_flist->prev->count + first_flist->prev->ndx_start - : cur_flist->count; + ? first_flist->prev->used + first_flist->prev->ndx_start + : cur_flist->used; get_next_gen_ndx(batch_gen_fd, next_gen_ndx, high); next_gen_ndx = -1; } @@ -392,7 +395,10 @@ int recv_files(int f_in, char *local_name) continue; } - file = cur_flist->files[ndx - cur_flist->ndx_start]; + if (ndx - cur_flist->ndx_start >= 0) + file = cur_flist->files[ndx - cur_flist->ndx_start]; + else + file = dir_flist->files[cur_flist->parent_ndx]; fname = local_name ? local_name : f_name(file, fbuf); if (verbose > 2) @@ -422,8 +428,9 @@ int recv_files(int f_in, char *local_name) if (csum_length == SHORT_SUM_LENGTH) { if (keep_partial && !partial_dir) make_backups = -make_backups; /* prevents double backup */ + if (append_mode) + sparse_files = -sparse_files; append_mode = -append_mode; - sparse_files = -sparse_files; csum_length = SUM_LENGTH; redoing = 1; } @@ -431,8 +438,9 @@ int recv_files(int f_in, char *local_name) if (csum_length != SHORT_SUM_LENGTH) { if (keep_partial && !partial_dir) make_backups = -make_backups; + if (append_mode) + sparse_files = -sparse_files; append_mode = -append_mode; - sparse_files = -sparse_files; csum_length = SHORT_SUM_LENGTH; redoing = 0; }