Changed the -x code to allow -L to copy a file on another filesystem
[rsync/rsync.git] / flist.c
diff --git a/flist.c b/flist.c
index a9bfb55..ff9d774 100644 (file)
--- a/flist.c
+++ b/flist.c
@@ -766,13 +766,12 @@ struct file_struct *make_file(char *fname, int exclude_level)
                return NULL;
        }
 
-       if (one_file_system && st.st_dev != filesystem_dev) {
-               /* We allow a directory though to preserve the mount point.
-                * However, flag it so that we don't recurse. */
-               if (!S_ISDIR(st.st_mode))
-                       return NULL;
+       /* We only care about directories because we need to avoid recursing
+        * into a mount-point directory, not to avoid copying a symlinked
+        * file if -L (or similar) was specified. */
+       if (one_file_system && st.st_dev != filesystem_dev
+           && S_ISDIR(st.st_mode))
                flags |= FLAG_MOUNT_POINT;
-       }
 
        if (check_exclude_file(thisname, S_ISDIR(st.st_mode) != 0, exclude_level))
                return NULL;
@@ -808,18 +807,22 @@ struct file_struct *make_file(char *fname, int exclude_level)
        linkname_len = 0;
 #endif
 
-       idev_len = 0;
 #if SUPPORT_HARD_LINKS
-       if (preserve_hard_links && st.st_nlink > 1) {
+       if (preserve_hard_links) {
                if (protocol_version < 28) {
                        if (S_ISREG(st.st_mode))
                                idev_len = sizeof (struct idev);
+                       else
+                               idev_len = 0;
                } else {
-                       if (!S_ISDIR(st.st_mode))
+                       if (!S_ISDIR(st.st_mode) && st.st_nlink > 1)
                                idev_len = sizeof (struct idev);
+                       else
+                               idev_len = 0;
                }
-       }
+       } else
 #endif
+               idev_len = 0;
 
        sum_len = always_checksum && S_ISREG(st.st_mode) ? MD4_SUM_LENGTH : 0;
        file_struct_len = idev_len? sizeof file[0] : min_file_struct_len;