df: follow symlinks

Signed-off-by: Alexander Bakanovskii <skotttt228@gmail.com>
This commit is contained in:
Alexander Bakanovskii
2025-09-20 17:51:04 +03:00
parent 68a0369a45
commit f66e65620d
2 changed files with 13 additions and 2 deletions
+1 -1
View File
@@ -19,7 +19,7 @@ path = "src/df.rs"
[dependencies]
clap = { workspace = true }
uucore = { workspace = true, features = ["libc", "fsext", "parser"] }
uucore = { workspace = true, features = ["libc", "fsext", "parser", "fs"] }
unicode-width = { workspace = true }
thiserror = { workspace = true }
fluent = { workspace = true }
+12 -1
View File
@@ -306,13 +306,24 @@ fn get_all_filesystems(opt: &Options) -> UResult<Vec<Filesystem>> {
}
let mut mounts = vec![];
for mi in read_fs_list()? {
for mut mi in read_fs_list()? {
// TODO The running time of the `is_best()` function is linear
// in the length of `result`. That makes the running time of
// this loop quadratic in the length of `vmi`. This could be
// improved by a more efficient implementation of `is_best()`,
// but `vmi` is probably not very long in practice.
if is_included(&mi, opt) && is_best(&mounts, &mi) {
let dev_path: &Path = Path::new(&mi.dev_name);
if dev_path.is_symlink() {
if let Ok(canonicalized_symlink) = uucore::fs::canonicalize(
dev_path,
uucore::fs::MissingHandling::Existing,
uucore::fs::ResolveMode::Logical,
) {
mi.dev_name = canonicalized_symlink.to_string_lossy().to_string();
}
}
mounts.push(mi);
}
}