blob: a83a508f7c6d00965a1485dd32953c136b3cb356 [file] [log] [blame]
Eric Andersenf811e071999-10-09 00:25:00 +00001/*
2 * Mini umount implementation for busybox
3 *
4 * Copyright (C) 1998 by Erik Andersen <andersee@debian.org>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 *
20 */
21
Eric Andersencc8ed391999-10-05 16:24:54 +000022#include "internal.h"
Eric Andersencc8ed391999-10-05 16:24:54 +000023#include <stdio.h>
Eric Andersencc8ed391999-10-05 16:24:54 +000024#include <sys/mount.h>
Eric Andersenf811e071999-10-09 00:25:00 +000025#include <mntent.h>
26#include <fstab.h>
27#include <errno.h>
Eric Andersencc8ed391999-10-05 16:24:54 +000028
Eric Andersenbed30e91999-10-18 19:02:32 +000029const char umount_usage[] =
30"Usage: umount filesystem\n"
31" or: umount directory\n"
32" or: umount -a"
33"to unmount all mounted file systems.\n";
Eric Andersencc8ed391999-10-05 16:24:54 +000034
35static int
Eric Andersenf811e071999-10-09 00:25:00 +000036umount_all()
Eric Andersencc8ed391999-10-05 16:24:54 +000037{
Eric Andersenf811e071999-10-09 00:25:00 +000038 int status;
39 struct mntent *m;
40 FILE *mountTable;
Eric Andersencc8ed391999-10-05 16:24:54 +000041
Eric Andersenf811e071999-10-09 00:25:00 +000042 if ((mountTable = setmntent ("/proc/mounts", "r"))) {
43 while ((m = getmntent (mountTable)) != 0) {
44 char *blockDevice = m->mnt_fsname;
45 if (strcmp (blockDevice, "/dev/root") == 0)
46 blockDevice = (getfsfile ("/"))->fs_spec;
47 status=umount (m->mnt_dir);
48 if (status!=0) {
49 /* Don't bother retrying the umount on busy devices */
50 if (errno==EBUSY) {
51 perror(m->mnt_dir);
52 continue;
53 }
54 printf ("Trying to umount %s failed: %s\n",
55 m->mnt_dir, strerror(errno));
56 printf ("Instead trying to umount %s\n", blockDevice);
57 status=umount (blockDevice);
58 if (status!=0) {
59 printf ("Couldn't umount %s on %s (type %s): %s\n",
60 blockDevice, m->mnt_dir, m->mnt_type, strerror(errno));
61 }
Eric Andersencc8ed391999-10-05 16:24:54 +000062 }
Eric Andersenf811e071999-10-09 00:25:00 +000063 }
64 endmntent (mountTable);
65 }
66 return( TRUE);
Eric Andersencc8ed391999-10-05 16:24:54 +000067}
68
69extern int
Eric Andersenf811e071999-10-09 00:25:00 +000070umount_main(int argc, char * * argv)
Eric Andersencc8ed391999-10-05 16:24:54 +000071{
Eric Andersenf811e071999-10-09 00:25:00 +000072
73 if (argc < 2) {
74 fprintf(stderr, "Usage: %s", umount_usage);
Eric Andersen3c163821999-10-14 22:16:57 +000075 exit(FALSE);
Eric Andersenf811e071999-10-09 00:25:00 +000076 }
77 argc--;
78 argv++;
79
80 /* Parse any options */
81 while (**argv == '-') {
82 while (*++(*argv)) switch (**argv) {
83 case 'a':
Eric Andersen3c163821999-10-14 22:16:57 +000084 exit ( umount_all() );
Eric Andersenf811e071999-10-09 00:25:00 +000085 break;
86 default:
87 fprintf(stderr, "Usage: %s\n", umount_usage);
88 exit( FALSE);
Eric Andersencc8ed391999-10-05 16:24:54 +000089 }
Eric Andersenf811e071999-10-09 00:25:00 +000090 }
91 if ( umount(*argv) == 0 )
Eric Andersen3c163821999-10-14 22:16:57 +000092 exit (TRUE);
Eric Andersenf811e071999-10-09 00:25:00 +000093 else {
94 perror("umount");
Eric Andersen3c163821999-10-14 22:16:57 +000095 exit( FALSE);
Eric Andersenf811e071999-10-09 00:25:00 +000096 }
Eric Andersencc8ed391999-10-05 16:24:54 +000097}
98