work in progress...
[oweals/busybox.git] / rm.c
diff --git a/rm.c b/rm.c
index 477d3af598bfe09d012ec606b49e80101b234fbe..ee434fb3984705e4379220f3cb0653585a21f6a0 100644 (file)
--- a/rm.c
+++ b/rm.c
@@ -1,7 +1,9 @@
 /*
  * Mini rm implementation for busybox
  *
- * Copyright (C) 1998 by Erik Andersen <andersee@debian.org>
+ *
+ * Copyright (C) 1999 by Lineo, inc.
+ * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 #include <time.h>
 #include <utime.h>
 #include <dirent.h>
+#include <errno.h>
 
-static const char* rm_usage = "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;
@@ -56,10 +60,10 @@ static int dirAction(const char *fileName, struct stat* statbuf)
 
 extern int rm_main(int argc, char **argv)
 {
+    struct stat statbuf;
 
     if (argc < 2) {
-       fprintf(stderr, "Usage: %s", rm_usage);
-       exit (FALSE);
+       usage( rm_usage);
     }
     argc--;
     argv++;
@@ -68,6 +72,7 @@ extern int rm_main(int argc, char **argv)
     while (**argv == '-') {
        while (*++(*argv))
            switch (**argv) {
+           case 'R':
            case 'r':
                recursiveFlag = TRUE;
                break;
@@ -75,8 +80,7 @@ extern int rm_main(int argc, char **argv)
                forceFlag = TRUE;
                break;
            default:
-               fprintf(stderr, "Usage: %s\n", rm_usage);
-               exit(FALSE);
+               usage( rm_usage);
            }
        argc--;
        argv++;
@@ -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);