diff options
author | Pádraig Brady <P@draigBrady.com> | 2014-06-18 13:10:17 +0100 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2014-06-24 17:38:46 +0100 |
commit | 828801a174de8fa6e492f311210c37394f13b30f (patch) | |
tree | fce8b0ab6859c7361718072a34f7a847d2fb6289 /src | |
parent | 9d736f8dbfef2b33d431dccf852dace9cfc84d59 (diff) | |
download | coreutils-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.c | 24 |
1 files changed, 18 insertions, 6 deletions
@@ -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; + } } } |