From e3781b731215d826585fe37720eebe147705f340 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Tue, 8 Aug 2006 01:39:49 +0000 Subject: Add shared subtree support, suggested by Vladimir Dronnikov. Also break out a few new (unfinished) config options, which I intend to make hidden (but enabled) when CONFIG_NITPICK is disabled. Getting the .config infrastructure to do that is non-obvious, it seems... --- util-linux/Config.in | 19 ++++++++- util-linux/mount.c | 107 +++++++++++++++++++++++++++------------------------ 2 files changed, 75 insertions(+), 51 deletions(-) (limited to 'util-linux') diff --git a/util-linux/Config.in b/util-linux/Config.in index 65d670824..2222e5c38 100644 --- a/util-linux/Config.in +++ b/util-linux/Config.in @@ -370,7 +370,24 @@ config CONFIG_FEATURE_MOUNT_NFS default n depends on CONFIG_MOUNT help - Enable mounting of NFS file systems. + Enable mounting of NFS file systems. + +config CONFIG_FEATURE_MOUNT_FLAGS + depends on CONFIG_MOUNT + bool "Support lots of -o flags in mount." + default y + help + Without this, mount only supports ro/rw/remount. With this, it + supports nosuid, suid, dev, nodev, exec, noexec, sync, async, atime, + noatime, diratime, nodiratime, loud, bind, move, shared, slave, + private, unbindable, rshared, rslave, rprivate, and runbindable. + +config CONFIG_FEATURE_MOUNT_FSTAB + depends on CONFIG_MOUNT + bool "Support /etc/fstab and -a" + default y + help + Support mount all and looking for files in /etc/fstab. config CONFIG_PIVOT_ROOT bool "pivot_root" diff --git a/util-linux/mount.c b/util-linux/mount.c index d5d3eae17..5d5f487c2 100644 --- a/util-linux/mount.c +++ b/util-linux/mount.c @@ -25,17 +25,6 @@ #include "busybox.h" #include -// These two aren't always defined in old headers -#ifndef MS_BIND -#define MS_BIND 4096 -#endif -#ifndef MS_MOVE -#define MS_MOVE 8192 -#endif -#ifndef MS_SILENT -#define MS_SILENT 32768 -#endif - // Not real flags, but we want to be able to check for this. #define MOUNT_NOAUTO (1<<29) #define MOUNT_SWAP (1<<30) @@ -43,40 +32,59 @@ * flags */ struct { - const char *name; + char *name; long flags; -} static const mount_options[] = { - // NOP flags. - - {"loop", 0}, - {"defaults", 0}, - {"quiet", 0}, - - // vfs flags - - {"ro", MS_RDONLY}, - {"rw", ~MS_RDONLY}, - {"nosuid", MS_NOSUID}, - {"suid", ~MS_NOSUID}, - {"dev", ~MS_NODEV}, - {"nodev", MS_NODEV}, - {"exec", ~MS_NOEXEC}, - {"noexec", MS_NOEXEC}, - {"sync", MS_SYNCHRONOUS}, - {"async", ~MS_SYNCHRONOUS}, - {"atime", ~MS_NOATIME}, - {"noatime", MS_NOATIME}, - {"diratime", ~MS_NODIRATIME}, - {"nodiratime", MS_NODIRATIME}, - {"loud", ~MS_SILENT}, - - // action flags - - {"remount", MS_REMOUNT}, - {"bind", MS_BIND}, - {"move", MS_MOVE}, - {"noauto",MOUNT_NOAUTO}, - {"swap",MOUNT_SWAP} +} static mount_options[] = { + // MS_FLAGS set a bit. ~MS_FLAGS disable that bit. 0 flags are NOPs. + + USE_FEATURE_MOUNT_LOOP( + {"loop", 0}, + ) + + USE_FEATURE_MOUNT_FSTAB( + {"defaults", 0}, + {"quiet", 0}, + {"noauto",MOUNT_NOAUTO}, + {"swap",MOUNT_SWAP}, + ) + + USE_FEATURE_MOUNT_FLAGS( + // vfs flags + {"nosuid", MS_NOSUID}, + {"suid", ~MS_NOSUID}, + {"dev", ~MS_NODEV}, + {"nodev", MS_NODEV}, + {"exec", ~MS_NOEXEC}, + {"noexec", MS_NOEXEC}, + {"sync", MS_SYNCHRONOUS}, + {"async", ~MS_SYNCHRONOUS}, + {"atime", ~MS_NOATIME}, + {"noatime", MS_NOATIME}, + {"diratime", ~MS_NODIRATIME}, + {"nodiratime", MS_NODIRATIME}, + {"loud", ~MS_SILENT}, + + // action flags + + {"bind", MS_BIND}, + {"move", MS_MOVE}, + {"shared", MS_SHARED}, + {"slave", MS_SLAVE}, + {"private", MS_PRIVATE}, + {"unbindable", MS_UNBINDABLE}, + {"rshared", MS_SHARED|MS_RECURSIVE}, + {"rslave", MS_SLAVE|MS_RECURSIVE}, + {"rprivate", MS_SLAVE|MS_RECURSIVE}, + {"runbindable", MS_UNBINDABLE|MS_RECURSIVE}, + ) + + // Always understood. + + {"ro", MS_RDONLY}, // vfs flag + {"rw", ~MS_RDONLY}, // vfs flag + {"remount", MS_REMOUNT}, // action flag + + }; /* Append mount options to string */ @@ -225,9 +233,8 @@ static int mount_it_now(struct mntent *mp, int vfsflags, char *filteropts) for(i=0; mount_options[i].flags != MS_REMOUNT; i++) if (mount_options[i].flags > 0) - append_mount_options(&(mp->mnt_opts), -// Shut up about the darn const. It's not important. I don't care. - (char *)mount_options[i].name); +// Shut up about the darn const. It's not important. I don't care. (char *) + append_mount_options(&(mp->mnt_opts), mount_options[i].name); // Remove trailing / (if any) from directory we mounted on @@ -285,8 +292,8 @@ static int singlemount(struct mntent *mp, int ignore_busy) // Look at the file. (Not found isn't a failure for remount, or for // a synthetic filesystem like proc or sysfs.) - if (stat(mp->mnt_fsname, &st)); - else if (!(vfsflags & (MS_REMOUNT | MS_BIND | MS_MOVE))) { + if (!lstat(mp->mnt_fsname, &st) && !(vfsflags & (MS_REMOUNT | MS_BIND | MS_MOVE | MS_SHARED | MS_PRIVATE || MS_SLAVE | MS_UNBINDABLE))) + { // Do we need to allocate a loopback device for it? if (ENABLE_FEATURE_MOUNT_LOOP && S_ISREG(st.st_mode)) { @@ -456,7 +463,7 @@ int mount_main(int argc, char **argv) // Open either fstab or mtab if (parse_mount_options(cmdopts,0) & MS_REMOUNT) - fstabname = (char *)bb_path_mtab_file; // Again with the evil const. + fstabname = bb_path_mtab_file; // Again with the evil const (char *). else fstabname="/etc/fstab"; if (!(fstab=setmntent(fstabname,"r"))) -- cgit v1.2.3