} else
write_byte(f, flags);
} else {
- if (!(flags & 0xFF) && !S_ISDIR(mode))
- flags |= XMIT_TOP_DIR;
if (!(flags & 0xFF))
- flags |= XMIT_LONG_NAME;
+ flags |= S_ISDIR(mode) ? XMIT_LONG_NAME : XMIT_TOP_DIR;
write_byte(f, flags);
}
if (flags & XMIT_SAME_NAME)
}
#endif
- if (always_checksum) {
+ if (always_checksum && (S_ISREG(mode) || protocol_version < 28)) {
char *sum;
+ int slen = protocol_version < 21 ? 2 : MD4_SUM_LENGTH;
if (S_ISREG(mode))
sum = file->u.sum;
- else if (protocol_version < 28) {
+ else {
/* Prior to 28, we sent a useless set of nulls. */
sum = empty_sum;
- } else
- sum = NULL;
- if (sum) {
- write_buf(f, sum,
- protocol_version < 21 ? 2 : MD4_SUM_LENGTH);
}
+ write_buf(f, sum, slen);
}
strlcpy(lastname, fname, MAXPATHLEN);
if (basename_len == 1+1 && *basename == '.') /* +1 for '\0' */
file->dir.depth--;
if (flags & XMIT_TOP_DIR) {
- in_del_hier = 1;
+ in_del_hier = recurse;
del_hier_name_len = file->dir.depth == 0 ? 0 : l1 + l2;
if (relative_paths && del_hier_name_len > 2
&& basename_len == 1+1 && *basename == '.')
}
#endif
- if (always_checksum) {
+ if (always_checksum && (sum_len || protocol_version < 28)) {
char *sum;
+ int slen = protocol_version < 21 ? 2 : MD4_SUM_LENGTH;
if (sum_len) {
file->u.sum = sum = bp;
/*bp += sum_len;*/
- } else if (protocol_version < 28) {
+ } else {
/* Prior to 28, we get a useless set of nulls. */
sum = empty_sum;
- } else
- sum = NULL;
- if (sum) {
- read_buf(f, sum,
- protocol_version < 21 ? 2 : MD4_SUM_LENGTH);
}
+ read_buf(f, sum, slen);
}
if (!preserve_perms) {
}
while (1) {
- struct file_struct *file;
char fname2[MAXPATHLEN];
char *fname = fname2;
int is_dot_dir;
dir = fname;
fname = p + 1;
}
- } else if (implied_dirs && (p=strrchr(fname,'/')) && p != fname) {
+ } else if ((p = strstr(fname, "/./")) != NULL) {
+ *p = '\0';
+ if (p == fname)
+ dir = "/";
+ else
+ dir = fname;
+ fname = p + 3;
+ }
+
+ if (!*fname)
+ fname = ".";
+
+ if (dir && *dir) {
+ static char *lastdir;
+ static int lastdir_len;
+
+ strlcpy(olddir, curr_dir, sizeof olddir);
+
+ if (!push_dir(dir)) {
+ io_error |= IOERR_GENERAL;
+ rsyserr(FERROR, errno, "push_dir %s failed",
+ full_fname(dir));
+ continue;
+ }
+
+ if (lastdir && strcmp(lastdir, dir) == 0) {
+ flist_dir = lastdir;
+ flist_dir_len = lastdir_len;
+ } else {
+ flist_dir = lastdir = strdup(dir);
+ flist_dir_len = lastdir_len = strlen(dir);
+ }
+ }
+
+ if (implied_dirs && (p=strrchr(fname,'/')) && p != fname) {
/* Send the implied directories at the start of the
* source spec, so we get their permissions right. */
char *lp = lastpath, *fn = fname, *slash = fname;
}
}
- if (!*fname)
- fname = ".";
-
- if (dir && *dir) {
- static char *lastdir;
- static int lastdir_len;
-
- strcpy(olddir, curr_dir); /* can't overflow */
-
- if (!push_dir(dir)) {
- io_error |= IOERR_GENERAL;
- rsyserr(FERROR, errno, "push_dir %s failed",
- full_fname(dir));
- continue;
- }
-
- if (lastdir && strcmp(lastdir, dir) == 0) {
- flist_dir = lastdir;
- flist_dir_len = lastdir_len;
- } else {
- flist_dir = lastdir = strdup(dir);
- flist_dir_len = lastdir_len = strlen(dir);
- }
- }
-
if (one_file_system)
filesystem_dev = st.st_dev;
- if ((file = send_file_name(f, flist, fname, XMIT_TOP_DIR))) {
- if (recurse || (xfer_dirs && is_dot_dir))
+ if (recurse || (xfer_dirs && is_dot_dir)) {
+ struct file_struct *file;
+ if ((file = send_file_name(f, flist, fname, XMIT_TOP_DIR)))
send_if_directory(f, flist, file);
- }
+ } else
+ send_file_name(f, flist, fname, 0);
if (olddir[0]) {
flist_dir = NULL;
flist_dir_len = 0;
if (!pop_dir(olddir)) {
rsyserr(FERROR, errno, "pop_dir %s failed",
- full_fname(dir));
+ full_fname(olddir));
exit_cleanup(RERR_FILESELECT);
}
}