sort is good to go.
[oweals/busybox.git] / rm.c
diff --git a/rm.c b/rm.c
index f49ada5e184a5fa1d1815b523f60b0cf0ef40aea..ee434fb3984705e4379220f3cb0653585a21f6a0 100644 (file)
--- a/rm.c
+++ b/rm.c
 #include <time.h>
 #include <utime.h>
 #include <dirent.h>
+#include <errno.h>
 
-static const char* rm_usage = "rm [OPTION]... FILE...\n"
+static const char* rm_usage = "rm [OPTION]... FILE...\n\n"
 "Remove (unlink) the FILE(s).\n\n"
-"\t-f\tremove existing destinations, never prompt\n"
-"\t-r\tremove the contents of directories recursively\n";
+"Options:\n"
+"\t-f\t\tremove existing destinations, never prompt\n"
+"\t-r or -R\tremove the contents of directories recursively\n";
 
 
 static int recursiveFlag = FALSE;
@@ -58,6 +60,7 @@ static int dirAction(const char *fileName, struct stat* statbuf)
 
 extern int rm_main(int argc, char **argv)
 {
+    struct stat statbuf;
 
     if (argc < 2) {
        usage( rm_usage);
@@ -69,6 +72,7 @@ extern int rm_main(int argc, char **argv)
     while (**argv == '-') {
        while (*++(*argv))
            switch (**argv) {
+           case 'R':
            case 'r':
                recursiveFlag = TRUE;
                break;
@@ -84,9 +88,14 @@ extern int rm_main(int argc, char **argv)
 
     while (argc-- > 0) {
        srcName = *(argv++);
-       if (recursiveAction( srcName, recursiveFlag, TRUE, TRUE, 
-                              fileAction, dirAction) == FALSE) {
-           exit( FALSE);
+       if (forceFlag == TRUE && lstat(srcName, &statbuf) != 0 && errno == ENOENT) {
+           /* do not reports errors for non-existent files if -f, just skip them */
+       }
+       else {
+           if (recursiveAction( srcName, recursiveFlag, FALSE, 
+                       TRUE, fileAction, dirAction) == FALSE) {
+               exit( FALSE);
+           }
        }
     }
     exit( TRUE);