X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=util-linux%2Fumount.c;h=e749c5f0feceaab74676e8d183c6dbb863062978;hb=d0246fb72b40320a74376af1bb944fef2c9b734f;hp=625fcfab94d6813466ecff888afd91bbfeadfc08;hpb=b0e9a709ba1ae1724d413a77f5b67b1a3e6c6cb7;p=oweals%2Fbusybox.git diff --git a/util-linux/umount.c b/util-linux/umount.c index 625fcfab9..e749c5f0f 100644 --- a/util-linux/umount.c +++ b/util-linux/umount.c @@ -1,7 +1,9 @@ /* * Mini umount implementation for busybox * - * Copyright (C) 1998 by Erik Andersen + * + * Copyright (C) 1999 by Lineo, inc. + * Written by Erik Andersen , * * 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 @@ -26,25 +28,55 @@ #include #include -const char umount_usage[] = -"Usage: umount filesystem\n" -" or: umount directory\n" -" or: umount -a" -"to unmount all mounted file systems.\n"; +static const char umount_usage[] = +"Usage: umount [flags] filesystem|directory\n" +"Optional Flags:\n" +"\t-a:\tUnmount all file systems" +#ifdef BB_MTAB +" in /etc/mtab\n\t-n:\tDon't erase /etc/mtab entries\n" +#else +"\n" +#endif +; + + +static int useMtab = TRUE; +static int umountAll = FALSE; +extern const char mtab_file[]; /* Defined in utility.c */ + +#if ! defined BB_MTAB +#define do_umount( blockDevice, useMtab) umount( blockDevice) +#else +static int +do_umount(const char* name, int useMtab) +{ + int status = umount(name); + + if ( status == 0 ) { + if ( useMtab==TRUE ) + erase_mtab(name); + return 0; + } + else + return( status); +} +#endif static int -umount_all() +umount_all(int useMtab) { int status; struct mntent *m; FILE *mountTable; - if ((mountTable = setmntent ("/proc/mounts", "r"))) { + if ((mountTable = setmntent (mtab_file, "r"))) { while ((m = getmntent (mountTable)) != 0) { char *blockDevice = m->mnt_fsname; +#if ! defined BB_MTAB if (strcmp (blockDevice, "/dev/root") == 0) blockDevice = (getfsfile ("/"))->fs_spec; - status=umount (m->mnt_dir); +#endif + status=do_umount (m->mnt_dir, useMtab); if (status!=0) { /* Don't bother retrying the umount on busy devices */ if (errno==EBUSY) { @@ -54,7 +86,7 @@ umount_all() printf ("Trying to umount %s failed: %s\n", m->mnt_dir, strerror(errno)); printf ("Instead trying to umount %s\n", blockDevice); - status=umount (blockDevice); + status=do_umount (blockDevice, useMtab); if (status!=0) { printf ("Couldn't umount %s on %s (type %s): %s\n", blockDevice, m->mnt_dir, m->mnt_type, strerror(errno)); @@ -67,27 +99,35 @@ umount_all() } extern int -umount_main(int argc, char * * argv) +umount_main(int argc, char** argv) { if (argc < 2) { usage( umount_usage); } - argc--; - argv++; /* Parse any options */ - while (**argv == '-') { + while (argc-- > 0 && **(++argv) == '-') { while (*++(*argv)) switch (**argv) { case 'a': - exit ( umount_all() ); + umountAll = TRUE; + break; +#ifdef BB_MTAB + case 'n': + useMtab = FALSE; break; +#endif default: usage( umount_usage); } } - if ( umount(*argv) == 0 ) - exit (TRUE); + + + if(umountAll) { + exit(umount_all(useMtab)); + } + if ( do_umount(*argv,useMtab) == 0 ) + exit (TRUE); else { perror("umount"); exit( FALSE);