Ahem: add new faq entry to list at top of FAQ.html
[oweals/busybox.git] / util-linux / umount.c
index 99db3084cf1d15ef7394e8ff28b14da2d1a72c27..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)
@@ -158,10 +158,8 @@ static void mtab_free(void)
        this = mtab_cache;
        while (this) {
                next = this->next;
-               if (this->device)
-                       free(this->device);
-               if (this->mountpt)
-                       free(this->mountpt);
+               free(this->device);
+               free(this->mountpt);
                free(this);
                this = next;
        }
@@ -179,30 +177,30 @@ static int do_umount(const char *name)
        status = umount(name);
 
 #if defined CONFIG_FEATURE_MOUNT_LOOP
-       if (freeLoop == TRUE && blockDevice != NULL && !strncmp("/dev/loop", blockDevice, 9))
+       if (freeLoop && blockDevice != NULL && !strncmp("/dev/loop", blockDevice, 9))
                /* this was a loop device, delete it */
                del_loop(blockDevice);
 #endif
 #if defined CONFIG_FEATURE_MOUNT_FORCE
-       if (status != 0 && doForce == TRUE) {
+       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
-       if (status != 0 && doRemount == TRUE && errno == EBUSY) {
+       if (status != 0 && doRemount && errno == EBUSY) {
                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) {
 #if defined CONFIG_FEATURE_MTAB_SUPPORT
-               if (useMtab == TRUE)
+               if (useMtab)
                        erase_mtab(name);
 #endif
                return (TRUE);
@@ -223,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;
                        }
@@ -240,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);
@@ -277,21 +275,24 @@ extern int umount_main(int argc, char **argv)
                        case 'v':
                                break; /* ignore -v */
                        default:
-                               show_usage();
+                               bb_show_usage();
                        }
        }
 
        mtab_read();
-       if (umountAll == TRUE) {
-               if (umount_all() == TRUE)
+       if (umountAll) {
+               if (umount_all())
                        return EXIT_SUCCESS;
                else
                        return EXIT_FAILURE;
        }
-       if (realpath(*argv, path) == NULL)
-               perror_msg_and_die("%s", path);
-       if (do_umount(path) == TRUE)
-               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;
+}