X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=rm.c;h=2067d878c269f266dc9d05a8d06f6cc23de10b5c;hb=f1f6d58598ae6628b6a31d512e9148674349ee98;hp=ba5d30e92edafa6d144109fcd4d28d526b3c1b29;hpb=a9c95ea6551eb3d894fcc56822c8aa394972b699;p=oweals%2Fbusybox.git diff --git a/rm.c b/rm.c index ba5d30e92..2067d878c 100644 --- a/rm.c +++ b/rm.c @@ -1,8 +1,9 @@ +/* vi: set sw=4 ts=4: */ /* * Mini rm implementation for busybox * * - * Copyright (C) 1999 by Lineo, inc. + * Copyright (C) 1999,2000 by Lineo, inc. * Written by Erik Andersen , * * This program is free software; you can redistribute it and/or modify @@ -28,11 +29,15 @@ #include #include -static const char* rm_usage = "rm [OPTION]... FILE...\n\n" -"Remove (unlink) the FILE(s).\n\n" -"Options:\n" -"\t-f\tremove existing destinations, never prompt\n" -"\t-r\tremove the contents of directories recursively\n"; +static const char *rm_usage = "rm [OPTION]... FILE...\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\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" +#endif + ; static int recursiveFlag = FALSE; @@ -40,62 +45,72 @@ static int forceFlag = FALSE; static const char *srcName; -static int fileAction(const char *fileName, struct stat* statbuf) +static int fileAction(const char *fileName, struct stat *statbuf, void* junk) { - if (unlink( fileName) < 0 ) { - perror( fileName); - return ( FALSE); - } - return ( TRUE); + if (unlink(fileName) < 0) { + perror(fileName); + return (FALSE); + } + return (TRUE); } -static int dirAction(const char *fileName, struct stat* statbuf) +static int dirAction(const char *fileName, struct stat *statbuf, void* junk) { - if (rmdir( fileName) < 0 ) { - perror( fileName); - return ( FALSE); - } - return ( TRUE); + if (rmdir(fileName) < 0) { + perror(fileName); + return (FALSE); + } + return (TRUE); } extern int rm_main(int argc, char **argv) { - struct stat statbuf; - - if (argc < 2) { - usage( rm_usage); - } - argc--; - argv++; + int stopIt=FALSE; + struct stat statbuf; - /* Parse any options */ - while (**argv == '-') { - while (*++(*argv)) - switch (**argv) { - case 'r': - recursiveFlag = TRUE; - break; - case 'f': - forceFlag = TRUE; - break; - default: - usage( rm_usage); - } argc--; argv++; - } - while (argc-- > 0) { - srcName = *(argv++); - if (forceFlag == TRUE && lstat(srcName, &statbuf) != 0 && errno == ENOENT) { - /* do not reports errors for non-existent files if -f, just skip them */ + /* Parse any options */ + while (argc > 0 && stopIt == FALSE) { + if (**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); + } + argc--; + argv++; + } + else + break; } - else { - if (recursiveAction( srcName, recursiveFlag, FALSE, - TRUE, fileAction, dirAction) == FALSE) { - exit( FALSE); - } + + if (argc < 1 && forceFlag == FALSE) { + usage(rm_usage); + } + + while (argc-- > 0) { + srcName = *(argv++); + 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, NULL) == FALSE) { + exit(FALSE); + } + } } - } - exit( TRUE); + return(TRUE); }