76 lines
2.3 KiB
Diff
76 lines
2.3 KiB
Diff
From 76c1da7ecf69bfe8a928f03304919f75e819e694 Mon Sep 17 00:00:00 2001
|
|
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
Date: Wed, 11 Aug 2021 11:16:05 -0700
|
|
Subject: df: fix bug with automounted
|
|
|
|
If the command-line argument is automounted, df would use
|
|
stat info that became wrong after the following open.
|
|
* src/df.c (automount_stat_err): New function.
|
|
This fixes the hang on fifos in a better way, by using O_NONBLOCK.
|
|
(main): Use it.
|
|
|
|
(cherry picked from commit a3c04f8da14f0fe2a0561bf5562032b8ce5dafa9)
|
|
---
|
|
src/df.c | 34 +++++++++++++++++++++++++---------
|
|
1 file changed, 25 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/src/df.c b/src/df.c
|
|
index 99989399f..841b7715b 100644
|
|
--- a/src/df.c
|
|
+++ b/src/df.c
|
|
@@ -276,6 +276,28 @@ static struct option const long_options[] =
|
|
{NULL, 0, NULL, 0}
|
|
};
|
|
|
|
+/* Stat FILE and put the results into *ST. Return 0 if successful, an
|
|
+ error number otherwise. Try to open FILE before statting, to
|
|
+ trigger automounts. */
|
|
+
|
|
+static int
|
|
+automount_stat_err (char const *file, struct stat *st)
|
|
+{
|
|
+ int fd = open (file, O_RDONLY | O_NOCTTY | O_NONBLOCK);
|
|
+ if (fd < 0)
|
|
+ {
|
|
+ if (errno == ENOENT || errno == ENOTDIR)
|
|
+ return errno;
|
|
+ return stat (file, st) == 0 ? 0 : errno;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ int err = fstat (fd, st) == 0 ? 0 : errno;
|
|
+ close (fd);
|
|
+ return err;
|
|
+ }
|
|
+}
|
|
+
|
|
/* Replace problematic chars with '?'.
|
|
Since only control characters are currently considered,
|
|
this should work in all encodings. */
|
|
@@ -1772,19 +1794,13 @@ main (int argc, char **argv)
|
|
stats = xnmalloc (argc - optind, sizeof *stats);
|
|
for (int i = optind; i < argc; ++i)
|
|
{
|
|
- if (stat (argv[i], &stats[i - optind]))
|
|
+ int err = automount_stat_err (argv[i], &stats[i - optind]);
|
|
+ if (err != 0)
|
|
{
|
|
- error (0, errno, "%s", quotef (argv[i]));
|
|
+ error (0, err, "%s", quotef (argv[i]));
|
|
exit_status = EXIT_FAILURE;
|
|
argv[i] = NULL;
|
|
}
|
|
- else if (! S_ISFIFO (stats[i - optind].st_mode))
|
|
- {
|
|
- /* open() is needed to automount in some cases. */
|
|
- int fd = open (argv[i], O_RDONLY | O_NOCTTY);
|
|
- if (0 <= fd)
|
|
- close (fd);
|
|
- }
|
|
}
|
|
}
|
|
|
|
--
|
|
2.54.0
|
|
|