X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=rm.c;h=ea7f86ce100bfe7309a4b954e997cb480e936011;hb=9f0fedb8f693829e7869439a2ad43cc1c21a3786;hp=b1cda3aed061c0fa8e3d9a3b67da0cb7f6a498b1;hpb=e97da4007913bd29d8a18d038de29d9d4549163d;p=oweals%2Fbusybox.git diff --git a/rm.c b/rm.c index b1cda3aed..ea7f86ce1 100644 --- a/rm.c +++ b/rm.c @@ -3,9 +3,13 @@ * Mini rm implementation for busybox * * - * Copyright (C) 1999,2000 by Lineo, inc. + * Copyright (C) 1999,2000,2001 by Lineo, inc. * Written by Erik Andersen , * + * INTERACTIVE feature Copyright (C) 2001 by Alcove + * written by Christophe Boyanique + * for Ipanema Technologies + * * 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 * the Free Software Foundation; either version 2 of the License, or @@ -22,33 +26,35 @@ * */ -#include "internal.h" #include #include #include #include #include - -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 - ; - +#include +#include +#include +#include "busybox.h" static int recursiveFlag = FALSE; static int forceFlag = FALSE; +#ifdef BB_FEATURE_RM_INTERACTIVE + static int interactiveFlag = FALSE; +#endif static const char *srcName; static int fileAction(const char *fileName, struct stat *statbuf, void* junk) { +#ifdef BB_FEATURE_RM_INTERACTIVE + if (interactiveFlag == TRUE) { + printf("rm: remove `%s'? ", fileName); + if (ask_confirmation() == 0) + return (TRUE); + } +#endif if (unlink(fileName) < 0) { - perror(fileName); + perror_msg("%s", fileName); return (FALSE); } return (TRUE); @@ -56,8 +62,20 @@ static int fileAction(const char *fileName, struct stat *statbuf, void* junk) static int dirAction(const char *fileName, struct stat *statbuf, void* junk) { + if (recursiveFlag == FALSE) { + errno = EISDIR; + perror_msg("%s", fileName); + return (FALSE); + } +#ifdef BB_FEATURE_RM_INTERACTIVE + if (interactiveFlag == TRUE) { + printf("rm: remove directory `%s'? ", fileName); + if (ask_confirmation() == 0) + return (TRUE); + } +#endif if (rmdir(fileName) < 0) { - perror(fileName); + perror_msg("%s", fileName); return (FALSE); } return (TRUE); @@ -65,52 +83,56 @@ static int dirAction(const char *fileName, struct stat *statbuf, void* junk) extern int rm_main(int argc, char **argv) { - int stopIt=FALSE; + int opt; + int status = EXIT_SUCCESS; struct stat statbuf; + + + /* do normal option parsing */ + while ((opt = getopt(argc, argv, "Rrf-" +#ifdef BB_FEATURE_RM_INTERACTIVE +"i" +#endif +)) > 0) { + switch (opt) { + case 'R': + case 'r': + recursiveFlag = TRUE; + break; + case 'f': + forceFlag = TRUE; +#ifdef BB_FEATURE_RM_INTERACTIVE - argc--; - argv++; - - /* 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++; + interactiveFlag = FALSE; +#endif + break; +#ifdef BB_FEATURE_RM_INTERACTIVE + case 'i': + interactiveFlag = TRUE; + forceFlag = FALSE; + break; +#endif + default: + show_usage(); } - else - break; } - - if (argc < 1 && forceFlag == FALSE) { - usage(rm_usage); + + if (argc == optind && forceFlag == FALSE) { + show_usage(); } - while (argc-- > 0) { - srcName = *(argv++); + while (optind < argc) { + srcName = argv[optind]; 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, + if (recursive_action(srcName, recursiveFlag, FALSE, TRUE, fileAction, dirAction, NULL) == FALSE) { - exit(FALSE); + status = EXIT_FAILURE; } } + optind++; } - exit(TRUE); + return status; }