X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/16edf86595a5a990a942fa045dfb523dae1fe6cb..8e41b68e8f975c02a5d9281be780ba5d1a385107:/receiver.c diff --git a/receiver.c b/receiver.c index 21528a7c..98666487 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 2 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 @@ -15,8 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + * with this program; if not, visit the http://fsf.org website. */ #include "rsync.h" @@ -54,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; @@ -321,9 +321,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; @@ -357,10 +357,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; @@ -378,8 +378,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; } @@ -389,11 +389,14 @@ int recv_files(int f_in, char *local_name) rprintf(FINFO, "recv_files phase=%d\n", phase); if (phase == 2 && delay_updates) handle_delayed_updates(local_name); - send_msg(MSG_DONE, "", 0); + send_msg(MSG_DONE, "", 0, 0); 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) @@ -470,6 +473,8 @@ int recv_files(int f_in, char *local_name) "(Skipping batched update for \"%s\")\n", fname); discard_receive_data(f_in, F_LENGTH(file)); + if (inc_recurse) + send_msg_int(MSG_NO_SEND, ndx); continue; } next_gen_ndx = -1; @@ -553,6 +558,8 @@ int recv_files(int f_in, char *local_name) full_fname(fnamecmp)); discard_receive_data(f_in, F_LENGTH(file)); close(fd1); + if (inc_recurse) + send_msg_int(MSG_NO_SEND, ndx); continue; } @@ -566,6 +573,8 @@ int recv_files(int f_in, char *local_name) full_fname(fnamecmp)); discard_receive_data(f_in, F_LENGTH(file)); close(fd1); + if (inc_recurse) + send_msg_int(MSG_NO_SEND, ndx); continue; } @@ -599,6 +608,8 @@ int recv_files(int f_in, char *local_name) discard_receive_data(f_in, F_LENGTH(file)); if (fd1 != -1) close(fd1); + if (inc_recurse) + send_msg_int(MSG_NO_SEND, ndx); continue; } } else { @@ -606,6 +617,8 @@ int recv_files(int f_in, char *local_name) discard_receive_data(f_in, F_LENGTH(file)); if (fd1 != -1) close(fd1); + if (inc_recurse) + send_msg_int(MSG_NO_SEND, ndx); continue; } @@ -632,6 +645,8 @@ int recv_files(int f_in, char *local_name) discard_receive_data(f_in, F_LENGTH(file)); if (fd1 != -1) close(fd1); + if (inc_recurse) + send_msg_int(MSG_NO_SEND, ndx); continue; }