]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
df: look for accessible mount points for specified devices
authorPádraig Brady <P@draigBrady.com>
Wed, 18 Jun 2014 12:10:17 +0000 (13:10 +0100)
committerPádraig Brady <P@draigBrady.com>
Tue, 24 Jun 2014 16:38:46 +0000 (17:38 +0100)
* src/df.c (get_disk): Include whether we can access the mount dir,
in the mount entry selection criteria.  This handles the case where
a device is (bind) mounted multiple times with the shortest mount path
not being accessible, while some of the other mount points are.
Discussed at: http://bugs.gnu.org/16539#63

src/df.c

index d6d4b0e9018c174dd825dd087a62dce789127af5..dc6544bc6adb5c4db60e12e777aa4ea417767d1e 100644 (file)
--- a/src/df.c
+++ b/src/df.c
@@ -1121,6 +1121,7 @@ get_disk (char const *disk)
 {
   struct mount_entry const *me;
   struct mount_entry const *best_match = NULL;
+  bool best_match_accessible = false;
   char const *file = disk;
 
   char *resolved = canonicalize_file_name (disk);
@@ -1139,13 +1140,24 @@ get_disk (char const *disk)
       if (STREQ (disk, devname))
         {
           size_t len = strlen (me->me_mountdir);
-          if (len < best_match_len)
+
+          if (! best_match_accessible || len < best_match_len)
             {
-              best_match = me;
-              if (len == 1) /* Traditional root.  */
-                break;
-              else
-                best_match_len = len;
+              struct stat disk_stats;
+              bool this_match_accessible = false;
+
+              if (stat (me->me_mountdir, &disk_stats) == 0)
+                best_match_accessible = this_match_accessible = true;
+
+              if (this_match_accessible
+                  || (! best_match_accessible && len < best_match_len))
+                {
+                  best_match = me;
+                  if (len == 1) /* Traditional root.  */
+                    break;
+                  else
+                    best_match_len = len;
+                }
             }
         }