blob: 5274e2f6fc84de40a3aafba75f8402600f03bc48 [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 Andersenf811e071999-10-09 00:25:00 +000029const char umount_usage[] = "\tumount {filesystem|directory}\n"
30"or to unmount all mounted file systems:\n\tumount -a\n";
Eric Andersencc8ed391999-10-05 16:24:54 +000031
32static int
Eric Andersenf811e071999-10-09 00:25:00 +000033umount_all()
Eric Andersencc8ed391999-10-05 16:24:54 +000034{
Eric Andersenf811e071999-10-09 00:25:00 +000035 int status;
36 struct mntent *m;
37 FILE *mountTable;
Eric Andersencc8ed391999-10-05 16:24:54 +000038
Eric Andersenf811e071999-10-09 00:25:00 +000039 if ((mountTable = setmntent ("/proc/mounts", "r"))) {
40 while ((m = getmntent (mountTable)) != 0) {
41 char *blockDevice = m->mnt_fsname;
42 if (strcmp (blockDevice, "/dev/root") == 0)
43 blockDevice = (getfsfile ("/"))->fs_spec;
44 status=umount (m->mnt_dir);
45 if (status!=0) {
46 /* Don't bother retrying the umount on busy devices */
47 if (errno==EBUSY) {
48 perror(m->mnt_dir);
49 continue;
50 }
51 printf ("Trying to umount %s failed: %s\n",
52 m->mnt_dir, strerror(errno));
53 printf ("Instead trying to umount %s\n", blockDevice);
54 status=umount (blockDevice);
55 if (status!=0) {
56 printf ("Couldn't umount %s on %s (type %s): %s\n",
57 blockDevice, m->mnt_dir, m->mnt_type, strerror(errno));
58 }
Eric Andersencc8ed391999-10-05 16:24:54 +000059 }
Eric Andersenf811e071999-10-09 00:25:00 +000060 }
61 endmntent (mountTable);
62 }
63 return( TRUE);
Eric Andersencc8ed391999-10-05 16:24:54 +000064}
65
66extern int
Eric Andersenf811e071999-10-09 00:25:00 +000067umount_main(int argc, char * * argv)
Eric Andersencc8ed391999-10-05 16:24:54 +000068{
Eric Andersenf811e071999-10-09 00:25:00 +000069
70 if (argc < 2) {
71 fprintf(stderr, "Usage: %s", umount_usage);
72 return(FALSE);
73 }
74 argc--;
75 argv++;
76
77 /* Parse any options */
78 while (**argv == '-') {
79 while (*++(*argv)) switch (**argv) {
80 case 'a':
81 return umount_all();
82 break;
83 default:
84 fprintf(stderr, "Usage: %s\n", umount_usage);
85 exit( FALSE);
Eric Andersencc8ed391999-10-05 16:24:54 +000086 }
Eric Andersenf811e071999-10-09 00:25:00 +000087 }
88 if ( umount(*argv) == 0 )
89 return (TRUE);
90 else {
91 perror("umount");
92 return( FALSE);
93 }
Eric Andersencc8ed391999-10-05 16:24:54 +000094}
95