From 25c2a6ac0e1f45a0c4fcc425ddaa5e9027a868ac Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Sun, 18 Mar 2007 17:35:39 +0000 Subject: [PATCH] Fixed a multi-file, no-dir, relative copy, such as: rsync -av lib/*.c /var/tmp/lib --- flist.c | 39 ++++++++++++++++++++------------------- testsuite/chown.test | 4 +++- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/flist.c b/flist.c index abbc6da0..bd0ad00e 100644 --- a/flist.c +++ b/flist.c @@ -1336,7 +1336,7 @@ void send_extra_file_list(int f, int at_least) int64 start_write; int future_cnt, save_io_error = io_error; - if (send_dir_ndx < 0) + if (flist_eof) return; /* Keep sending data until we have the requested number of @@ -1491,18 +1491,6 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) && (len == 1 || fbuf[len-2] == '/'); } - if (link_stat(fbuf, &st, copy_dirlinks) != 0) { - io_error |= IOERR_GENERAL; - rsyserr(FERROR, errno, "link_stat %s failed", - full_fname(fbuf)); - continue; - } - - if (S_ISDIR(st.st_mode) && !xfer_dirs) { - rprintf(FINFO, "skipping directory %s\n", fbuf); - continue; - } - dir = NULL; if (!relative_paths) { @@ -1589,6 +1577,18 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) if (fn != fbuf) memmove(fbuf, fn, len + 1); + if (link_stat(fbuf, &st, copy_dirlinks) != 0) { + io_error |= IOERR_GENERAL; + rsyserr(FERROR, errno, "link_stat %s failed", + full_fname(fbuf)); + continue; + } + + if (S_ISDIR(st.st_mode) && !xfer_dirs) { + rprintf(FINFO, "skipping directory %s\n", fbuf); + continue; + } + if (implied_dirs && (p=strrchr(fbuf,'/')) && p != fbuf) { /* Send the implied directories at the start of the * source spec, so we get their permissions right. */ @@ -1689,14 +1689,15 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) if (inc_recurse) { add_dirs_to_tree(-1, 0, dir_flist->count - 1); - if (file_total == 1) { + if (send_dir_ndx < 0) { + write_ndx(f, NDX_FLIST_EOF); + flist_eof = 1; + } + else if (file_total == 1) { /* If we're creating incremental file-lists and there * was just 1 item in the first file-list, send 1 more * file-list to check if this is a 1-file xfer. */ - if (send_dir_ndx < 0) - write_ndx(f, NDX_DONE); - else - send_extra_file_list(f, 1); + send_extra_file_list(f, 1); } } @@ -1805,7 +1806,7 @@ void recv_additional_file_list(int f) { struct file_list *flist; int ndx = read_ndx(f); - if (ndx == NDX_DONE) { + if (ndx == NDX_FLIST_EOF) { flist_eof = 1; change_local_filter_dir(NULL, 0, 0); } else { diff --git a/testsuite/chown.test b/testsuite/chown.test index 1be7d9e2..db693a13 100644 --- a/testsuite/chown.test +++ b/testsuite/chown.test @@ -36,7 +36,9 @@ chown 5001 "$name2" || test_skipped "Can't chown (probably need root)" chgrp 5002 "$name1" || test_skipped "Can't chgrp (probably need root)" chgrp 5003 "$name2" || test_skipped "Can't chgrp (probably need root)" -checkit "$RSYNC -aHvv \"$fromdir/\" \"$todir/\"" "$fromdir" "$todir" +# This makes sure that multi-file, non-dir, relative transfers work. +cd "$fromdir/.." +checkit "$RSYNC -aHvv from/* to/" "$fromdir" "$todir" # The script would have aborted on error, so getting here means we've won. exit 0 -- 2.34.1