diff options
Diffstat (limited to 'rm.c')
-rw-r--r-- | rm.c | 105 |
1 files changed, 84 insertions, 21 deletions
@@ -1,30 +1,93 @@ | |||
1 | /* | ||
2 | * Mini rm implementation for busybox | ||
3 | * | ||
4 | * Copyright (C) 1998 by Erik Andersen <andersee@debian.org> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
14 | * General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | * | ||
20 | */ | ||
21 | |||
1 | #include "internal.h" | 22 | #include "internal.h" |
2 | #include <errno.h> | 23 | #include <stdio.h> |
24 | #include <time.h> | ||
25 | #include <utime.h> | ||
26 | #include <dirent.h> | ||
27 | |||
28 | static const char* rm_usage = "Usage: rm [OPTION]... FILE...\n" | ||
29 | "Remove (unlink) the FILE(s).\n\n" | ||
30 | "\t-f\tremove existing destinations, never prompt\n" | ||
31 | "\t-r\tremove the contents of directories recursively\n"; | ||
32 | |||
33 | |||
34 | static int recursiveFlag = FALSE; | ||
35 | static int forceFlag = FALSE; | ||
36 | static const char *srcName; | ||
37 | |||
3 | 38 | ||
4 | const char rm_usage[] = "rm [-r] file [file ...]\n" | 39 | static int fileAction(const char *fileName, struct stat* statbuf) |
5 | "\n" | 40 | { |
6 | "\tDelete files.\n" | 41 | if (unlink( fileName) < 0 ) { |
7 | "\n" | 42 | perror( fileName); |
8 | "\t-r:\tRecursively remove files and directories.\n"; | 43 | return ( FALSE); |
44 | } | ||
45 | return ( TRUE); | ||
46 | } | ||
9 | 47 | ||
10 | extern int | 48 | static int dirAction(const char *fileName, struct stat* statbuf) |
11 | rm_main(struct FileInfo * i, int argc, char * * argv) | ||
12 | { | 49 | { |
13 | i->processDirectoriesAfterTheirContents = 1; | 50 | if (rmdir( fileName) < 0 ) { |
14 | return monadic_main(i, argc, argv); | 51 | perror( fileName); |
52 | return ( FALSE); | ||
53 | } | ||
54 | return ( TRUE); | ||
15 | } | 55 | } |
16 | 56 | ||
17 | extern int | 57 | extern int rm_main(int argc, char **argv) |
18 | rm_fn(const struct FileInfo * i) | ||
19 | { | 58 | { |
20 | if ( i->recursive | 59 | |
21 | && !i->isSymbolicLink | 60 | if (argc < 2) { |
22 | && (i->stat.st_mode & S_IFMT) == S_IFDIR ) | 61 | fprintf(stderr, "Usage: %s", rm_usage); |
23 | return rmdir_fn(i); | 62 | exit (FALSE); |
24 | else if ( unlink(i->source) != 0 && errno != ENOENT && !i->force ) { | 63 | } |
25 | name_and_error(i->source); | 64 | argc--; |
26 | return 1; | 65 | argv++; |
66 | |||
67 | /* Parse any options */ | ||
68 | while (**argv == '-') { | ||
69 | while (*++(*argv)) | ||
70 | switch (**argv) { | ||
71 | case 'r': | ||
72 | recursiveFlag = TRUE; | ||
73 | break; | ||
74 | case 'f': | ||
75 | forceFlag = TRUE; | ||
76 | break; | ||
77 | default: | ||
78 | fprintf(stderr, "Usage: %s\n", rm_usage); | ||
79 | exit(FALSE); | ||
80 | } | ||
81 | argc--; | ||
82 | argv++; | ||
83 | } | ||
84 | |||
85 | while (argc-- > 0) { | ||
86 | srcName = *(argv++); | ||
87 | if (recursiveAction( srcName, recursiveFlag, TRUE, TRUE, | ||
88 | fileAction, dirAction) == FALSE) { | ||
89 | exit( FALSE); | ||
27 | } | 90 | } |
28 | else | 91 | } |
29 | return 0; | 92 | exit( TRUE); |
30 | } | 93 | } |