mount: -T OTHERTAB support

function                                             old     new   delta
mount_main                                          1221    1241     +20
packed_usage                                       30616   30610      -6

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Signed-off-by: Isaac Dunham <ibid.ag@gmail.com>
This commit is contained in:
Isaac Dunham 2015-03-11 16:07:24 +01:00 committed by Denys Vlasenko
parent 3c31b092ac
commit 7b434a67dc
2 changed files with 108 additions and 94 deletions

View File

@ -434,94 +434,6 @@ config MORE
you will probably find this utility very helpful. If you don't have
any need to reading text files, you can leave this disabled.
config MOUNT
bool "mount"
default y
select PLATFORM_LINUX
help
All files and filesystems in Unix are arranged into one big directory
tree. The 'mount' utility is used to graft a filesystem onto a
particular part of the tree. A filesystem can either live on a block
device, or it can be accessible over the network, as is the case with
NFS filesystems. Most people using BusyBox will also want to enable
the 'mount' utility.
config FEATURE_MOUNT_FAKE
bool "Support option -f"
default y
depends on MOUNT
help
Enable support for faking a file system mount.
config FEATURE_MOUNT_VERBOSE
bool "Support option -v"
default y
depends on MOUNT
help
Enable multi-level -v[vv...] verbose messages. Useful if you
debug mount problems and want to see what is exactly passed
to the kernel.
config FEATURE_MOUNT_HELPERS
bool "Support mount helpers"
default n
depends on MOUNT
help
Enable mounting of virtual file systems via external helpers.
E.g. "mount obexfs#-b00.11.22.33.44.55 /mnt" will in effect call
"obexfs -b00.11.22.33.44.55 /mnt"
Also "mount -t sometype [-o opts] fs /mnt" will try
"sometype [-o opts] fs /mnt" if simple mount syscall fails.
The idea is to use such virtual filesystems in /etc/fstab.
config FEATURE_MOUNT_LABEL
bool "Support specifying devices by label or UUID"
default y
depends on MOUNT
select VOLUMEID
help
This allows for specifying a device by label or uuid, rather than by
name. This feature utilizes the same functionality as blkid/findfs.
This also enables label or uuid support for swapon.
config FEATURE_MOUNT_NFS
bool "Support mounting NFS file systems on Linux < 2.6.23"
default n
depends on MOUNT
select FEATURE_HAVE_RPC
select FEATURE_SYSLOG
help
Enable mounting of NFS file systems on Linux kernels prior
to version 2.6.23. Note that in this case mounting of NFS
over IPv6 will not be possible.
Note that this option links in RPC support from libc,
which is rather large (~10 kbytes on uclibc).
config FEATURE_MOUNT_CIFS
bool "Support mounting CIFS/SMB file systems"
default y
depends on MOUNT
help
Enable support for samba mounts.
config FEATURE_MOUNT_FLAGS
depends on 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 FEATURE_MOUNT_FSTAB
depends on MOUNT
bool "Support /etc/fstab and -a"
default y
help
Support mount all and looking for files in /etc/fstab.
config PIVOT_ROOT
bool "pivot_root"
default y

View File

@ -17,8 +17,103 @@
// mount_it_now() does the actual mount.
//
//config:config MOUNT
//config: bool "mount"
//config: default y
//config: select PLATFORM_LINUX
//config: help
//config: All files and filesystems in Unix are arranged into one big directory
//config: tree. The 'mount' utility is used to graft a filesystem onto a
//config: particular part of the tree. A filesystem can either live on a block
//config: device, or it can be accessible over the network, as is the case with
//config: NFS filesystems. Most people using BusyBox will also want to enable
//config: the 'mount' utility.
//config:
//config:config FEATURE_MOUNT_FAKE
//config: bool "Support option -f"
//config: default y
//config: depends on MOUNT
//config: help
//config: Enable support for faking a file system mount.
//config:
//config:config FEATURE_MOUNT_VERBOSE
//config: bool "Support option -v"
//config: default y
//config: depends on MOUNT
//config: help
//config: Enable multi-level -v[vv...] verbose messages. Useful if you
//config: debug mount problems and want to see what is exactly passed
//config: to the kernel.
//config:
//config:config FEATURE_MOUNT_HELPERS
//config: bool "Support mount helpers"
//config: default n
//config: depends on MOUNT
//config: help
//config: Enable mounting of virtual file systems via external helpers.
//config: E.g. "mount obexfs#-b00.11.22.33.44.55 /mnt" will in effect call
//config: "obexfs -b00.11.22.33.44.55 /mnt"
//config: Also "mount -t sometype [-o opts] fs /mnt" will try
//config: "sometype [-o opts] fs /mnt" if simple mount syscall fails.
//config: The idea is to use such virtual filesystems in /etc/fstab.
//config:
//config:config FEATURE_MOUNT_LABEL
//config: bool "Support specifying devices by label or UUID"
//config: default y
//config: depends on MOUNT
//config: select VOLUMEID
//config: help
//config: This allows for specifying a device by label or uuid, rather than by
//config: name. This feature utilizes the same functionality as blkid/findfs.
//config: This also enables label or uuid support for swapon.
//config:
//config:config FEATURE_MOUNT_NFS
//config: bool "Support mounting NFS file systems on Linux < 2.6.23"
//config: default n
//config: depends on MOUNT
//config: select FEATURE_HAVE_RPC
//config: select FEATURE_SYSLOG
//config: help
//config: Enable mounting of NFS file systems on Linux kernels prior
//config: to version 2.6.23. Note that in this case mounting of NFS
//config: over IPv6 will not be possible.
//config:
//config: Note that this option links in RPC support from libc,
//config: which is rather large (~10 kbytes on uclibc).
//config:
//config:config FEATURE_MOUNT_CIFS
//config: bool "Support mounting CIFS/SMB file systems"
//config: default y
//config: depends on MOUNT
//config: help
//config: Enable support for samba mounts.
//config:
//config:config FEATURE_MOUNT_FLAGS
//config: depends on MOUNT
//config: bool "Support lots of -o flags in mount"
//config: default y
//config: help
//config: Without this, mount only supports ro/rw/remount. With this, it
//config: supports nosuid, suid, dev, nodev, exec, noexec, sync, async, atime,
//config: noatime, diratime, nodiratime, loud, bind, move, shared, slave,
//config: private, unbindable, rshared, rslave, rprivate, and runbindable.
//config:
//config:config FEATURE_MOUNT_FSTAB
//config: depends on MOUNT
//config: bool "Support /etc/fstab and -a"
//config: default y
//config: help
//config: Support mount all and looking for files in /etc/fstab.
//config:
//config:config FEATURE_MOUNT_OTHERTAB
//config: depends on FEATURE_MOUNT_FSTAB
//config: bool "Support -T <alt_fstab>"
//config: default y
//config: help
//config: Support mount -T (specifying an alternate fstab)
//usage:#define mount_trivial_usage
//usage: "[OPTIONS] [-o OPTS] DEVICE NODE"
//usage: "[OPTIONS] [-o OPT] DEVICE NODE"
//usage:#define mount_full_usage "\n\n"
//usage: "Mount a filesystem. Filesystem autodetection requires /proc.\n"
//usage: "\n -a Mount all filesystems in fstab"
@ -41,8 +136,11 @@
//usage: )
////usage: "\n -s Sloppy (ignored)"
//usage: "\n -r Read-only mount"
//usage: "\n -w Read-write mount (default)"
////usage: "\n -w Read-write mount (default)"
//usage: "\n -t FSTYPE[,...] Filesystem type(s)"
//usage: IF_FEATURE_MOUNT_OTHERTAB(
//usage: "\n -T FILE Read FILE instead of /etc/fstab"
//usage: )
//usage: "\n -O OPT Mount only filesystems with option OPT (-a only)"
//usage: "\n-o OPT:"
//usage: IF_FEATURE_MOUNT_LOOP(
@ -64,7 +162,7 @@
//usage: "\n move Relocate an existing mount point"
//usage: )
//usage: "\n remount Remount a mounted filesystem, changing flags"
//usage: "\n ro/rw Same as -r/-w"
//usage: "\n ro Same as -r"
//usage: "\n"
//usage: "\nThere are filesystem-specific -o flags."
//usage:
@ -167,7 +265,7 @@ enum {
};
#define OPTION_STR "o:t:rwanfvsiO:"
#define OPTION_STR "o:t:rwanfvsiO:" IF_FEATURE_MOUNT_OTHERTAB("T:")
enum {
OPT_o = (1 << 0),
OPT_t = (1 << 1),
@ -180,6 +278,7 @@ enum {
OPT_s = (1 << 8),
OPT_i = (1 << 9),
OPT_O = (1 << 10),
OPT_T = (1 << 11),
};
#if ENABLE_FEATURE_MTAB_SUPPORT
@ -2034,7 +2133,7 @@ int mount_main(int argc UNUSED_PARAM, char **argv)
char *O_optmatch = NULL;
char *storage_path;
llist_t *lst_o = NULL;
const char *fstabname;
const char *fstabname = "/etc/fstab";
FILE *fstab;
int i, j;
int rc = EXIT_SUCCESS;
@ -2061,6 +2160,7 @@ int mount_main(int argc UNUSED_PARAM, char **argv)
// Max 2 params; -o is a list, -v is a counter
opt_complementary = "?2o::" IF_FEATURE_MOUNT_VERBOSE("vv");
opt = getopt32(argv, OPTION_STR, &lst_o, &fstype, &O_optmatch
IF_FEATURE_MOUNT_OTHERTAB(, &fstabname)
IF_FEATURE_MOUNT_VERBOSE(, &verbose));
while (lst_o) append_mount_options(&cmdopts, llist_pop(&lst_o)); // -o
if (opt & OPT_r) append_mount_options(&cmdopts, "ro"); // -r
@ -2128,8 +2228,10 @@ int mount_main(int argc UNUSED_PARAM, char **argv)
return rc;
}
// A malicious user could overmount /usr without this.
if (ENABLE_FEATURE_MOUNT_OTHERTAB && nonroot)
fstabname = "/etc/fstab";
// Open either fstab or mtab
fstabname = "/etc/fstab";
if (cmdopt_flags & MS_REMOUNT) {
// WARNING. I am not sure this matches util-linux's
// behavior. It's possible util-linux does not