extern int cvs_exclude;
extern int recurse;
-extern int keep_dirs;
+extern int xfer_dirs;
extern char curr_dir[MAXPATHLEN];
extern int filesfrom_fd;
static int show_filelist_p(void)
{
- return verbose && keep_dirs && !am_server;
+ return verbose && xfer_dirs && !am_server;
}
static void start_filelist_progress(char *kind)
if (exclude_level == NO_EXCLUDES)
goto skip_excludes;
- if (S_ISDIR(st.st_mode) && !keep_dirs) {
+ if (S_ISDIR(st.st_mode) && !xfer_dirs) {
rprintf(FINFO, "skipping directory %s\n", thisname);
return NULL;
}
}
+/* Note that the "recurse" value either contains -1, for infinite recursion,
+ * or a number >= 0 indicating how many levels of recursion we will allow. */
static void send_directory(int f, struct file_list *flist, char *dir)
{
DIR *d;
|| (dname[1] == '.' && dname[2] == '\0')))
continue;
if (strlcpy(p, dname, MAXPATHLEN - offset) < MAXPATHLEN - offset) {
- send_file_name(f, flist, fname, recurse, 0);
+ int do_subdirs = recurse >= 1 ? recurse-- : recurse;
+ send_file_name(f, flist, fname, do_subdirs, 0);
} else {
io_error |= IOERR_GENERAL;
rprintf(FINFO,
start_write = stats.total_written;
flist = flist_new(f == -1 ? WITHOUT_HLINK : WITH_HLINK,
- "send_file_list");
+ "send_file_list");
if (f != -1) {
io_start_buffering_out();
while (1) {
char fname2[MAXPATHLEN];
char *fname = fname2;
+ int do_subdirs;
if (use_ff_fd) {
if (read_filesfrom_line(filesfrom_fd, fname) == 0)
}
l = strlen(fname);
- if (fname[l - 1] == '/') {
+ if (!l || fname[l - 1] == '/') {
if (l == 2 && fname[0] == '.') {
/* Turn "./" into just "." rather than "./." */
fname[1] = '\0';
fname[l] = '\0';
}
}
+ if (fname[l-1] == '.' && (l == 1 || fname[l-2] == '/')) {
+ if (!recurse && xfer_dirs)
+ recurse = 1; /* allow one level */
+ } else if (recurse > 0)
+ recurse = 0;
if (link_stat(fname, &st, keep_dirlinks) != 0) {
if (f != -1) {
continue;
}
- if (S_ISDIR(st.st_mode) && !keep_dirs) {
+ if (S_ISDIR(st.st_mode) && !xfer_dirs) {
rprintf(FINFO, "skipping directory %s\n", fname);
continue;
}
*p = '/';
if (fn != p || (*lp && *lp != '/')) {
int save_copy_links = copy_links;
- int save_keep_dirs = keep_dirs;
+ int save_xfer_dirs = xfer_dirs;
copy_links = copy_unsafe_links;
- keep_dirs = 1;
+ xfer_dirs = 1;
while ((slash = strchr(slash+1, '/')) != 0) {
*slash = 0;
send_file_name(f, flist, fname, 0, 0);
*slash = '/';
}
copy_links = save_copy_links;
- keep_dirs = save_keep_dirs;
+ xfer_dirs = save_xfer_dirs;
*p = 0;
strlcpy(lastpath, fname, sizeof lastpath);
*p = '/';
if (one_file_system)
set_filesystem(fname);
- send_file_name(f, flist, fname, recurse, XMIT_DEL_START);
+ do_subdirs = recurse >= 1 ? recurse-- : recurse;
+ send_file_name(f, flist, fname, do_subdirs, XMIT_DEL_START);
if (olddir[0]) {
flist_dir = NULL;