fsck_minix.c lost fat.
[oweals/busybox.git] / mount.c
diff --git a/mount.c b/mount.c
index c3e3bbd7542be5ae722e13db5654f2b98e4a870a..37f789d3c3b637a9d5651ea2487506bf9d758b4b 100644 (file)
--- a/mount.c
+++ b/mount.c
@@ -53,7 +53,7 @@
 #include <linux/loop.h>
 
 
-static int use_loop = 0;
+static int use_loop = FALSE;
 #endif
 
 extern const char mtab_file[]; /* Defined in utility.c */
@@ -114,13 +114,14 @@ do_mount(char *specialfile, char *dir, char *filesystemtype,
                 char *mtab_opts)
 {
        int status = 0;
+       char *lofile = NULL;
 
 #if defined BB_MTAB
        if (fakeIt == FALSE)
 #endif
        {
 #if defined BB_FEATURE_MOUNT_LOOP
-               if (use_loop) {
+               if (use_loop==TRUE) {
                        int loro = flags & MS_RDONLY;
                        char *lofile = specialfile;
 
@@ -137,6 +138,7 @@ do_mount(char *specialfile, char *dir, char *filesystemtype,
                                fprintf(stderr, "WARNING: loop device is read-only\n");
                                flags &= ~MS_RDONLY;
                        }
+                       use_loop = FALSE;
                }
 #endif
                status =
@@ -157,7 +159,7 @@ do_mount(char *specialfile, char *dir, char *filesystemtype,
 
        /* Bummer.  mount failed.  Clean up */
 #if defined BB_FEATURE_MOUNT_LOOP
-       if (specialfile != NULL) {
+       if (lofile != NULL) {
                del_loop(specialfile);
        }
 #endif
@@ -166,20 +168,6 @@ do_mount(char *specialfile, char *dir, char *filesystemtype,
 
 
 
-#if defined BB_MTAB
-#define whine_if_fstab_is_missing() {}
-#else
-extern void whine_if_fstab_is_missing()
-{
-       struct stat statBuf;
-
-       if (stat("/etc/fstab", &statBuf) < 0)
-               fprintf(stderr,
-                               "/etc/fstab file missing -- install one to name /dev/root.\n\n");
-}
-#endif
-
-
 /* Seperate standard mount options from the nonstandard string options */
 static void
 parse_mount_options(char *options, unsigned long *flags, char *strflags)
@@ -204,7 +192,7 @@ parse_mount_options(char *options, unsigned long *flags, char *strflags)
                }
 #if defined BB_FEATURE_MOUNT_LOOP
                if (gotone == FALSE && !strcasecmp("loop", options)) {  /* loop device support */
-                       use_loop = 1;
+                       use_loop = TRUE;
                        gotone = TRUE;
                }
 #endif
@@ -229,7 +217,7 @@ parse_mount_options(char *options, unsigned long *flags, char *strflags)
 int
 mount_one(char *blockDevice, char *directory, char *filesystemType,
                  unsigned long flags, char *string_flags, int useMtab, int fakeIt,
-                 char *mtab_opts)
+                 char *mtab_opts, int whineOnErrors)
 {
        int status = 0;
 
@@ -270,9 +258,11 @@ mount_one(char *blockDevice, char *directory, char *filesystemType,
                                                  fakeIt, mtab_opts);
        }
 
-       if (status == FALSE) {
-               fprintf(stderr, "Mounting %s on %s failed: %s\n",
-                               blockDevice, directory, strerror(errno));
+       if (status == FALSE && whineOnErrors == TRUE) {
+               if (whineOnErrors == TRUE) {
+                       fprintf(stderr, "Mounting %s on %s failed: %s\n",
+                                       blockDevice, directory, strerror(errno));
+               }
                return (FALSE);
        }
        return (TRUE);
@@ -387,18 +377,28 @@ extern int mount_main(int argc, char **argv)
                        exit(FALSE);
                }
                while ((m = getmntent(f)) != NULL) {
-                       // If the file system isn't noauto, and isn't mounted on /, 
+                       // If the file system isn't noauto, 
                        // and isn't swap or nfs, then mount it
                        if ((!strstr(m->mnt_opts, "noauto")) &&
-                               (m->mnt_dir[1] != '\0') &&
                                (!strstr(m->mnt_type, "swap")) &&
                                (!strstr(m->mnt_type, "nfs"))) {
                                flags = 0;
                                *string_flags = '\0';
                                parse_mount_options(m->mnt_opts, &flags, string_flags);
-                               mount_one(m->mnt_fsname, m->mnt_dir, m->mnt_type,
+                               /* If the directory is /, try to remount
+                                * with the options specified in fstab */
+                               if (m->mnt_dir[0] == '/' && m->mnt_dir[1] == '\0') {
+                                       flags |= MS_REMOUNT;
+                               }
+                               if (mount_one(m->mnt_fsname, m->mnt_dir, m->mnt_type,
                                                  flags, string_flags, useMtab, fakeIt,
-                                                 extra_opts);
+                                                 extra_opts, FALSE)) 
+                               {
+                                       /* Try again, but this time try a remount */
+                                       mount_one(m->mnt_fsname, m->mnt_dir, m->mnt_type,
+                                                         flags|MS_REMOUNT, string_flags, useMtab, fakeIt,
+                                                         extra_opts, TRUE);
+                               }
                        }
                }
                endmntent(f);
@@ -414,7 +414,7 @@ extern int mount_main(int argc, char **argv)
 #endif
                        exit(mount_one(device, directory, filesystemType,
                                                   flags, string_flags, useMtab, fakeIt,
-                                                  extra_opts));
+                                                  extra_opts, TRUE));
                } else {
                        goto goodbye;
                }