summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2011-08-27 11:56:57 -0700
committerWayne Davison <wayned@samba.org>2011-08-27 12:08:19 -0700
commite7dd0e5004d6760bbd96991d2833e9f5cb64e7bd (patch)
tree8c679188814dca4eb778f9801947c95dccd42dec
parent5822f988f54140c09909d406247593b48fb5ea09 (diff)
downloadrsync-e7dd0e5004d6760bbd96991d2833e9f5cb64e7bd.tar.gz
Fix sending of "." attributes for implied-dot-dir.
-rw-r--r--flist.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/flist.c b/flist.c
index 9e5bdd00..cbd837cb 100644
--- a/flist.c
+++ b/flist.c
@@ -2102,12 +2102,8 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
fn = fbuf;
/* A leading ./ can be used in relative mode to affect
* the dest dir without its name being in the path. */
- if (*fn == '.' && fn[1] == '/' && !implied_dot_dir) {
- send_file_name(f, flist, ".", NULL,
- (flags | FLAG_IMPLIED_DIR) & ~FLAG_CONTENT_DIR,
- ALL_FILTERS);
- implied_dot_dir = 1;
- }
+ if (*fn == '.' && fn[1] == '/' && fn[2] && !implied_dot_dir)
+ implied_dot_dir = -1;
len = clean_fname(fn, CFN_KEEP_TRAILING_SLASH
| CFN_DROP_TRAILING_DOT_DIR);
if (len == 1) {
@@ -2145,11 +2141,20 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
dirlen = dir ? strlen(dir) : 0;
if (dirlen != lastdir_len || memcmp(lastdir, dir, dirlen) != 0) {
if (!change_pathname(NULL, dir, -dirlen))
- continue;
+ goto bad_path;
lastdir = pathname;
lastdir_len = pathname_len;
- } else if (!change_pathname(NULL, lastdir, lastdir_len))
+ } else if (!change_pathname(NULL, lastdir, lastdir_len)) {
+ bad_path:
+ if (implied_dot_dir < 0)
+ implied_dot_dir = 0;
continue;
+ }
+
+ if (implied_dot_dir < 0) {
+ send_file_name(f, flist, ".", NULL, (flags | FLAG_IMPLIED_DIR) & ~FLAG_CONTENT_DIR, ALL_FILTERS);
+ implied_dot_dir = 1;
+ }
if (fn != fbuf)
memmove(fbuf, fn, len + 1);