aboutsummaryrefslogtreecommitdiff
path: root/util-linux/umount.c
diff options
context:
space:
mode:
Diffstat (limited to 'util-linux/umount.c')
-rw-r--r--util-linux/umount.c55
1 files changed, 28 insertions, 27 deletions
diff --git a/util-linux/umount.c b/util-linux/umount.c
index 14ff41588..8c0558466 100644
--- a/util-linux/umount.c
+++ b/util-linux/umount.c
@@ -21,15 +21,14 @@
21#include <getopt.h> 21#include <getopt.h>
22#include "busybox.h" 22#include "busybox.h"
23 23
24#define OPTION_STRING "flaDnrv" 24#define OPTION_STRING "flDnrva"
25#define OPT_FORCE 1 25#define OPT_FORCE 1
26#define OPT_LAZY 2 26#define OPT_LAZY 2
27#define OPT_ALL 4 27#define OPT_DONTFREELOOP 4
28#define OPT_DONTFREELOOP 8 28#define OPT_NO_MTAB 8
29#define OPT_NO_MTAB 16 29#define OPT_REMOUNT 16
30#define OPT_REMOUNT 32 30#define OPT_IGNORED 32 // -v is ignored
31/* -v is ignored */ 31#define OPT_ALL (ENABLE_FEATURE_UMOUNT_ALL ? 64 : 0)
32
33 32
34extern int umount_main(int argc, char **argv) 33extern int umount_main(int argc, char **argv)
35{ 34{
@@ -61,24 +60,25 @@ extern int umount_main(int argc, char **argv)
61 * umounts the most recent entries first. */ 60 * umounts the most recent entries first. */
62 61
63 m=mtl=0; 62 m=mtl=0;
64 if(!(fp = setmntent(bb_path_mtab_file, "r"))) 63 if(opt & OPT_ALL) {
65 bb_error_msg_and_die("Cannot open %s", bb_path_mtab_file); 64
66 while (getmntent_r(fp,&me,path,sizeof(path))) { 65 /* If we're umounting all, then m points to the start of the list and
67 m=xmalloc(sizeof(struct mtab_list)); 66 * the argument list should be empty (which will match all). */
68 m->next=mtl; 67
69 m->device=bb_xstrdup(me.mnt_fsname); 68 if(!(fp = setmntent(bb_path_mtab_file, "r")))
70 m->dir=bb_xstrdup(me.mnt_dir); 69 bb_error_msg_and_die("Cannot open %s", bb_path_mtab_file);
71 mtl=m; 70 while (getmntent_r(fp,&me,path,sizeof(path))) {
72 } 71 m=xmalloc(sizeof(struct mtab_list));
73 endmntent(fp); 72 m->next=mtl;
74 73 m->device=bb_xstrdup(me.mnt_fsname);
75 /* If we're umounting all, then m points to the start of the list and 74 m->dir=bb_xstrdup(me.mnt_dir);
76 * the argument list should be empty (which will match all). */ 75 mtl=m;
77 if(!(opt & OPT_ALL)) { 76 }
78 m=0; 77 endmntent(fp);
79 if(argc <= 0) bb_show_usage();
80 }
81 78
79 /* If we're not mounting all, we need at least one argument. */
80 } else if(argc <= 0) bb_show_usage();
81
82 // Loop through everything we're supposed to umount, and do so. 82 // Loop through everything we're supposed to umount, and do so.
83 for(;;) { 83 for(;;) {
84 int curstat; 84 int curstat;
@@ -92,9 +92,10 @@ extern int umount_main(int argc, char **argv)
92 else { 92 else {
93 // Get next command line argument (and look it up in mtab list) 93 // Get next command line argument (and look it up in mtab list)
94 realpath(*argv++, path); 94 realpath(*argv++, path);
95 for(m = mtl; m; m = m->next) 95 if (ENABLE_FEATURE_MTAB_SUPPORT)
96 if(!strcmp(path, m->dir) || !strcmp(path, m->device)) 96 for(m = mtl; m; m = m->next)
97 break; 97 if(!strcmp(path, m->dir) || !strcmp(path, m->device))
98 break;
98 } 99 }
99 100
100 // Let's ask the thing nicely to unmount. 101 // Let's ask the thing nicely to unmount.