X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=rm.c;h=c93a94ce10b87a5ad021ac2437049571af556119;hb=0102a9fd48fe9ed16a1e2ad372cfa0fb65e87208;hp=dc35b0297ea095ebb904d2288aef4c571d73d067;hpb=cc8ed39b240180b58810784f844e253263594ac3;p=oweals%2Fbusybox.git diff --git a/rm.c b/rm.c index dc35b0297..c93a94ce1 100644 --- a/rm.c +++ b/rm.c @@ -1,30 +1,110 @@ +/* vi: set sw=4 ts=4: */ +/* + * Mini rm implementation for busybox + * + * + * Copyright (C) 1999,2000 by Lineo, inc. + * Written by Erik Andersen , + * + * 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 + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + #include "internal.h" +#include +#include +#include +#include #include -const char rm_usage[] = "rm [-r] file [file ...]\n" -"\n" -"\tDelete files.\n" -"\n" -"\t-r:\tRecursively remove files and directories.\n"; +static int recursiveFlag = FALSE; +static int forceFlag = FALSE; +static const char *srcName; + -extern int -rm_main(struct FileInfo * i, int argc, char * * argv) +static int fileAction(const char *fileName, struct stat *statbuf, void* junk) { - i->processDirectoriesAfterTheirContents = 1; - return monadic_main(i, argc, argv); + if (unlink(fileName) < 0) { + perror(fileName); + return (FALSE); + } + return (TRUE); +} + +static int dirAction(const char *fileName, struct stat *statbuf, void* junk) +{ + if (recursiveFlag == FALSE) { + errno = EISDIR; + perror(fileName); + return (FALSE); + } + if (rmdir(fileName) < 0) { + perror(fileName); + return (FALSE); + } + return (TRUE); } -extern int -rm_fn(const struct FileInfo * i) +extern int rm_main(int argc, char **argv) { - if ( i->recursive - && !i->isSymbolicLink - && (i->stat.st_mode & S_IFMT) == S_IFDIR ) - return rmdir_fn(i); - else if ( unlink(i->source) != 0 && errno != ENOENT && !i->force ) { - name_and_error(i->source); - return 1; + int stopIt=FALSE; + struct stat statbuf; + + 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++; + } + else + break; + } + + 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); + } + } } - else - return 0; + return(TRUE); }