diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-02-16 23:28:42 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-02-16 23:28:42 +0000 |
| commit | b1d8e7db0fced98ba2cd049019f8820fd91a0482 (patch) | |
| tree | f57502cb47f3036e742e34609a3f485197b3fd73 | |
| parent | 25591c322c9305bd54d3ab80cfaf01ef87640d77 (diff) | |
| download | busybox-w32-b1d8e7db0fced98ba2cd049019f8820fd91a0482.tar.gz busybox-w32-b1d8e7db0fced98ba2cd049019f8820fd91a0482.tar.bz2 busybox-w32-b1d8e7db0fced98ba2cd049019f8820fd91a0482.zip | |
mount: make -f work even without mtab support
(Cristian Ionescu-Idbohrn <cristian.ionescu-idbohrn at axis.com>)
| -rw-r--r-- | include/usage.h | 4 | ||||
| -rw-r--r-- | scripts/defconfig | 1 | ||||
| -rw-r--r-- | util-linux/Config.in | 8 | ||||
| -rw-r--r-- | util-linux/mount.c | 54 |
4 files changed, 46 insertions, 21 deletions
diff --git a/include/usage.h b/include/usage.h index 59e57f3a0..04ef1822e 100644 --- a/include/usage.h +++ b/include/usage.h | |||
| @@ -2449,8 +2449,10 @@ USE_FEATURE_BRCTL_FANCY("\n" \ | |||
| 2449 | "Mount a filesystem. Filesystem autodetection requires /proc be mounted." \ | 2449 | "Mount a filesystem. Filesystem autodetection requires /proc be mounted." \ |
| 2450 | "\n\nOptions:\n" \ | 2450 | "\n\nOptions:\n" \ |
| 2451 | " -a Mount all filesystems in fstab\n" \ | 2451 | " -a Mount all filesystems in fstab\n" \ |
| 2452 | USE_FEATURE_MOUNT_FAKE( \ | ||
| 2453 | " -f "USE_FEATURE_MTAB_SUPPORT("Update /etc/mtab, but ")"don't mount\n" \ | ||
| 2454 | ) \ | ||
| 2452 | USE_FEATURE_MTAB_SUPPORT( \ | 2455 | USE_FEATURE_MTAB_SUPPORT( \ |
| 2453 | " -f Update /etc/mtab, but don't mount\n" \ | ||
| 2454 | " -n Don't update /etc/mtab\n" \ | 2456 | " -n Don't update /etc/mtab\n" \ |
| 2455 | ) \ | 2457 | ) \ |
| 2456 | " -r Read-only mount\n" \ | 2458 | " -r Read-only mount\n" \ |
diff --git a/scripts/defconfig b/scripts/defconfig index 31a172c56..87bc6bd7e 100644 --- a/scripts/defconfig +++ b/scripts/defconfig | |||
| @@ -478,6 +478,7 @@ CONFIG_MOUNT=y | |||
| 478 | # CONFIG_FEATURE_MOUNT_HELPERS is not set | 478 | # CONFIG_FEATURE_MOUNT_HELPERS is not set |
| 479 | CONFIG_FEATURE_MOUNT_NFS=y | 479 | CONFIG_FEATURE_MOUNT_NFS=y |
| 480 | CONFIG_FEATURE_MOUNT_CIFS=y | 480 | CONFIG_FEATURE_MOUNT_CIFS=y |
| 481 | CONFIG_FEATURE_MOUNT_FAKE=y | ||
| 481 | CONFIG_FEATURE_MOUNT_FLAGS=y | 482 | CONFIG_FEATURE_MOUNT_FLAGS=y |
| 482 | CONFIG_FEATURE_MOUNT_FSTAB=y | 483 | CONFIG_FEATURE_MOUNT_FSTAB=y |
| 483 | CONFIG_PIVOT_ROOT=y | 484 | CONFIG_PIVOT_ROOT=y |
diff --git a/util-linux/Config.in b/util-linux/Config.in index d1688e8c9..5a47318fe 100644 --- a/util-linux/Config.in +++ b/util-linux/Config.in | |||
| @@ -386,6 +386,13 @@ config MOUNT | |||
| 386 | NFS filesystems. Most people using BusyBox will also want to enable | 386 | NFS filesystems. Most people using BusyBox will also want to enable |
| 387 | the 'mount' utility. | 387 | the 'mount' utility. |
| 388 | 388 | ||
| 389 | config FEATURE_MOUNT_FAKE | ||
| 390 | bool "mount -f option" | ||
| 391 | default n | ||
| 392 | depends on MOUNT | ||
| 393 | help | ||
| 394 | Enable support for faking a file system mount. | ||
| 395 | |||
| 389 | config FEATURE_MOUNT_HELPERS | 396 | config FEATURE_MOUNT_HELPERS |
| 390 | bool "Support mount helpers" | 397 | bool "Support mount helpers" |
| 391 | default n | 398 | default n |
| @@ -542,6 +549,7 @@ config FEATURE_MTAB_SUPPORT | |||
| 542 | bool "Support for the old /etc/mtab file" | 549 | bool "Support for the old /etc/mtab file" |
| 543 | default n | 550 | default n |
| 544 | depends on MOUNT || UMOUNT | 551 | depends on MOUNT || UMOUNT |
| 552 | select FEATURE_MOUNT_FAKE | ||
| 545 | help | 553 | help |
| 546 | Historically, Unix systems kept track of the currently mounted | 554 | Historically, Unix systems kept track of the currently mounted |
| 547 | partitions in the file "/etc/mtab". These days, the kernel exports | 555 | partitions in the file "/etc/mtab". These days, the kernel exports |
diff --git a/util-linux/mount.c b/util-linux/mount.c index 5e6c3ba72..dd753235e 100644 --- a/util-linux/mount.c +++ b/util-linux/mount.c | |||
| @@ -54,6 +54,35 @@ enum { | |||
| 54 | MOUNT_NOAUTO = (1<<29), | 54 | MOUNT_NOAUTO = (1<<29), |
| 55 | MOUNT_SWAP = (1<<30), | 55 | MOUNT_SWAP = (1<<30), |
| 56 | }; | 56 | }; |
| 57 | |||
| 58 | |||
| 59 | #define OPTION_STR "o:t:rwanfvsi" | ||
| 60 | enum { | ||
| 61 | OPT_o = (1 << 0), | ||
| 62 | OPT_t = (1 << 1), | ||
| 63 | OPT_r = (1 << 2), | ||
| 64 | OPT_w = (1 << 3), | ||
| 65 | OPT_a = (1 << 4), | ||
| 66 | OPT_n = (1 << 5), | ||
| 67 | OPT_f = (1 << 6), | ||
| 68 | OPT_v = (1 << 7), | ||
| 69 | OPT_s = (1 << 8), | ||
| 70 | OPT_i = (1 << 9), | ||
| 71 | }; | ||
| 72 | |||
| 73 | #if ENABLE_FEATURE_MTAB_SUPPORT | ||
| 74 | #define useMtab (!(option_mask32 & OPT_n)) | ||
| 75 | #else | ||
| 76 | #define useMtab 0 | ||
| 77 | #endif | ||
| 78 | |||
| 79 | #if ENABLE_FEATURE_MOUNT_FAKE | ||
| 80 | #define fakeIt (option_mask32 & OPT_f) | ||
| 81 | #else | ||
| 82 | #define fakeIt 0 | ||
| 83 | #endif | ||
| 84 | |||
| 85 | |||
| 57 | // TODO: more "user" flag compatibility. | 86 | // TODO: more "user" flag compatibility. |
| 58 | // "user" option (from mount manpage): | 87 | // "user" option (from mount manpage): |
| 59 | // Only the user that mounted a filesystem can unmount it again. | 88 | // Only the user that mounted a filesystem can unmount it again. |
| @@ -288,14 +317,6 @@ static void delete_block_backed_filesystems(void) | |||
| 288 | void delete_block_backed_filesystems(void); | 317 | void delete_block_backed_filesystems(void); |
| 289 | #endif | 318 | #endif |
| 290 | 319 | ||
| 291 | #if ENABLE_FEATURE_MTAB_SUPPORT | ||
| 292 | static int useMtab = 1; | ||
| 293 | static int fakeIt; | ||
| 294 | #else | ||
| 295 | #define useMtab 0 | ||
| 296 | #define fakeIt 0 | ||
| 297 | #endif | ||
| 298 | |||
| 299 | // Perform actual mount of specific filesystem at specific location. | 320 | // Perform actual mount of specific filesystem at specific location. |
| 300 | // NB: mp->xxx fields may be trashed on exit | 321 | // NB: mp->xxx fields may be trashed on exit |
| 301 | static int mount_it_now(struct mntent *mp, int vfsflags, char *filteropts) | 322 | 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) | |||
| 346 | /* If the mount was successful, and we're maintaining an old-style | 367 | /* If the mount was successful, and we're maintaining an old-style |
| 347 | * mtab file by hand, add the new entry to it now. */ | 368 | * mtab file by hand, add the new entry to it now. */ |
| 348 | mtab: | 369 | mtab: |
| 349 | if (ENABLE_FEATURE_MTAB_SUPPORT && useMtab && !rc && !(vfsflags & MS_REMOUNT)) { | 370 | if (useMtab && !rc && !(vfsflags & MS_REMOUNT)) { |
| 350 | char *fsname; | 371 | char *fsname; |
| 351 | FILE *mountTable = setmntent(bb_path_mtab_file, "a+"); | 372 | FILE *mountTable = setmntent(bb_path_mtab_file, "a+"); |
| 352 | const char *option_str = mount_option_str; | 373 | const char *option_str = mount_option_str; |
| @@ -1657,17 +1678,10 @@ int mount_main(int argc, char **argv) | |||
| 1657 | 1678 | ||
| 1658 | // Parse remaining options | 1679 | // Parse remaining options |
| 1659 | 1680 | ||
| 1660 | opt = getopt32(argv, "o:t:rwanfvsi", &opt_o, &fstype); | 1681 | opt = getopt32(argv, OPTION_STR, &opt_o, &fstype); |
| 1661 | if (opt & 0x1) append_mount_options(&cmdopts, opt_o); // -o | 1682 | if (opt & OPT_o) append_mount_options(&cmdopts, opt_o); // -o |
| 1662 | //if (opt & 0x2) // -t | 1683 | if (opt & OPT_r) append_mount_options(&cmdopts, "ro"); // -r |
| 1663 | if (opt & 0x4) append_mount_options(&cmdopts, "ro"); // -r | 1684 | if (opt & OPT_w) append_mount_options(&cmdopts, "rw"); // -w |
| 1664 | if (opt & 0x8) append_mount_options(&cmdopts, "rw"); // -w | ||
| 1665 | //if (opt & 0x10) // -a | ||
| 1666 | if (opt & 0x20) USE_FEATURE_MTAB_SUPPORT(useMtab = 0); // -n | ||
| 1667 | if (opt & 0x40) USE_FEATURE_MTAB_SUPPORT(fakeIt = 1); // -f | ||
| 1668 | //if (opt & 0x80) // -v: verbose (ignore) | ||
| 1669 | //if (opt & 0x100) // -s: sloppy (ignore) | ||
| 1670 | //if (opt & 0x200) // -i: don't call mount.<fstype> (ignore) | ||
| 1671 | argv += optind; | 1685 | argv += optind; |
| 1672 | argc -= optind; | 1686 | argc -= optind; |
| 1673 | 1687 | ||
