summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2014-05-12 13:29:01 +0100
committerPádraig Brady <P@draigBrady.com>2014-05-13 23:23:30 +0100
commitfb902297f536df060ff10ef06bb8fe6cfe0c845e (patch)
treeb7cbc753625065e50bb3965e6010a1b3e45b4054 /src
parent2dc5d044a88fd64e11e35886e78b54a4a9fc2b23 (diff)
downloadcoreutils-fb902297f536df060ff10ef06bb8fe6cfe0c845e.tar.xz
df: fix handling of symlinks in mount list
The symlink handling in commit v8.21-172-g33660b4 was incomplete in the case where there were symlinks in the mount list itself. For example, in the case where /dev/mapper/fedora-home was in the mount list and that in turn was a symlink to /dev/dm-2, we have: before> df --out=source /dev/mapper/fedora-home devtmpfs after > df --out=source /dev/mapper/fedora-home /dev/mapper/fedora-home * src/df.c (get_disk): Compare canonicalized device names from the mount list. Note we still display the non canonicalized name, even if longer, as we assume that is the most representative. * tests/df/df-symlink.sh: This could theoretically fail on some systems depending on the content of the mount list, but adjust to fail on any system where symlinks are present in the mount list for the current dir.
Diffstat (limited to 'src')
-rw-r--r--src/df.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/df.c b/src/df.c
index 2b5a54e4a..24897a33f 100644
--- a/src/df.c
+++ b/src/df.c
@@ -1056,13 +1056,19 @@ get_disk (char const *disk)
char const *file = disk;
char *resolved = canonicalize_file_name (disk);
- if (resolved && resolved[0] == '/')
+ if (resolved && IS_ABSOLUTE_FILE_NAME (resolved))
disk = resolved;
size_t best_match_len = SIZE_MAX;
for (me = mount_list; me; me = me->me_next)
{
- if (STREQ (disk, me->me_devname))
+ /* TODO: Should cache canon_dev in the mount_entry struct. */
+ char *devname = me->me_devname;
+ char *canon_dev = canonicalize_file_name (me->me_devname);
+ if (canon_dev && IS_ABSOLUTE_FILE_NAME (canon_dev))
+ devname = canon_dev;
+
+ if (STREQ (disk, devname))
{
size_t len = strlen (me->me_mountdir);
if (len < best_match_len)
@@ -1074,6 +1080,8 @@ get_disk (char const *disk)
best_match_len = len;
}
}
+
+ free (canon_dev);
}
free (resolved);