X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/4fd842f98df4970f6e49a0365dbed60774e56c09..fac9e234ae53490fb945786b9edf0e56d5a6d09f:/sender.c diff --git a/sender.c b/sender.c index 13ae8e4d..75b5a2f3 100644 --- a/sender.c +++ b/sender.c @@ -3,11 +3,12 @@ * * Copyright (C) 1996 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras - * Copyright (C) 2003-2007 Wayne Davison + * Copyright (C) 2003-2008 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 @@ -43,7 +44,7 @@ extern int inplace; extern int batch_fd; extern int write_batch; extern struct stats stats; -extern struct file_list *cur_flist, *first_flist; +extern struct file_list *cur_flist, *first_flist, *dir_flist; /** * @file @@ -126,15 +127,9 @@ void successful_send(int ndx) if (!remove_source_files) return; - if (!(flist = flist_for_ndx(ndx))) { - rprintf(FERROR, - "INTERNAL ERROR: unable to find flist for item %d\n", - ndx); - return; - } - + flist = flist_for_ndx(ndx, "successful_send"); file = flist->files[ndx - flist->ndx_start]; - if (!push_pathname(F_PATHNAME(file), -1)) + if (!change_pathname(file, NULL, 0)) return; f_name(file, fname); @@ -210,14 +205,17 @@ void send_files(int f_in, int f_out) if (inc_recurse) send_extra_file_list(f_out, FILECNT_LOOKAHEAD); - 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]; if (F_PATHNAME(file)) { path = F_PATHNAME(file); slash = "/"; } else { path = slash = ""; } - if (!push_pathname(F_PATHNAME(file), -1)) + if (!change_pathname(file, NULL, 0)) continue; f_name(file, fname); @@ -225,7 +223,7 @@ void send_files(int f_in, int f_out) rprintf(FINFO, "send_files(%d, %s%s%s)\n", ndx, path,slash,fname); #ifdef SUPPORT_XATTRS - if (preserve_xattrs && iflags & ITEM_REPORT_XATTR) + if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && !dry_run) recv_xattr_request(file, f_in); #endif @@ -261,7 +259,8 @@ void send_files(int f_in, int f_out) updating_basis_file = inplace && (protocol_version >= 29 ? fnamecmp_type == FNAMECMP_FNAME : make_backups <= 0); - stats.current_file_index = ndx; + if (!am_server && do_progress) + set_current_file_index(file, ndx); stats.num_transferred_files++; stats.total_transferred_size += F_LENGTH(file); @@ -276,7 +275,7 @@ void send_files(int f_in, int f_out) if (!(s = receive_sums(f_in))) { io_error |= IOERR_GENERAL; - rprintf(FERROR, "receive_sums failed\n"); + rprintf(FERROR_XFER, "receive_sums failed\n"); exit_cleanup(RERR_PROTOCOL); } @@ -285,13 +284,13 @@ void send_files(int f_in, int f_out) if (errno == ENOENT) { enum logcode c = am_daemon && protocol_version < 28 ? FERROR - : FINFO; + : FWARNING; io_error |= IOERR_VANISHED; rprintf(c, "file has vanished: %s\n", full_fname(fname)); } else { io_error |= IOERR_GENERAL; - rsyserr(FERROR, errno, + rsyserr(FERROR_XFER, errno, "send_files failed to open %s", full_fname(fname)); } @@ -304,7 +303,7 @@ void send_files(int f_in, int f_out) /* map the local file */ if (do_fstat(fd, &st) != 0) { io_error |= IOERR_GENERAL; - rsyserr(FERROR, errno, "fstat failed"); + rsyserr(FERROR_XFER, errno, "fstat failed"); free_sums(s); close(fd); exit_cleanup(RERR_PROTOCOL); @@ -345,7 +344,7 @@ void send_files(int f_in, int f_out) j = unmap_file(mbuf); if (j) { io_error |= IOERR_GENERAL; - rsyserr(FERROR, j, + rsyserr(FERROR_XFER, j, "read errors mapping %s", full_fname(fname)); }