interpret_stat_error(fbuf, True);
return;
}
+ if (errno == ENOTDIR && (flags & FLAG_PERHAPS_DIR))
+ return;
io_error |= IOERR_GENERAL;
rsyserr(FERROR_XFER, errno, "opendir %s failed", full_fname(fbuf));
return;
int save_xfer_dirs = xfer_dirs;
int save_prune_empty_dirs = prune_empty_dirs;
int senddir_fd = flags & GDL_IGNORE_FILTER_RULES ? -2 : -1;
+ int senddir_flags = FLAG_CONTENT_DIR;
if (dlen < 0) {
dlen = strlcpy(dirbuf, dirname, MAXPATHLEN);
dirlist = flist_new(FLIST_TEMP, "get_dirlist");
+ if (flags & GDL_PERHAPS_DIR)
+ senddir_flags |= FLAG_PERHAPS_DIR;
+
recurse = 0;
xfer_dirs = 1;
- send_directory(senddir_fd, dirlist, dirname, dlen, FLAG_CONTENT_DIR);
+ send_directory(senddir_fd, dirlist, dirname, dlen, senddir_flags);
xfer_dirs = save_xfer_dirs;
recurse = save_recurse;
if (INFO_GTE(PROGRESS, 1))
for (i = 0; i < fuzzy_basis; i++) {
if (i && pathjoin(fnamecmpbuf, MAXPATHLEN, basis_dir[i-1], dn) >= MAXPATHLEN)
continue;
- fuzzy_dirlist[i] = get_dirlist(fnamecmpbuf, -1, GDL_IGNORE_FILTER_RULES);
+ fuzzy_dirlist[i] = get_dirlist(fnamecmpbuf, -1, GDL_IGNORE_FILTER_RULES | GDL_PERHAPS_DIR);
if (fuzzy_dirlist[i] && fuzzy_dirlist[i]->used == 0) {
flist_free(fuzzy_dirlist[i]);
fuzzy_dirlist[i] = NULL;
/* These flags are passed to functions but not stored. */
#define FLAG_DIVERT_DIRS (1<<16) /* sender, but must be unique */
+#define FLAG_PERHAPS_DIR (1<<17) /* generator */
/* These flags are for get_dirlist(). */
#define GDL_IGNORE_FILTER_RULES (1<<0)
+#define GDL_PERHAPS_DIR (1<<1)
/* Some helper macros for matching bits. */
#define BITS_SET(val,bits) (((val) & (bits)) == (bits))