aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2018-12-04 12:45:38 -0800
committerRob Landley <rob@landley.net>2018-12-04 15:46:53 -0600
commitbcf244f3e6ff3c76536063bc5f7d684c6fd4e3fd (patch)
tree504fa94028e680585ad696b37304ec2165849c38 /lib
parenta6ec1d989bba98cf1e4cd3b3e566e69cfc4e4939 (diff)
downloadtoybox-bcf244f3e6ff3c76536063bc5f7d684c6fd4e3fd.tar.gz
macOS: move getmountlist.c functions into portability.c.
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.
Diffstat (limited to 'lib')
-rw-r--r--lib/getmountlist.c103
-rw-r--r--lib/portability.c108
2 files changed, 108 insertions, 103 deletions
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@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