diff options
author | Wayne Davison <wayned@samba.org> | 2011-08-27 11:56:57 -0700 |
---|---|---|
committer | Wayne Davison <wayned@samba.org> | 2011-08-27 12:08:19 -0700 |
commit | e7dd0e5004d6760bbd96991d2833e9f5cb64e7bd (patch) | |
tree | 8c679188814dca4eb778f9801947c95dccd42dec | |
parent | 5822f988f54140c09909d406247593b48fb5ea09 (diff) | |
download | rsync-e7dd0e5004d6760bbd96991d2833e9f5cb64e7bd.tar.gz |
Fix sending of "." attributes for implied-dot-dir.
-rw-r--r-- | flist.c | 21 |
1 files changed, 13 insertions, 8 deletions
@@ -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); |