This incorporates Posix math support into ash. The Posix math support
[oweals/busybox.git] / mount.c
diff --git a/mount.c b/mount.c
index e511b798b9e78c89ca520d418c8bbb2ebd17dfdf..eb6091f30e3763dc7df780b6a820cb59f8ee04fc 100644 (file)
--- a/mount.c
+++ b/mount.c
@@ -70,6 +70,7 @@ enum {
        S_IMMUTABLE = 512,     /* Immutable file */
        MS_NOATIME = 1024,    /* Do not update access times. */
        MS_NODIRATIME = 2048,    /* Do not update directory access times */
+       MS_BIND = 4096,    /* Use the new linux 2.4.x "mount --bind" feature */
 };
 
 
@@ -112,13 +113,14 @@ static const struct mount_options mount_options[] = {
        {"rw", ~MS_RDONLY, 0},
        {"suid", ~MS_NOSUID, 0},
        {"sync", ~0, MS_SYNCHRONOUS},
+       {"bind", ~0, MS_BIND},
        {0, 0, 0}
 };
 
 static int
 do_mount(char *specialfile, char *dir, char *filesystemtype,
                 long flags, void *string_flags, int useMtab, int fakeIt,
-                char *mtab_opts)
+                char *mtab_opts, int mount_all)
 {
        int status = 0;
 #if defined BB_FEATURE_MOUNT_LOOP
@@ -142,15 +144,18 @@ do_mount(char *specialfile, char *dir, char *filesystemtype,
                        }
                        if (!(flags & MS_RDONLY) && loro) {     /* loop is ro, but wanted rw */
                                error_msg("WARNING: loop device is read-only");
-                               flags &= ~MS_RDONLY;
+                               flags |= MS_RDONLY;
                        }
                }
 #endif
                status = mount(specialfile, dir, filesystemtype, flags, string_flags);
-               if (errno == EROFS) {
+               if (status < 0 && errno == EROFS) {
                        error_msg("%s is write-protected, mounting read-only", specialfile);
                        status = mount(specialfile, dir, filesystemtype, flags |= MS_RDONLY, string_flags);
                }
+               /* Don't whine about already mounted filesystems when mounting all. */
+               if (status < 0 && errno == EBUSY && mount_all)
+                       return TRUE;
        }
 
 
@@ -228,10 +233,10 @@ parse_mount_options(char *options, int *flags, char *strflags)
        }
 }
 
-extern int
+static int
 mount_one(char *blockDevice, char *directory, char *filesystemType,
                  unsigned long flags, char *string_flags, int useMtab, int fakeIt,
-                 char *mtab_opts, int whineOnErrors)
+                 char *mtab_opts, int whineOnErrors, int mount_all)
 {
        int status = 0;
 
@@ -254,7 +259,7 @@ mount_one(char *blockDevice, char *directory, char *filesystemType,
                        if (!*noauto_fstype) {
                                status = do_mount(blockDevice, directory, filesystemType,
                                        flags | MS_MGC_VAL, string_flags,
-                                       useMtab, fakeIt, mtab_opts);
+                                       useMtab, fakeIt, mtab_opts, mount_all);
                                if (status == TRUE)
                                        break;
                        }
@@ -262,7 +267,7 @@ mount_one(char *blockDevice, char *directory, char *filesystemType,
        } else {
                status = do_mount(blockDevice, directory, filesystemType,
                                flags | MS_MGC_VAL, string_flags, useMtab,
-                               fakeIt, mtab_opts);
+                               fakeIt, mtab_opts, mount_all);
        }
 
        if (status == FALSE) {
@@ -319,10 +324,14 @@ void show_mounts()
                while ((m = getmntent(mountTable)) != 0) {
                        char *blockDevice = m->mnt_fsname;
                        if (strcmp(blockDevice, "/dev/root") == 0) {
-                               find_real_root_device_name( blockDevice);
+                               blockDevice = find_real_root_device_name(blockDevice);
                        }
                        printf("%s on %s type %s (%s)\n", blockDevice, m->mnt_dir,
                                   m->mnt_type, m->mnt_opts);
+#ifdef BB_FEATURE_CLEAN_UP
+                       if(blockDevice != m->mnt_fsname)
+                               free(blockDevice);
+#endif
                }
                endmntent(mountTable);
        } else {
@@ -385,8 +394,7 @@ extern int mount_main(int argc, char **argv)
 
        if (optind < argc) {
                /* if device is a filename get its real path */
-               if ((strchr(argv[optind], ':') == NULL) &&
-                       (stat(argv[optind], &statbuf) == 0)) {
+               if (stat(argv[optind], &statbuf) == 0) {
                        realpath(argv[optind], device);
                } else {
                        safe_strncpy(device, argv[optind], PATH_MAX);
@@ -445,7 +453,7 @@ singlemount:
                        }
 #endif
                        if (!mount_one(device, directory, filesystemType, flags,
-                                       string_flags, useMtab, fakeIt, extra_opts, TRUE))
+                                       string_flags, useMtab, fakeIt, extra_opts, TRUE, all))
                                rc = EXIT_FAILURE;
                                
                        if (all == FALSE)