From: Wayne Davison Date: Sat, 27 Aug 2011 18:56:57 +0000 (-0700) Subject: Fix sending of "." attributes for implied-dot-dir. X-Git-Tag: v3.1.0pre1~90 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=865efe94563f2866b104c76c58cc38d553b15a54;p=thirdparty%2Frsync.git Fix sending of "." attributes for implied-dot-dir. --- diff --git a/flist.c b/flist.c index 7a6ab342..8bade1c5 100644 --- a/flist.c +++ b/flist.c @@ -2190,12 +2190,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) { @@ -2233,11 +2229,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);