diff options
author | Rob Landley <rob@landley.net> | 2006-03-17 03:30:05 +0000 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2006-03-17 03:30:05 +0000 |
commit | 5a5782156582bc57cb5462d74abe11f4cf415eb9 (patch) | |
tree | 42677357a045e89b4affda879756e51f8808747e | |
parent | 2824ded677802d8afd99d5d17543665491803486 (diff) | |
download | busybox-w32-5a5782156582bc57cb5462d74abe11f4cf415eb9.tar.gz busybox-w32-5a5782156582bc57cb5462d74abe11f4cf415eb9.tar.bz2 busybox-w32-5a5782156582bc57cb5462d74abe11f4cf415eb9.zip |
Bug fix: umount wasn't detaching loop devices unless mtab support was enabled.
Made some whitespace cleanups while I was there.
-rw-r--r-- | util-linux/umount.c | 73 |
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); |