[Toybox] [PATCH] macOS: move getmountlist.c functions into portability.c.

enh enh at google.com
Tue Dec 4 12:48:40 PST 2018


I think this was the preferred option for this code that turns out
to be very different on Linux vs BSD. I don't yet have a BSD
implementation, and I'm not likely to have chance to work on one
in the near future, so this just #ifdefs it out for macOS right
now.

With this (and a suitably minimal .config), toybox builds for macOS
out of the box.
---
 lib/getmountlist.c | 103 ------------------------------------------
 lib/portability.c  | 108 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 108 insertions(+), 103 deletions(-)
 delete mode 100644 lib/getmountlist.c

diff --git a/lib/getmountlist.c b/lib/getmountlist.c
deleted file mode 100644
index 791636fb..00000000
--- a/lib/getmountlist.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/* getmountlist.c - Get a linked list of mount points, with stat information.
- *
- * Copyright 2006 Rob Landley <rob at landley.net>
- */
-
-#include "toys.h"
-#include <mntent.h>
-
-static void octal_deslash(char *s)
-{
-  char *o = s;
-
-  while (*s) {
-    if (*s == '\\') {
-      int i, oct = 0;
-
-      for (i = 1; i < 4; i++) {
-        if (!isdigit(s[i])) break;
-        oct = (oct<<3)+s[i]-'0';
-      }
-      if (i == 4) {
-        *o++ = oct;
-        s += i;
-        continue;
-      }
-    }
-    *o++ = *s++;
-  }
-
-  *o = 0;
-}
-
-// Check if this type matches list.
-// Odd syntax: typelist all yes = if any, typelist all no = if none.
-
-int mountlist_istype(struct mtab_list *ml, char *typelist)
-{
-  int len, skip;
-  char *t;
-
-  if (!typelist) return 1;
-
-  skip = strncmp(typelist, "no", 2);
-
-  for (;;) {
-    if (!(t = comma_iterate(&typelist, &len))) break;
-    if (!skip) {
-      // If one -t starts with "no", the rest must too
-      if (strncmp(t, "no", 2)) error_exit("bad typelist");
-      if (!strncmp(t+2, ml->type, len-2)) {
-        skip = 1;
-        break;
-      }
-    } else if (!strncmp(t, ml->type, len) && !ml->type[len]) {
-      skip = 0;
-      break;
-    }
-  }
-
-  return !skip;
-}
-
-// 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 *xgetmountlist(char *path)
-{
-  struct mtab_list *mtlist = 0, *mt;
-  struct mntent *me;
-  FILE *fp;
-  char *p = path ? path : "/proc/mounts";
-
-  if (!(fp = setmntent(p, "r"))) perror_exit("bad %s", p);
-
-  // The "test" part of the loop is done before the first time through and
-  // again after each "increment", so putting the actual load there avoids
-  // duplicating it. If the load was NULL, the loop stops.
-
-  while ((me = getmntent(fp))) {
-    mt = xzalloc(sizeof(struct mtab_list) + strlen(me->mnt_fsname) +
-      strlen(me->mnt_dir) + strlen(me->mnt_type) + strlen(me->mnt_opts) + 4);
-    dlist_add_nomalloc((void *)&mtlist, (void *)mt);
-
-    // Collect details about mounted filesystem
-    // Don't report errors, just leave data zeroed
-    if (!path) {
-      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;
-    mt->opts = stpcpy(mt->device, me->mnt_fsname)+1;
-    strcpy(mt->opts, me->mnt_opts);
-
-    octal_deslash(mt->dir);
-    octal_deslash(mt->device);
-  }
-  endmntent(fp);
-
-  return mtlist;
-}
diff --git a/lib/portability.c b/lib/portability.c
index b9d65bab..a80ca56c 100644
--- a/lib/portability.c
+++ b/lib/portability.c
@@ -53,3 +53,111 @@ int clearenv(void)
   return 0;
 }
 #endif
+
+// Get a linked list of mount points, with stat information.
+#ifdef __APPLE__
+
+// Not implemented for macOS.
+// See <sys/mount.h>'s getmntinfo(3) for the BSD API.
+
+#else
+
+#include <mntent.h>
+
+static void octal_deslash(char *s)
+{
+  char *o = s;
+
+  while (*s) {
+    if (*s == '\\') {
+      int i, oct = 0;
+
+      for (i = 1; i < 4; i++) {
+        if (!isdigit(s[i])) break;
+        oct = (oct<<3)+s[i]-'0';
+      }
+      if (i == 4) {
+        *o++ = oct;
+        s += i;
+        continue;
+      }
+    }
+    *o++ = *s++;
+  }
+
+  *o = 0;
+}
+
+// Check if this type matches list.
+// Odd syntax: typelist all yes = if any, typelist all no = if none.
+
+int mountlist_istype(struct mtab_list *ml, char *typelist)
+{
+  int len, skip;
+  char *t;
+
+  if (!typelist) return 1;
+
+  skip = strncmp(typelist, "no", 2);
+
+  for (;;) {
+    if (!(t = comma_iterate(&typelist, &len))) break;
+    if (!skip) {
+      // If one -t starts with "no", the rest must too
+      if (strncmp(t, "no", 2)) error_exit("bad typelist");
+      if (!strncmp(t+2, ml->type, len-2)) {
+        skip = 1;
+        break;
+      }
+    } else if (!strncmp(t, ml->type, len) && !ml->type[len]) {
+      skip = 0;
+      break;
+    }
+  }
+
+  return !skip;
+}
+
+// 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 *xgetmountlist(char *path)
+{
+  struct mtab_list *mtlist = 0, *mt;
+  struct mntent *me;
+  FILE *fp;
+  char *p = path ? path : "/proc/mounts";
+
+  if (!(fp = setmntent(p, "r"))) perror_exit("bad %s", p);
+
+  // The "test" part of the loop is done before the first time through and
+  // again after each "increment", so putting the actual load there avoids
+  // duplicating it. If the load was NULL, the loop stops.
+
+  while ((me = getmntent(fp))) {
+    mt = xzalloc(sizeof(struct mtab_list) + strlen(me->mnt_fsname) +
+      strlen(me->mnt_dir) + strlen(me->mnt_type) + strlen(me->mnt_opts) + 4);
+    dlist_add_nomalloc((void *)&mtlist, (void *)mt);
+
+    // Collect details about mounted filesystem
+    // Don't report errors, just leave data zeroed
+    if (!path) {
+      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;
+    mt->opts = stpcpy(mt->device, me->mnt_fsname)+1;
+    strcpy(mt->opts, me->mnt_opts);
+
+    octal_deslash(mt->dir);
+    octal_deslash(mt->device);
+  }
+  endmntent(fp);
+
+  return mtlist;
+}
+
+#endif
-- 
2.19.0.605.g01d371f741-goog
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-macOS-move-getmountlist.c-functions-into-portability.patch
Type: application/octet-stream
Size: 6493 bytes
Desc: not available
URL: <http://lists.landley.net/pipermail/toybox-landley.net/attachments/20181204/74171e0a/attachment-0002.obj>


More information about the Toybox mailing list