diff options
Diffstat (limited to 'rm.c')
-rw-r--r-- | rm.c | 105 |
1 files changed, 84 insertions, 21 deletions
@@ -1,30 +1,93 @@ +/* + * Mini rm implementation for busybox + * + * Copyright (C) 1998 by Erik Andersen <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 + * 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 <errno.h> +#include <stdio.h> +#include <time.h> +#include <utime.h> +#include <dirent.h> + +static const char* rm_usage = "Usage: rm [OPTION]... FILE...\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"; + + +static int recursiveFlag = FALSE; +static int forceFlag = FALSE; +static const char *srcName; + -const char rm_usage[] = "rm [-r] file [file ...]\n" -"\n" -"\tDelete files.\n" -"\n" -"\t-r:\tRecursively remove files and directories.\n"; +static int fileAction(const char *fileName, struct stat* statbuf) +{ + if (unlink( fileName) < 0 ) { + perror( fileName); + return ( FALSE); + } + return ( TRUE); +} -extern int -rm_main(struct FileInfo * i, int argc, char * * argv) +static int dirAction(const char *fileName, struct stat* statbuf) { - i->processDirectoriesAfterTheirContents = 1; - return monadic_main(i, argc, argv); + 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; + + if (argc < 2) { + fprintf(stderr, "Usage: %s", rm_usage); + exit (FALSE); + } + argc--; + argv++; + + /* Parse any options */ + while (**argv == '-') { + while (*++(*argv)) + switch (**argv) { + case 'r': + recursiveFlag = TRUE; + break; + case 'f': + forceFlag = TRUE; + break; + default: + fprintf(stderr, "Usage: %s\n", rm_usage); + exit(FALSE); + } + argc--; + argv++; + } + + while (argc-- > 0) { + srcName = *(argv++); + if (recursiveAction( srcName, recursiveFlag, TRUE, TRUE, + fileAction, dirAction) == FALSE) { + exit( FALSE); } - else - return 0; + } + exit( TRUE); } |