[Toybox] [patch] add u?mount

Strake strake888 at gmail.com
Sun Aug 18 07:38:42 PDT 2013


>From 999f64b2615cd53504e4ad312f7a72eb2170da5f Mon Sep 17 00:00:00 2001
From: Strake <strake888 at gmail.com>
Date: Sun, 18 Aug 2013 09:29:51 -0500
Subject: [PATCH] add u?mount

---
 toys/pending/mount.c  | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++
 toys/pending/umount.c | 27 +++++++++++++++
 2 files changed, 121 insertions(+)
 create mode 100644 toys/pending/mount.c
 create mode 100644 toys/pending/umount.c

diff --git a/toys/pending/mount.c b/toys/pending/mount.c
new file mode 100644
index 0000000..3b666ea
--- /dev/null
+++ b/toys/pending/mount.c
@@ -0,0 +1,94 @@
+/* mount.c - mount filesystem
+ *
+ * Copyright 2013 Strake <strake888 at gmail.com>
+ *
+ * See http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/mount.html
+
+USE_MOUNT(NEWTOY(mount, "o*t:", TOYFLAG_BIN))
+
+config MOUNT
+  bool "mount"
+  default n
+  help
+    usage: mount -t TYPE DEVICE DIR
+
+    mount the filesystem of TYPE on DEVICE onto DIR.
+*/
+
+#define FOR_mount
+#include "toys.h"
+
+GLOBALS(
+  char *t;
+  struct arg_list *o;
+)
+
+struct optkv {
+  char *k;
+  long v;
+};
+
+struct optkv mount_options[] = {
+  { "bind",         MS_BIND },
+  { "dirsync",      MS_DIRSYNC },
+  { "mandlock",     MS_MANDLOCK },
+  { "move",         MS_MOVE },
+  { "atime",       ~MS_NOATIME },
+  { "dev",         ~MS_NODEV },
+  { "diratime",    ~MS_NODIRATIME },
+  { "exec",        ~MS_NOEXEC },
+  { "suid",        ~MS_NOSUID },
+  { "rdonly",       MS_RDONLY },
+  { "relatime",     MS_RELATIME },
+  { "silent",       MS_SILENT },
+  { "strictatime",  MS_STRICTATIME },
+  { "sync",         MS_SYNC },
+  { 0 }
+};
+
+long findmountopt (char *o) {
+  int ii;
+  long v = 0;
+
+  if (strncmp (o, "no", 2) == 0) {
+    v = -1;
+    o += 2;
+  }
+
+  for (ii = 0; mount_options[ii].k; ii++) if (strcmp (o,
mount_options[ii].k) == 0) return (v ^ mount_options[ii].v);
+  return 0;
+}
+
+void mount_main () {
+  char *fsopts;
+  long mountflags = 0;
+
+  fsopts = 0;
+  for (; TT.o; TT.o = TT.o -> next) {
+    char *o, *p;
+    for (o = TT.o -> arg; o; o = p) {
+      p = strchr (o, ',');
+      if (p) p[0] = 0;
+      long flag = findmountopt (o);
+      if (flag  < 0) mountflags &= flag;
+      if (flag  > 0) mountflags |= flag;
+      if (flag == 0) {
+        if (fsopts) fsopts = xastrcat (fsopts, ",");
+        fsopts = xastrcat (fsopts, o);
+      }
+      if (p) p++[0] = ',';
+    }
+  }
+
+  switch (toys.optc) {
+  case 0:
+    xsendfile (xopen ("/proc/self/mounts", O_RDONLY), 1);
+    break;
+  case 2:
+    if (!(toys.optflags & FLAG_t)) error_exit ("usage: mount -t TYPE
DEVICE DIR");
+    if (mount (toys.optargs[0], toys.optargs[1], TT.t, mountflags,
fsopts) < 0) perror_exit ("can't mount -t %s %s %s", TT.t,
toys.optargs[0], toys.optargs[1]);
+    break;
+  default:
+    error_exit ("usage: mount -t TYPE DEVICE DIR");
+  }
+}
diff --git a/toys/pending/umount.c b/toys/pending/umount.c
new file mode 100644
index 0000000..dd7bc53
--- /dev/null
+++ b/toys/pending/umount.c
@@ -0,0 +1,27 @@
+/* umount.c - umount filesystem
+ *
+ * Copyright 2013 CE Strake <strake888 at gmail.com>
+ *
+ * See http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/umount.html
+
+USE_UMOUNT(NEWTOY(umount, "", TOYFLAG_BIN))
+
+config UMOUNT
+  bool "umount"
+  default n
+  help
+    usage: umount DIR...
+
+    unmount filesystem on DIR.
+*/
+
+#define FOR_umount
+#include "toys.h"
+
+void umount_main () {
+  int ii;
+  for (ii = 0; toys.optargs[ii]; ii++) if (umount (toys.optargs[ii]) < 0) {
+    error_msg ("can't umount %s", toys.optargs[ii]);
+    toys.exitval++;
+  }
+}
-- 
1.7.11.1


More information about the Toybox mailing list