- int saveerrno = errno;
- snprintf(fnamecmpbuf,MAXPATHLEN,"%s/%s",compare_dest,fname);
- statret = link_stat(fnamecmpbuf,&st);
- if (!S_ISREG(st.st_mode))
- statret = -1;
- if (statret == -1)
- errno = saveerrno;
- else
- fnamecmp = fnamecmpbuf;
+ pathjoin(fnamecmpbuf, sizeof fnamecmpbuf, compare_dest, fname);
+ if (link_stat(fnamecmpbuf, &st, 0) == 0
+ && S_ISREG(st.st_mode)) {
+#if HAVE_LINK
+ if (link_dest && !dry_run) {
+ if (do_link(fnamecmpbuf, fname) < 0) {
+ if (verbose) {
+ rsyserr(FINFO, errno,
+ "link %s => %s",
+ fnamecmpbuf,
+ safe_fname(fname));
+ }
+ fnamecmp = fnamecmpbuf;
+ }
+ } else
+#endif
+ fnamecmp = fnamecmpbuf;
+ statret = 0;
+ }
+ }
+
+ if (statret == 0 && !S_ISREG(st.st_mode)) {
+ if (delete_file(fname) != 0)
+ return;
+ statret = -1;
+ stat_errno = ENOENT;
+ }
+
+ if (partial_dir) {
+ if ((partialptr = partial_dir_fname(fname))
+ && link_stat(partialptr, &partial_st, 0) == 0
+ && S_ISREG(partial_st.st_mode)) {
+ if (statret == -1)
+ goto prepare_to_open;
+ } else
+ partialptr = NULL;