extern char *partial_dir;
extern char *basis_dir[];
extern int compare_dest;
+extern int copy_dest;
extern int link_dest;
extern int whole_file;
extern int local_server;
{
static int min_depth = MAXPATHLEN, cur_depth = -1;
static void *filt_array[MAXPATHLEN/2+1];
- static int already_output_warning = 0;
+ static int already_warned = 0;
struct file_list *dirlist;
char delbuf[MAXPATHLEN];
STRUCT_STAT st;
return; /* Impossible... */
if (io_error && !(lp_ignore_errors(module_id) || ignore_errors)) {
- if (already_output_warning)
+ if (already_warned)
return;
rprintf(FINFO,
"IO error encountered -- skipping file deletion\n");
- already_output_warning = 1;
+ already_warned = 1;
return;
}
enum logcode code, int f_out)
{
static int missing_below = -1, excluded_below = -1;
- static char *fuzzy_dirname = NULL;
+ static char *fuzzy_dirname = "";
static struct file_list *fuzzy_dirlist = NULL;
struct file_struct *fuzzy_file = NULL;
int fd = -1, f_copy = -1;
if (fuzzy_dirlist) {
flist_free(fuzzy_dirlist);
fuzzy_dirlist = NULL;
- fuzzy_dirname = NULL;
+ fuzzy_dirname = "";
}
if (missing_below >= 0) {
dry_run--;
} else {
if (fuzzy_basis && S_ISREG(file->mode)) {
char *dn = file->dirname ? file->dirname : ".";
- /* Yes, identical dirnames are guaranteed to have
- * identical pointers at this point. */
- if (fuzzy_dirname != dn) {
+ if (fuzzy_dirname != dn
+ && strcmp(fuzzy_dirname, dn) != 0) {
if (fuzzy_dirlist)
flist_free(fuzzy_dirlist);
- fuzzy_dirname = dn;
- fuzzy_dirlist = get_dirlist(fuzzy_dirname, -1,
- 1);
+ fuzzy_dirlist = get_dirlist(dn, -1, 1);
}
+ fuzzy_dirname = dn;
}
statret = link_stat(fname, &st,
continue;
best_match = i;
match_level = 2;
+ if (copy_dest)
+ break;
/* FALL THROUGH */
case 2:
if (!unchanged_attrs(file, &st))
match_level = 2;
}
#endif
- if (compare_dest || (match_level && match_level < 3)) {
+ if (match_level == 2) {
+ /* Copy the file locally. */
+ if (copy_file(fnamecmpbuf, fname, file->mode) < 0) {
+ if (verbose) {
+ rsyserr(FINFO, errno,
+ "copy_file %s => %s",
+ full_fname(fnamecmpbuf),
+ safe_fname(fname));
+ }
+ match_level = 0;
+ statret = -1;
+ } else
+ set_perms(fname, file, NULL, 0);
+ } else if (compare_dest || match_level == 1) {
fnamecmp = fnamecmpbuf;
fnamecmp_type = i;
}
return;
}
/* Only --compare-dest gets here. */
- if (unchanged_attrs(file, &st)) {
- itemize(file, ndx, real_ret, &real_st,
- ITEM_NO_DEST_AND_NO_UPDATE, 0, NULL);
- return;
- }
+ itemize(file, ndx, real_ret, &real_st,
+ ITEM_NO_DEST_AND_NO_UPDATE, 0, NULL);
+ return;
}
prepare_to_open: