summaryrefslogtreecommitdiffhomepage
path: root/rm.c
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2000-06-06 16:15:23 +0000
committerEric Andersen <andersen@codepoet.org>2000-06-06 16:15:23 +0000
commit815e90447064e287ad181c1231636e7f1b44f76c (patch)
tree0955917be0c7adc926b7298bf450fedc67e447e6 /rm.c
parentc389d9118152e45303173c221a33a8083e769884 (diff)
Fixed a bunch of stuff:
* Fixed segfault caused by "touch -c" * Fixed segfault caused by "rm -f" * Fixed segfault caused by "ln -s -s" and similar abuses. * Fixed segfault caused by "cp -a -a" and similar abuses. * Implemented "rm -- <foo>" updated docs accordingly. -Erik
Diffstat (limited to 'rm.c')
-rw-r--r--rm.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/rm.c b/rm.c
index c62d68aba..5901c5da9 100644
--- a/rm.c
+++ b/rm.c
@@ -31,7 +31,8 @@
static const char *rm_usage = "rm [OPTION]... FILE...\n"
#ifndef BB_FEATURE_TRIVIAL_HELP
- "\nRemove (unlink) the FILE(s).\n\n"
+ "\nRemove (unlink) the FILE(s). You may use '--' to\n"
+ "indicate that all following arguments are non-options.\n\n"
"Options:\n"
"\t-f\t\tremove existing destinations, never prompt\n"
"\t-r or -R\tremove the contents of directories recursively\n"
@@ -64,29 +65,33 @@ static int dirAction(const char *fileName, struct stat *statbuf, void* junk)
extern int rm_main(int argc, char **argv)
{
+ int stopIt=FALSE;
struct stat statbuf;
if (argc < 2) {
usage(rm_usage);
}
- argc--;
argv++;
/* Parse any options */
- while (**argv == '-') {
- while (*++(*argv))
- switch (**argv) {
- case 'R':
- case 'r':
- recursiveFlag = TRUE;
- break;
- case 'f':
- forceFlag = TRUE;
- break;
- default:
- usage(rm_usage);
- }
- argc--;
+ while (--argc >= 0 && *argv && **argv && stopIt==FALSE) {
+ while (**argv == '-') {
+ while (*++(*argv))
+ switch (**argv) {
+ case 'R':
+ case 'r':
+ recursiveFlag = TRUE;
+ break;
+ case 'f':
+ forceFlag = TRUE;
+ break;
+ case '-':
+ stopIt = TRUE;
+ break;
+ default:
+ usage(rm_usage);
+ }
+ }
argv++;
}