changeset 897:849e14fecf2b

Convert getmountlist() to xgetmountlist().
author Rob Landley <rob@landley.net>
date Fri, 10 May 2013 18:57:01 -0500
parents 79855f5dc085
children f6db08574875
files lib/getmountlist.c lib/lib.h toys/posix/df.c
diffstat 3 files changed, 23 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/lib/getmountlist.c	Fri May 10 18:54:14 2013 -0500
+++ b/lib/getmountlist.c	Fri May 10 18:57:01 2013 -0500
@@ -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)
 {
+  struct mtab_list *mtlist, *mt;
+  struct mntent *me;
   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;
-    }
+  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;
 }
--- a/lib/lib.h	Fri May 10 18:54:14 2013 -0500
+++ b/lib/lib.h	Fri May 10 18:57:01 2013 -0500
@@ -167,7 +167,7 @@
   char type[0];
 };
 
-struct mtab_list *getmountlist(int die);
+struct mtab_list *xgetmountlist(void);
 
 void bunzipStream(int src_fd, int dst_fd);
 
--- a/toys/posix/df.c	Fri May 10 18:54:14 2013 -0500
+++ b/toys/posix/df.c	Fri May 10 18:57:01 2013 -0500
@@ -108,7 +108,7 @@
       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) {