mount: make -f work even without mtab support

(Cristian Ionescu-Idbohrn <cristian.ionescu-idbohrn at axis.com>)
This commit is contained in:
Denis Vlasenko 2008-02-16 23:28:42 +00:00
parent 25591c322c
commit b1d8e7db0f
4 changed files with 46 additions and 21 deletions

View File

@ -2449,8 +2449,10 @@ USE_FEATURE_BRCTL_FANCY("\n" \
"Mount a filesystem. Filesystem autodetection requires /proc be mounted." \ "Mount a filesystem. Filesystem autodetection requires /proc be mounted." \
"\n\nOptions:\n" \ "\n\nOptions:\n" \
" -a Mount all filesystems in fstab\n" \ " -a Mount all filesystems in fstab\n" \
USE_FEATURE_MOUNT_FAKE( \
" -f "USE_FEATURE_MTAB_SUPPORT("Update /etc/mtab, but ")"don't mount\n" \
) \
USE_FEATURE_MTAB_SUPPORT( \ USE_FEATURE_MTAB_SUPPORT( \
" -f Update /etc/mtab, but don't mount\n" \
" -n Don't update /etc/mtab\n" \ " -n Don't update /etc/mtab\n" \
) \ ) \
" -r Read-only mount\n" \ " -r Read-only mount\n" \

View File

@ -478,6 +478,7 @@ CONFIG_MOUNT=y
# CONFIG_FEATURE_MOUNT_HELPERS is not set # CONFIG_FEATURE_MOUNT_HELPERS is not set
CONFIG_FEATURE_MOUNT_NFS=y CONFIG_FEATURE_MOUNT_NFS=y
CONFIG_FEATURE_MOUNT_CIFS=y CONFIG_FEATURE_MOUNT_CIFS=y
CONFIG_FEATURE_MOUNT_FAKE=y
CONFIG_FEATURE_MOUNT_FLAGS=y CONFIG_FEATURE_MOUNT_FLAGS=y
CONFIG_FEATURE_MOUNT_FSTAB=y CONFIG_FEATURE_MOUNT_FSTAB=y
CONFIG_PIVOT_ROOT=y CONFIG_PIVOT_ROOT=y

View File

@ -386,6 +386,13 @@ config MOUNT
NFS filesystems. Most people using BusyBox will also want to enable NFS filesystems. Most people using BusyBox will also want to enable
the 'mount' utility. the 'mount' utility.
config FEATURE_MOUNT_FAKE
bool "mount -f option"
default n
depends on MOUNT
help
Enable support for faking a file system mount.
config FEATURE_MOUNT_HELPERS config FEATURE_MOUNT_HELPERS
bool "Support mount helpers" bool "Support mount helpers"
default n default n
@ -542,6 +549,7 @@ config FEATURE_MTAB_SUPPORT
bool "Support for the old /etc/mtab file" bool "Support for the old /etc/mtab file"
default n default n
depends on MOUNT || UMOUNT depends on MOUNT || UMOUNT
select FEATURE_MOUNT_FAKE
help help
Historically, Unix systems kept track of the currently mounted Historically, Unix systems kept track of the currently mounted
partitions in the file "/etc/mtab". These days, the kernel exports partitions in the file "/etc/mtab". These days, the kernel exports

View File

@ -54,6 +54,35 @@ enum {
MOUNT_NOAUTO = (1<<29), MOUNT_NOAUTO = (1<<29),
MOUNT_SWAP = (1<<30), MOUNT_SWAP = (1<<30),
}; };
#define OPTION_STR "o:t:rwanfvsi"
enum {
OPT_o = (1 << 0),
OPT_t = (1 << 1),
OPT_r = (1 << 2),
OPT_w = (1 << 3),
OPT_a = (1 << 4),
OPT_n = (1 << 5),
OPT_f = (1 << 6),
OPT_v = (1 << 7),
OPT_s = (1 << 8),
OPT_i = (1 << 9),
};
#if ENABLE_FEATURE_MTAB_SUPPORT
#define useMtab (!(option_mask32 & OPT_n))
#else
#define useMtab 0
#endif
#if ENABLE_FEATURE_MOUNT_FAKE
#define fakeIt (option_mask32 & OPT_f)
#else
#define fakeIt 0
#endif
// TODO: more "user" flag compatibility. // TODO: more "user" flag compatibility.
// "user" option (from mount manpage): // "user" option (from mount manpage):
// Only the user that mounted a filesystem can unmount it again. // Only the user that mounted a filesystem can unmount it again.
@ -288,14 +317,6 @@ static void delete_block_backed_filesystems(void)
void delete_block_backed_filesystems(void); void delete_block_backed_filesystems(void);
#endif #endif
#if ENABLE_FEATURE_MTAB_SUPPORT
static int useMtab = 1;
static int fakeIt;
#else
#define useMtab 0
#define fakeIt 0
#endif
// Perform actual mount of specific filesystem at specific location. // Perform actual mount of specific filesystem at specific location.
// NB: mp->xxx fields may be trashed on exit // NB: mp->xxx fields may be trashed on exit
static int mount_it_now(struct mntent *mp, int vfsflags, char *filteropts) static int mount_it_now(struct mntent *mp, int vfsflags, char *filteropts)
@ -346,7 +367,7 @@ static int mount_it_now(struct mntent *mp, int vfsflags, char *filteropts)
/* If the mount was successful, and we're maintaining an old-style /* If the mount was successful, and we're maintaining an old-style
* mtab file by hand, add the new entry to it now. */ * mtab file by hand, add the new entry to it now. */
mtab: mtab:
if (ENABLE_FEATURE_MTAB_SUPPORT && useMtab && !rc && !(vfsflags & MS_REMOUNT)) { if (useMtab && !rc && !(vfsflags & MS_REMOUNT)) {
char *fsname; char *fsname;
FILE *mountTable = setmntent(bb_path_mtab_file, "a+"); FILE *mountTable = setmntent(bb_path_mtab_file, "a+");
const char *option_str = mount_option_str; const char *option_str = mount_option_str;
@ -1657,17 +1678,10 @@ int mount_main(int argc, char **argv)
// Parse remaining options // Parse remaining options
opt = getopt32(argv, "o:t:rwanfvsi", &opt_o, &fstype); opt = getopt32(argv, OPTION_STR, &opt_o, &fstype);
if (opt & 0x1) append_mount_options(&cmdopts, opt_o); // -o if (opt & OPT_o) append_mount_options(&cmdopts, opt_o); // -o
//if (opt & 0x2) // -t if (opt & OPT_r) append_mount_options(&cmdopts, "ro"); // -r
if (opt & 0x4) append_mount_options(&cmdopts, "ro"); // -r if (opt & OPT_w) append_mount_options(&cmdopts, "rw"); // -w
if (opt & 0x8) append_mount_options(&cmdopts, "rw"); // -w
//if (opt & 0x10) // -a
if (opt & 0x20) USE_FEATURE_MTAB_SUPPORT(useMtab = 0); // -n
if (opt & 0x40) USE_FEATURE_MTAB_SUPPORT(fakeIt = 1); // -f
//if (opt & 0x80) // -v: verbose (ignore)
//if (opt & 0x100) // -s: sloppy (ignore)
//if (opt & 0x200) // -i: don't call mount.<fstype> (ignore)
argv += optind; argv += optind;
argc -= optind; argc -= optind;