aboutsummaryrefslogtreecommitdiff
path: root/coreutils/rm.c
diff options
context:
space:
mode:
authorManuel Novoa III <mjn3@codepoet.org>2003-03-19 09:13:01 +0000
committerManuel Novoa III <mjn3@codepoet.org>2003-03-19 09:13:01 +0000
commitcad5364599eb5062d59e0c397ed638ddd61a8d5d (patch)
treea318d0f03aa076c74b576ea45dc543a5669e8e91 /coreutils/rm.c
parente01f9662a5bd5d91be4f6b3941b57fff73cd5af1 (diff)
downloadbusybox-cad5364599eb5062d59e0c397ed638ddd61a8d5d.tar.gz
Major coreutils update.
Diffstat (limited to 'coreutils/rm.c')
-rw-r--r--coreutils/rm.c67
1 files changed, 31 insertions, 36 deletions
diff --git a/coreutils/rm.c b/coreutils/rm.c
index 51c9f4ceb..5489350e5 100644
--- a/coreutils/rm.c
+++ b/coreutils/rm.c
@@ -2,7 +2,6 @@
/*
* Mini rm implementation for busybox
*
- *
* Copyright (C) 2001 Matt Kraai <kraai@alumni.carnegiemellon.edu>
*
*
@@ -22,55 +21,51 @@
*
*/
-#include <stdio.h>
-#include <time.h>
-#include <utime.h>
-#include <dirent.h>
-#include <errno.h>
+/* BB_AUDIT SUSv3 compliant */
+/* http://www.opengroup.org/onlinepubs/007904975/utilities/rm.html */
+
+/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org)
+ *
+ * Size reduction.
+ */
+
#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <getopt.h>
#include "busybox.h"
extern int rm_main(int argc, char **argv)
{
int status = 0;
- int opt;
int flags = 0;
- int i;
+ int opt;
- while ((opt = getopt(argc, argv, "fiRr")) != -1) {
- switch (opt) {
- case 'f':
- flags &= ~FILEUTILS_INTERACTIVE;
- flags |= FILEUTILS_FORCE;
- break;
- case 'i':
- flags &= ~FILEUTILS_FORCE;
- flags |= FILEUTILS_INTERACTIVE;
- break;
- case 'R':
- case 'r':
+ while ((opt = getopt(argc, argv, "fiRr")) > 0) {
+ if ((opt == 'r') || (opt == 'R')) {
flags |= FILEUTILS_RECUR;
- break;
+ } else {
+ flags &= ~(FILEUTILS_INTERACTIVE | FILEUTILS_FORCE);
+ if (opt == 'i') {
+ flags |= FILEUTILS_INTERACTIVE;
+ } else if (opt == 'f') {
+ flags |= FILEUTILS_FORCE;
+ } else {
+ bb_show_usage();
+ }
}
}
- if (!(flags & FILEUTILS_FORCE) && optind == argc)
- show_usage();
-
- for (i = optind; i < argc; i++) {
- char *base = get_last_path_component(argv[i]);
-
- if (strcmp(base, ".") == 0 || strcmp(base, "..") == 0) {
- error_msg("cannot remove `.' or `..'");
- status = 1;
- continue;
- }
+ if (*(argv += optind) != NULL) {
+ do {
+ const char *base = bb_get_last_path_component(*argv);
- if (remove_file(argv[i], flags) < 0)
+ if ((base[0] == '.') && (!base[1] || ((base[1] == '.') && !base[2]))) {
+ bb_error_msg("cannot remove `.' or `..'");
+ } else if (remove_file(*argv, flags) >= 0) {
+ continue;
+ }
status = 1;
+ } while (*++argv);
+ } else if (!(flags & FILEUTILS_FORCE)) {
+ bb_show_usage();
}
return status;