X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/8ab02ccd527f5036935996ab31faffdbcbad56b0..58cf354711f9e7eb2ec2a54b5f623abb860dafcf:/receiver.c diff --git a/receiver.c b/receiver.c index b342afa0..4325e30f 100644 --- a/receiver.c +++ b/receiver.c @@ -3,7 +3,7 @@ * * Copyright (C) 1996-2000 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras - * Copyright (C) 2003-2008 Wayne Davison + * Copyright (C) 2003-2009 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -285,8 +285,11 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, goto report_write_error; #ifdef HAVE_FTRUNCATE - if (inplace && fd != -1) - ftruncate(fd, offset); + if (inplace && fd != -1 + && ftruncate(fd, offset) < 0) { + rsyserr(FERROR_XFER, errno, "ftruncate failed on %s", + full_fname(fname)); + } #endif if (INFO_GTE(PROGRESS, 1)) @@ -328,7 +331,7 @@ static void handle_delayed_updates(char *local_name) struct file_struct *file = cur_flist->files[ndx]; fname = local_name ? local_name : f_name(file, NULL); if ((partialptr = partial_dir_fname(fname)) != NULL) { - if (make_backups > 0 && !make_backup(fname)) + if (make_backups > 0 && !make_backup(fname, False)) continue; if (DEBUG_GTE(RECV, 1)) { rprintf(FINFO, "renaming %s to %s\n", @@ -381,18 +384,25 @@ static int we_want_redo(int desired_ndx) return 0; } -static int gen_wants_ndx(int desired_ndx) +static int gen_wants_ndx(int desired_ndx, int flist_num) { static int next_ndx = -1; - static BOOL got_eof = 0; + static int done_cnt = 0; + static BOOL got_eof = False; if (got_eof) return 0; while (next_ndx < desired_ndx) { + if (inc_recurse && flist_num <= done_cnt) + return 0; if (next_ndx >= 0) no_batched_update(next_ndx, False); if ((next_ndx = read_int(batch_gen_fd)) < 0) { + if (inc_recurse) { + done_cnt++; + continue; + } got_eof = True; return 0; } @@ -450,13 +460,17 @@ int recv_files(int f_in, char *local_name) end_progress(0); } if (inc_recurse && first_flist) { - if (read_batch) - gen_wants_ndx(first_flist->used + first_flist->ndx_start); + if (read_batch) { + ndx = first_flist->used + first_flist->ndx_start; + gen_wants_ndx(ndx, first_flist->flist_num); + } flist_free(first_flist); if (first_flist) continue; - } else if (read_batch && first_flist) - gen_wants_ndx(first_flist->used); + } else if (read_batch && first_flist) { + ndx = first_flist->used; + gen_wants_ndx(ndx, first_flist->flist_num); + } if (++phase > max_phase) break; if (DEBUG_GTE(RECV, 1)) @@ -487,6 +501,21 @@ int recv_files(int f_in, char *local_name) if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && !dry_run) set_file_attrs(fname, file, NULL, fname, 0); #endif + if (iflags & ITEM_IS_NEW) { + stats.created_files++; + if (S_ISREG(file->mode)) { + /* Nothing further to count. */ + } else if (S_ISDIR(file->mode)) + stats.created_dirs++; +#ifdef SUPPORT_LINKS + else if (S_ISLNK(file->mode)) + stats.created_symlinks++; +#endif + else if (IS_DEVICE(file->mode)) + stats.created_devices++; + else + stats.created_specials++; + } continue; } if (phase == 2) { @@ -516,11 +545,13 @@ int recv_files(int f_in, char *local_name) csum_length = SHORT_SUM_LENGTH; redoing = 0; } + if (iflags & ITEM_IS_NEW) + stats.created_files++; } if (!am_server && INFO_GTE(PROGRESS, 1)) set_current_file_index(file, ndx); - stats.num_transferred_files++; + stats.xferred_files++; stats.total_transferred_size += F_LENGTH(file); cleanup_got_literal = 0; @@ -545,7 +576,10 @@ int recv_files(int f_in, char *local_name) } if (read_batch) { - if (!(redoing ? we_want_redo(ndx) : gen_wants_ndx(ndx))) { + int wanted = redoing + ? we_want_redo(ndx) + : gen_wants_ndx(ndx, cur_flist->flist_num); + if (!wanted) { rprintf(FINFO, "(Skipping batched update for%s \"%s\")\n", redoing ? " resend of" : "",