aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/getmountlist.c47
-rw-r--r--lib/lib.h2
-rw-r--r--toys/posix/df.c2
3 files changed, 24 insertions, 27 deletions
diff --git a/lib/getmountlist.c b/lib/getmountlist.c
index 09ed9029..dbf0b27c 100644
--- a/lib/getmountlist.c
+++ b/lib/getmountlist.c
@@ -7,35 +7,32 @@
#include <mntent.h>
-// Get a list of mount points from /etc/mtab or /proc/mounts, including
-// statvfs() information. This returns a reversed list, which is good for
-// finding overmounts and such.
+// Get list of mounted filesystems, including stat and statvfs info.
+// Returns a reversed list, which is good for finding overmounts and such.
-struct mtab_list *getmountlist(int die)
+struct mtab_list *xgetmountlist(void)
{
- FILE *fp;
struct mtab_list *mtlist, *mt;
- struct mntent me;
- char evilbuf[2*PATH_MAX], *path_mounts = "/proc/mounts";
-
- mtlist = 0;
- if (!(fp = setmntent(path_mounts, "r"))) {
- if (die) error_exit("cannot open %s", path_mounts);
- } else {
- while (getmntent_r(fp, &me, evilbuf, sizeof(evilbuf))) {
- mt = xzalloc(sizeof(struct mtab_list) + strlen(me.mnt_fsname) +
- strlen(me.mnt_dir) + strlen(me.mnt_type) + 3);
- mt->next = mtlist;
- // Get information about this filesystem. Yes, we need both.
- stat(me.mnt_dir, &(mt->stat));
- statvfs(me.mnt_dir, &(mt->statvfs));
- // Remember information from /proc/mounts
- mt->dir = stpcpy(mt->type, me.mnt_type) + 1;
- mt->device = stpcpy(mt->dir, me.mnt_dir) + 1;
- strcpy(mt->device, me.mnt_fsname);
- mtlist = mt;
- }
+ struct mntent *me;
+ FILE *fp;
+
+ if (!(fp = setmntent("/proc/mounts", "r"))) perror_exit("bad /proc/mounts");
+
+ for (mtlist = 0; me = getmntent(fp); mtlist = mt) {
+ mt = xzalloc(sizeof(struct mtab_list) + strlen(me->mnt_fsname) +
+ strlen(me->mnt_dir) + strlen(me->mnt_type) + 3);
+ mt->next = mtlist;
+
+ // Collect details about mounted filesystem (don't bother for /etc/fstab).
+ stat(me->mnt_dir, &(mt->stat));
+ statvfs(me->mnt_dir, &(mt->statvfs));
+
+ // Remember information from /proc/mounts
+ mt->dir = stpcpy(mt->type, me->mnt_type) + 1;
+ mt->device = stpcpy(mt->dir, me->mnt_dir) + 1;
+ strcpy(mt->device, me->mnt_fsname);
}
endmntent(fp);
+
return mtlist;
}
diff --git a/lib/lib.h b/lib/lib.h
index a4da031c..77f5fd26 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -167,7 +167,7 @@ struct mtab_list {
char type[0];
};
-struct mtab_list *getmountlist(int die);
+struct mtab_list *xgetmountlist(void);
void bunzipStream(int src_fd, int dst_fd);
diff --git a/toys/posix/df.c b/toys/posix/df.c
index 957e80b2..9e8570fc 100644
--- a/toys/posix/df.c
+++ b/toys/posix/df.c
@@ -108,7 +108,7 @@ void df_main(void)
TT.units);
} else puts("Filesystem\t1K-blocks\tUsed Available Use% Mounted on");
- mtlist = getmountlist(1);
+ mtlist = xgetmountlist();
// If we have a list of filesystems on the command line, loop through them.
if (*toys.optargs) {