>From 999f64b2615cd53504e4ad312f7a72eb2170da5f Mon Sep 17 00:00:00 2001 From: Strake <strake...@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 <strake...@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 <strake...@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 _______________________________________________ Toybox mailing list Toybox@lists.landley.net http://lists.landley.net/listinfo.cgi/toybox-landley.net