- Changed some FERROR log calls to FLOG.
[rsync/rsync.git] / generator.c
index 8053348..93587f6 100644 (file)
@@ -26,6 +26,7 @@
 extern int verbose;
 extern int dry_run;
 extern int relative_paths;
+extern int keep_dirlinks;
 extern int preserve_links;
 extern int am_root;
 extern int preserve_devices;
@@ -293,7 +294,7 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out)
                return;
        }
 
-       statret = link_stat(fname,&st);
+       statret = link_stat(fname, &st, keep_dirlinks && S_ISDIR(file->mode));
 
        if (only_existing && statret == -1 && errno == ENOENT) {
                /* we only want to update existing files */
@@ -338,9 +339,10 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out)
                                        full_fname(fname));
                        }
                }
-               /* f_out is set to -1 when doing final directory
-                  permission and modification time repair */
-               if (set_perms(fname,file,NULL,0) && verbose && (f_out != -1))
+               /* f_out is set to -1 when doing final directory-permission
+                * and modification-time repair. */
+               if (set_perms(fname, file, statret ? NULL : &st, 0)
+                   && verbose && f_out != -1)
                        rprintf(FINFO,"%s/\n",fname);
                return;
        }
@@ -427,7 +429,7 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out)
                /* try the file at compare_dest instead */
                int saveerrno = errno;
                pathjoin(fnamecmpbuf, sizeof fnamecmpbuf, compare_dest, fname);
-               statret = link_stat(fnamecmpbuf,&st);
+               statret = link_stat(fnamecmpbuf, &st, 0);
                if (!S_ISREG(st.st_mode))
                        statret = -1;
                if (statret == -1)