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.0.9pre2~5 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e7dd0e5004d6760bbd96991d2833e9f5cb64e7bd;p=thirdparty%2Frsync.git Fix sending of "." attributes for implied-dot-dir. --- 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);