summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2014-06-18 13:10:17 +0100
committerPádraig Brady <P@draigBrady.com>2014-06-24 17:38:46 +0100
commit828801a174de8fa6e492f311210c37394f13b30f (patch)
treefce8b0ab6859c7361718072a34f7a847d2fb6289 /src
parent9d736f8dbfef2b33d431dccf852dace9cfc84d59 (diff)
downloadcoreutils-828801a174de8fa6e492f311210c37394f13b30f.tar.xz
df: look for accessible mount points for specified devices
* 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
Diffstat (limited to 'src')
-rw-r--r--src/df.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/df.c b/src/df.c
index d6d4b0e90..dc6544bc6 100644
--- 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;
+ }
}
}