Ahem: add new faq entry to list at top of FAQ.html
[oweals/busybox.git] / util-linux / umount.c
index 391d245a8e01472981933efa48d8541b488f3115..21c2e6e4d422d84775bcd3db1298c6409f9505a8 100644 (file)
@@ -2,8 +2,7 @@
 /*
  * Mini umount implementation for busybox
  *
- * Copyright (C) 1999,2000 by Lineo, inc. and Erik Andersen
- * Copyright (C) 1999,2000,2001 by Erik Andersen <andersee@debian.org>
+ * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,7 +28,7 @@
 #include <stdlib.h>
 #include "busybox.h"
 
-/* Teach libc5 about realpath -- it includes it but the 
+/* Teach libc5 about realpath -- it includes it but the
  * prototype is missing... */
 #if (__GLIBC__ <= 2) && (__GLIBC_MINOR__ < 1)
 extern char *realpath(const char *path, char *resolved_path);
@@ -67,7 +66,6 @@ static int useMtab = TRUE;
 #endif
 static int umountAll = FALSE;
 static int doRemount = FALSE;
-extern const char mtab_file[]; /* Defined in utility.c */
 
 
 
@@ -87,8 +85,8 @@ static void mtab_read(void)
        if (mtab_cache != NULL)
                return;
 
-       if ((fp = setmntent(mtab_file, "r")) == NULL) {
-               error_msg("Cannot open %s", mtab_file);
+       if ((fp = setmntent(bb_path_mtab_file, "r")) == NULL) {
+               bb_error_msg("Cannot open %s", bb_path_mtab_file);
                return;
        }
        while ((e = getmntent(fp))) {
@@ -112,10 +110,12 @@ static char *mtab_getinfo(const char *match, const char which)
                                return cur->mountpt;
                        } else {
 #if !defined CONFIG_FEATURE_MTAB_SUPPORT
-                               if (strcmp(cur->device, "/dev/root") == 0) {
+                               if (strcmp(cur->device, "rootfs") == 0) {
+                                       continue;
+                               } else if (strcmp(cur->device, "/dev/root") == 0) {
                                        /* Adjusts device to be the real root device,
                                         * or leaves device alone if it can't find it */
-                                       cur->device = find_real_root_device_name(cur->device);
+                                       cur->device = find_real_root_device_name();
                                }
 #endif
                                return cur->device;
@@ -148,7 +148,7 @@ static char *mtab_first(void **iter)
        return mtab_next(iter);
 }
 
-/* Don't bother to clean up, since exit() does that 
+/* Don't bother to clean up, since exit() does that
  * automagically, so we can save a few bytes */
 #ifdef CONFIG_FEATURE_CLEAN_UP
 static void mtab_free(void)
@@ -185,7 +185,7 @@ static int do_umount(const char *name)
        if (status != 0 && doForce) {
                status = umount2(blockDevice, MNT_FORCE);
                if (status != 0) {
-                       error_msg_and_die("forced umount of %s failed!", blockDevice);
+                       bb_error_msg_and_die("forced umount of %s failed!", blockDevice);
                }
        }
 #endif
@@ -193,9 +193,9 @@ static int do_umount(const char *name)
                status = mount(blockDevice, name, NULL,
                                           MS_MGC_VAL | MS_REMOUNT | MS_RDONLY, NULL);
                if (status == 0) {
-                       error_msg("%s busy - remounted read-only", blockDevice);
+                       bb_error_msg("%s busy - remounted read-only", blockDevice);
                } else {
-                       error_msg("Cannot remount %s read-only", blockDevice);
+                       bb_error_msg("Cannot remount %s read-only", blockDevice);
                }
        }
        if (status == 0) {
@@ -221,7 +221,7 @@ static int umount_all(void)
                if (!do_umount(mountpt)) {
                        /* Don't bother retrying the umount on busy devices */
                        if (errno == EBUSY) {
-                               perror_msg("%s", mountpt);
+                               bb_perror_msg("%s", mountpt);
                                status = FALSE;
                                continue;
                        }
@@ -238,10 +238,10 @@ static int umount_all(void)
 
 extern int umount_main(int argc, char **argv)
 {
-       char path[PATH_MAX];
+       char path[PATH_MAX], result = 0;
 
        if (argc < 2) {
-               show_usage();
+               bb_show_usage();
        }
 #ifdef CONFIG_FEATURE_CLEAN_UP
        atexit(mtab_free);
@@ -275,7 +275,7 @@ extern int umount_main(int argc, char **argv)
                        case 'v':
                                break; /* ignore -v */
                        default:
-                               show_usage();
+                               bb_show_usage();
                        }
        }
 
@@ -286,10 +286,13 @@ extern int umount_main(int argc, char **argv)
                else
                        return EXIT_FAILURE;
        }
-       if (realpath(*argv, path) == NULL)
-               perror_msg_and_die("%s", path);
-       if (do_umount(path))
-               return EXIT_SUCCESS;
-       perror_msg_and_die("%s", *argv);
-}
 
+       do {
+               if (realpath(*argv, path) != NULL)
+                       if (do_umount(path))
+                               continue;
+               bb_perror_msg("%s", path);
+               result++;
+       } while (--argc > 0 && ++argv);
+       return result;
+}