extern int do_progress;
extern int recurse;
extern int relative_paths;
+extern int implied_dirs;
extern int keep_dirlinks;
extern int preserve_links;
extern int preserve_devices;
enum logcode code, int f_out)
{
static int missing_below = -1, excluded_below = -1;
- static char *fuzzy_dirname = "";
+ static char *parent_dirname = "";
static struct file_list *fuzzy_dirlist = NULL;
+ static int need_fuzzy_dirlist = 0;
struct file_struct *fuzzy_file = NULL;
int fd = -1, f_copy = -1;
STRUCT_STAT st, real_st, partial_st;
if (fuzzy_dirlist) {
flist_free(fuzzy_dirlist);
fuzzy_dirlist = NULL;
- fuzzy_dirname = "";
}
if (missing_below >= 0) {
dry_run--;
missing_below = -1;
}
+ parent_dirname = "";
return;
}
statret = -1;
stat_errno = ENOENT;
} else {
- if (fuzzy_basis && S_ISREG(file->mode)) {
- char *dn = file->dirname ? file->dirname : ".";
- if (fuzzy_dirname != dn
- && strcmp(fuzzy_dirname, dn) != 0) {
- if (fuzzy_dirlist)
- flist_free(fuzzy_dirlist);
- fuzzy_dirlist = get_dirlist(dn, -1, 1);
+ char *dn = file->dirname ? file->dirname : ".";
+ if (parent_dirname != dn && strcmp(parent_dirname, dn) != 0) {
+ if (relative_paths && !implied_dirs && stat(dn, &st) < 0
+ && create_directory_path(fname, orig_umask) < 0) {
+ rsyserr(FERROR, errno,
+ "recv_generator: mkdir %s failed",
+ full_fname(dn));
}
- fuzzy_dirname = dn;
+ if (fuzzy_dirlist) {
+ flist_free(fuzzy_dirlist);
+ fuzzy_dirlist = NULL;
+ }
+ if (fuzzy_basis)
+ need_fuzzy_dirlist = 1;
}
+ parent_dirname = dn;
+
+ if (need_fuzzy_dirlist && S_ISREG(file->mode))
+ fuzzy_dirlist = get_dirlist(dn, -1, 1);
statret = link_stat(fname, &st,
keep_dirlinks && S_ISDIR(file->mode));
} else
partialptr = NULL;
- if (statret != 0 && fuzzy_basis && dry_run <= 1) {
+ if (statret != 0 && fuzzy_dirlist && dry_run <= 1) {
int j = find_fuzzy(file, fuzzy_dirlist);
if (j >= 0) {
fuzzy_file = fuzzy_dirlist->files[j];
if (!do_xfers || read_batch || whole_file)
goto notify_others;
- if (fuzzy_basis) {
+ if (fuzzy_dirlist) {
int j = flist_find(fuzzy_dirlist, file);
if (j >= 0) /* don't use changing file as future fuzzy basis */
fuzzy_dirlist->files[j]->flags |= FLAG_NO_FUZZY;
rprintf(FINFO, "generating and sending sums for %d\n", ndx);
notify_others:
- if (remove_sent_files && !phase)
+ if (remove_sent_files && !delay_updates && !phase)
increment_active_files(ndx, itemizing, code);
write_int(f_out, ndx);
if (itemizing) {