aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--util-linux/umount.c73
1 files changed, 38 insertions, 35 deletions
diff --git a/util-linux/umount.c b/util-linux/umount.c
index 71ddbd4ed..7efb636db 100644
--- a/util-linux/umount.c
+++ b/util-linux/umount.c
@@ -21,7 +21,7 @@
21#include <getopt.h> 21#include <getopt.h>
22#include "busybox.h" 22#include "busybox.h"
23 23
24#define OPTION_STRING "flDnrva" 24#define OPTION_STRING "flDnrvad"
25#define OPT_FORCE 1 25#define OPT_FORCE 1
26#define OPT_LAZY 2 26#define OPT_LAZY 2
27#define OPT_DONTFREELOOP 4 27#define OPT_DONTFREELOOP 4
@@ -36,7 +36,7 @@ int umount_main(int argc, char **argv)
36 char path[2*PATH_MAX]; 36 char path[2*PATH_MAX];
37 struct mntent me; 37 struct mntent me;
38 FILE *fp; 38 FILE *fp;
39 int status=EXIT_SUCCESS; 39 int status = EXIT_SUCCESS;
40 unsigned long opt; 40 unsigned long opt;
41 struct mtab_list { 41 struct mtab_list {
42 char *dir; 42 char *dir;
@@ -46,7 +46,7 @@ int umount_main(int argc, char **argv)
46 46
47 /* Parse any options */ 47 /* Parse any options */
48 48
49 opt = bb_getopt_ulflags (argc, argv, OPTION_STRING); 49 opt = bb_getopt_ulflags(argc, argv, OPTION_STRING);
50 50
51 argc -= optind; 51 argc -= optind;
52 argv += optind; 52 argv += optind;
@@ -59,52 +59,55 @@ int umount_main(int argc, char **argv)
59 * entry. Notice that this also naturally reverses the list so that -a 59 * entry. Notice that this also naturally reverses the list so that -a
60 * umounts the most recent entries first. */ 60 * umounts the most recent entries first. */
61 61
62 m=mtl=0; 62 m = mtl = 0;
63 if(opt & OPT_ALL) {
64 63
65 /* If we're umounting all, then m points to the start of the list and 64 /* If we're umounting all, then m points to the start of the list and
66 * the argument list should be empty (which will match all). */ 65 * the argument list should be empty (which will match all). */
67 66
68 if(!(fp = setmntent(bb_path_mtab_file, "r"))) 67 if (!(fp = setmntent(bb_path_mtab_file, "r"))) {
68 if (opt & OPT_ALL)
69 bb_error_msg_and_die("Cannot open %s", bb_path_mtab_file); 69 bb_error_msg_and_die("Cannot open %s", bb_path_mtab_file);
70 while (getmntent_r(fp,&me,path,sizeof(path))) { 70 } else while (getmntent_r(fp,&me,path,sizeof(path))) {
71 m=xmalloc(sizeof(struct mtab_list)); 71 m = xmalloc(sizeof(struct mtab_list));
72 m->next=mtl; 72 m->next = mtl;
73 m->device=bb_xstrdup(me.mnt_fsname); 73 m->device = bb_xstrdup(me.mnt_fsname);
74 m->dir=bb_xstrdup(me.mnt_dir); 74 m->dir = bb_xstrdup(me.mnt_dir);
75 mtl=m; 75 mtl = m;
76 } 76 }
77 endmntent(fp); 77 endmntent(fp);
78 78
79 /* If we're not mounting all, we need at least one argument. */ 79 /* If we're not mounting all, we need at least one argument. */
80 } else if(argc <= 0) bb_show_usage(); 80 if (!(opt & OPT_ALL)) {
81 m = 0;
82 if (!argc) bb_show_usage();
83 }
84
85
81 86
82 // Loop through everything we're supposed to umount, and do so. 87 // Loop through everything we're supposed to umount, and do so.
83 for(;;) { 88 for (;;) {
84 int curstat; 89 int curstat;
85 90
86 // Do we already know what to umount this time through the loop? 91 // Do we already know what to umount this time through the loop?
87 if(m) safe_strncpy(path,m->dir,PATH_MAX); 92 if (m) safe_strncpy(path, m->dir, PATH_MAX);
88 // For umount -a, end of mtab means time to exit. 93 // For umount -a, end of mtab means time to exit.
89 else if(opt & OPT_ALL) break; 94 else if (opt & OPT_ALL) break;
90 // Get next command line argument (and look it up in mtab list) 95 // Get next command line argument (and look it up in mtab list)
91 else if(!argc--) break; 96 else if (!argc--) break;
92 else { 97 else {
93 // Get next command line argument (and look it up in mtab list)
94 realpath(*argv++, path); 98 realpath(*argv++, path);
95 if (ENABLE_FEATURE_MTAB_SUPPORT) 99 for (m = mtl; m; m = m->next)
96 for(m = mtl; m; m = m->next) 100 if (!strcmp(path, m->dir) || !strcmp(path, m->device))
97 if(!strcmp(path, m->dir) || !strcmp(path, m->device)) 101 break;
98 break;
99 } 102 }
100 103
101 // Let's ask the thing nicely to unmount. 104 // Let's ask the thing nicely to unmount.
102 curstat = umount(path); 105 curstat = umount(path);
103 106
104 // Force the unmount, if necessary. 107 // Force the unmount, if necessary.
105 if(curstat && doForce) { 108 if (curstat && doForce) {
106 curstat = umount2(path, doForce); 109 curstat = umount2(path, doForce);
107 if(curstat) 110 if (curstat)
108 bb_error_msg_and_die("forced umount of %s failed!", path); 111 bb_error_msg_and_die("forced umount of %s failed!", path);
109 } 112 }
110 113
@@ -117,10 +120,10 @@ int umount_main(int argc, char **argv)
117 120
118 /* De-allocate the loop device. This ioctl should be ignored on any 121 /* De-allocate the loop device. This ioctl should be ignored on any
119 * non-loop block devices. */ 122 * non-loop block devices. */
120 if(ENABLE_FEATURE_MOUNT_LOOP && !(opt & OPT_DONTFREELOOP) && m) 123 if (ENABLE_FEATURE_MOUNT_LOOP && !(opt & OPT_DONTFREELOOP) && m)
121 del_loop(m->device); 124 del_loop(m->device);
122 125
123 if(curstat) { 126 if (curstat) {
124 /* Yes, the ENABLE is redundant here, but the optimizer for ARM 127 /* Yes, the ENABLE is redundant here, but the optimizer for ARM
125 * can't do simple constant propagation in local variables... */ 128 * can't do simple constant propagation in local variables... */
126 if(ENABLE_FEATURE_MTAB_SUPPORT && !(opt & OPT_NO_MTAB) && m) 129 if(ENABLE_FEATURE_MTAB_SUPPORT && !(opt & OPT_NO_MTAB) && m)
@@ -129,16 +132,16 @@ int umount_main(int argc, char **argv)
129 bb_perror_msg("Couldn't umount %s", path); 132 bb_perror_msg("Couldn't umount %s", path);
130 } 133 }
131 // Find next matching mtab entry for -a or umount /dev 134 // Find next matching mtab entry for -a or umount /dev
132 while(m && (m = m->next)) 135 while (m && (m = m->next))
133 if((opt & OPT_ALL) || !strcmp(path,m->device)) 136 if ((opt & OPT_ALL) || !strcmp(path,m->device))
134 break; 137 break;
135 } 138 }
136 139
137 // Free mtab list if necessary 140 // Free mtab list if necessary
138 141
139 if(ENABLE_FEATURE_CLEAN_UP) { 142 if (ENABLE_FEATURE_CLEAN_UP) {
140 while(mtl) { 143 while (mtl) {
141 m=mtl->next; 144 m = mtl->next;
142 free(mtl->device); 145 free(mtl->device);
143 free(mtl->dir); 146 free(mtl->dir);
144 free(mtl); 147 free(mtl);