[Toybox] [patch] add u?mount

Isaac ibid.ag at gmail.com
Sun Aug 18 08:43:24 PDT 2013


On Sun, Aug 18, 2013 at 09:38:42AM -0500, Strake wrote:
> 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
> 

Good start, but I'd suggest looking at Rob's mount.c for a guide to
what is needed. (There's also some tricks that reduce size in there.)
If only I could find it on the archive; I'm sure it's there, but 
google isn't finding it and that email account is dead.

But see these:
http://landley.net/notes-2012.html#09-08-2012
https://lkml.org/lkml/2012/8/12/134

> ---
>  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;
> +}

Here Rob's version uses the index in place of a struct with a long:

// These entries are in the order the corresponding linux vfs bits occur in.
static char *vfsflags[] = {
    "ro", "nosuid", "nodev", "noexec", "sync", "remount", "mand", "dirsync",
    "", "", "noatime", "nodiratime", "bind", "move", "rec", "silent",
    "", "unbindable", "private", "slave", "shared", "relatime",
    "", "iversion", "strictatime"
};
...
Note the support for private, slave, and remount.
Loopback support is also nice.

> +
> +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
> _______________________________________________
> Toybox mailing list
> Toybox at lists.landley.net
> http://lists.landley.net/listinfo.cgi/toybox-landley.net



More information about the Toybox mailing list