diff options
author | "Vladimir N. Oleynik" <dzo@simtreas.ru> | 2005-10-10 12:17:33 +0000 |
---|---|---|
committer | "Vladimir N. Oleynik" <dzo@simtreas.ru> | 2005-10-10 12:17:33 +0000 |
commit | 54cb5c6af35e09cb759b76390aa920f394e2488b (patch) | |
tree | dc68dda04c95b91c7c45f0135b3d165edbefb635 /util-linux/umount.c | |
parent | 083d3f49c2c0fec0bd8b5b0bec875d67748c612e (diff) | |
download | busybox-w32-54cb5c6af35e09cb759b76390aa920f394e2488b.tar.gz busybox-w32-54cb5c6af35e09cb759b76390aa920f394e2488b.tar.bz2 busybox-w32-54cb5c6af35e09cb759b76390aa920f394e2488b.zip |
better check usage with options, correct show problem error message, indent
Diffstat (limited to 'util-linux/umount.c')
-rw-r--r-- | util-linux/umount.c | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/util-linux/umount.c b/util-linux/umount.c index e55002bf0..14ff41588 100644 --- a/util-linux/umount.c +++ b/util-linux/umount.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * | 4 | * |
5 | * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> | 5 | * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> |
6 | * Copyright (C) 2005 by Rob Landley <rob@landley.net> | 6 | * Copyright (C) 2005 by Rob Landley <rob@landley.net> |
7 | * | 7 | * |
8 | * This program is licensed under the GNU General Public license (GPL) | 8 | * This program is licensed under the GNU General Public license (GPL) |
9 | * version 2 or later, see http://www.fsf.org/licensing/licenses/gpl.html | 9 | * version 2 or later, see http://www.fsf.org/licensing/licenses/gpl.html |
10 | * or the file "LICENSE" in the busybox source tarball for the full text. | 10 | * or the file "LICENSE" in the busybox source tarball for the full text. |
@@ -25,11 +25,11 @@ | |||
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_ALL 4 |
28 | #define OPT_DONTFREELOOP 8 | 28 | #define OPT_DONTFREELOOP 8 |
29 | #define OPT_NO_MTAB 16 | 29 | #define OPT_NO_MTAB 16 |
30 | #define OPT_REMOUNT 32 | 30 | #define OPT_REMOUNT 32 |
31 | /* -v is ignored */ | 31 | /* -v is ignored */ |
32 | 32 | ||
33 | 33 | ||
34 | extern int umount_main(int argc, char **argv) | 34 | extern int umount_main(int argc, char **argv) |
35 | { | 35 | { |
@@ -42,26 +42,24 @@ extern int umount_main(int argc, char **argv) | |||
42 | struct mtab_list { | 42 | struct mtab_list { |
43 | char *dir; | 43 | char *dir; |
44 | char *device; | 44 | char *device; |
45 | struct mtab_list *next; | 45 | struct mtab_list *next; |
46 | } *mtl, *m; | 46 | } *mtl, *m; |
47 | 47 | ||
48 | if(argc < 2) bb_show_usage(); | ||
49 | |||
50 | /* Parse any options */ | 48 | /* Parse any options */ |
51 | 49 | ||
52 | opt = bb_getopt_ulflags (argc, argv, "flaDnrv"); | 50 | opt = bb_getopt_ulflags (argc, argv, OPTION_STRING); |
53 | 51 | ||
54 | argc -= optind; | 52 | argc -= optind; |
55 | argv += optind; | 53 | argv += optind; |
56 | 54 | ||
57 | doForce = MAX((opt & OPT_FORCE), (opt & OPT_LAZY)); | 55 | doForce = MAX((opt & OPT_FORCE), (opt & OPT_LAZY)); |
58 | 56 | ||
59 | /* Get a list of mount points from mtab. We read them all in now mostly | 57 | /* Get a list of mount points from mtab. We read them all in now mostly |
60 | * for umount -a (so we don't have to worry about the list changing while | 58 | * for umount -a (so we don't have to worry about the list changing while |
61 | * we iterate over it, or about getting stuck in a loop on the same failing | 59 | * we iterate over it, or about getting stuck in a loop on the same failing |
62 | * entry. Notice that this also naturally reverses the list so that -a | 60 | * entry. Notice that this also naturally reverses the list so that -a |
63 | * umounts the most recent entries first. */ | 61 | * umounts the most recent entries first. */ |
64 | 62 | ||
65 | m=mtl=0; | 63 | m=mtl=0; |
66 | if(!(fp = setmntent(bb_path_mtab_file, "r"))) | 64 | if(!(fp = setmntent(bb_path_mtab_file, "r"))) |
67 | bb_error_msg_and_die("Cannot open %s", bb_path_mtab_file); | 65 | bb_error_msg_and_die("Cannot open %s", bb_path_mtab_file); |
@@ -76,12 +74,15 @@ extern int umount_main(int argc, char **argv) | |||
76 | 74 | ||
77 | /* If we're umounting all, then m points to the start of the list and | 75 | /* If we're umounting all, then m points to the start of the list and |
78 | * the argument list should be empty (which will match all). */ | 76 | * the argument list should be empty (which will match all). */ |
79 | if(!(opt & OPT_ALL)) m=0; | 77 | if(!(opt & OPT_ALL)) { |
78 | m=0; | ||
79 | if(argc <= 0) bb_show_usage(); | ||
80 | } | ||
80 | 81 | ||
81 | // Loop through everything we're supposed to umount, and do so. | 82 | // Loop through everything we're supposed to umount, and do so. |
82 | for(;;) { | 83 | for(;;) { |
83 | int curstat; | 84 | int curstat; |
84 | 85 | ||
85 | // Do we already know what to umount this time through the loop? | 86 | // Do we already know what to umount this time through the loop? |
86 | if(m) safe_strncpy(path,m->dir,PATH_MAX); | 87 | if(m) safe_strncpy(path,m->dir,PATH_MAX); |
87 | // For umount -a, end of mtab means time to exit. | 88 | // For umount -a, end of mtab means time to exit. |
@@ -106,7 +107,7 @@ extern int umount_main(int argc, char **argv) | |||
106 | bb_error_msg_and_die("forced umount of %s failed!", path); | 107 | bb_error_msg_and_die("forced umount of %s failed!", path); |
107 | } | 108 | } |
108 | 109 | ||
109 | // If still can't umount, maybe remount read-only? | 110 | // If still can't umount, maybe remount read-only? |
110 | if (curstat && (opt & OPT_REMOUNT) && errno == EBUSY && m) { | 111 | if (curstat && (opt & OPT_REMOUNT) && errno == EBUSY && m) { |
111 | curstat = mount(m->device, path, NULL, MS_REMOUNT|MS_RDONLY, NULL); | 112 | curstat = mount(m->device, path, NULL, MS_REMOUNT|MS_RDONLY, NULL); |
112 | bb_error_msg(curstat ? "Cannot remount %s read-only" : | 113 | bb_error_msg(curstat ? "Cannot remount %s read-only" : |
@@ -124,16 +125,16 @@ extern int umount_main(int argc, char **argv) | |||
124 | if(ENABLE_FEATURE_MTAB_SUPPORT && !(opt & OPT_NO_MTAB) && m) | 125 | if(ENABLE_FEATURE_MTAB_SUPPORT && !(opt & OPT_NO_MTAB) && m) |
125 | erase_mtab(m->dir); | 126 | erase_mtab(m->dir); |
126 | status = EXIT_FAILURE; | 127 | status = EXIT_FAILURE; |
127 | bb_perror_msg("Couldn't umount %s\n", path); | 128 | bb_perror_msg("Couldn't umount %s", path); |
128 | } | 129 | } |
129 | // Find next matching mtab entry for -a or umount /dev | 130 | // Find next matching mtab entry for -a or umount /dev |
130 | while(m && (m = m->next)) | 131 | while(m && (m = m->next)) |
131 | if((opt & OPT_ALL) || !strcmp(path,m->device)) | 132 | if((opt & OPT_ALL) || !strcmp(path,m->device)) |
132 | break; | 133 | break; |
133 | } | 134 | } |
134 | 135 | ||
135 | // Free mtab list if necessary | 136 | // Free mtab list if necessary |
136 | 137 | ||
137 | if(ENABLE_FEATURE_CLEAN_UP) { | 138 | if(ENABLE_FEATURE_CLEAN_UP) { |
138 | while(mtl) { | 139 | while(mtl) { |
139 | m=mtl->next; | 140 | m=mtl->next; |