blob: f49ada5e184a5fa1d1815b523f60b0cf0ef40aea [file] [log] [blame]
Eric Andersenbed30e91999-10-18 19:02:32 +00001/*
2 * Mini rm implementation for busybox
3 *
Eric Andersenc4996011999-10-20 22:08:37 +00004 *
5 * Copyright (C) 1999 by Lineo, inc.
6 * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
Eric Andersenbed30e91999-10-18 19:02:32 +00007 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 *
22 */
23
Eric Andersencc8ed391999-10-05 16:24:54 +000024#include "internal.h"
Eric Andersenbed30e91999-10-18 19:02:32 +000025#include <stdio.h>
26#include <time.h>
27#include <utime.h>
28#include <dirent.h>
Eric Andersencc8ed391999-10-05 16:24:54 +000029
Eric Andersenb0e9a701999-10-18 22:28:26 +000030static const char* rm_usage = "rm [OPTION]... FILE...\n"
Eric Andersenbed30e91999-10-18 19:02:32 +000031"Remove (unlink) the FILE(s).\n\n"
32"\t-f\tremove existing destinations, never prompt\n"
33"\t-r\tremove the contents of directories recursively\n";
Eric Andersencc8ed391999-10-05 16:24:54 +000034
Eric Andersenbed30e91999-10-18 19:02:32 +000035
36static int recursiveFlag = FALSE;
37static int forceFlag = FALSE;
38static const char *srcName;
39
40
41static int fileAction(const char *fileName, struct stat* statbuf)
Eric Andersencc8ed391999-10-05 16:24:54 +000042{
Eric Andersenbed30e91999-10-18 19:02:32 +000043 if (unlink( fileName) < 0 ) {
44 perror( fileName);
45 return ( FALSE);
46 }
47 return ( TRUE);
Eric Andersencc8ed391999-10-05 16:24:54 +000048}
49
Eric Andersenbed30e91999-10-18 19:02:32 +000050static int dirAction(const char *fileName, struct stat* statbuf)
Eric Andersencc8ed391999-10-05 16:24:54 +000051{
Eric Andersenbed30e91999-10-18 19:02:32 +000052 if (rmdir( fileName) < 0 ) {
53 perror( fileName);
54 return ( FALSE);
55 }
56 return ( TRUE);
57}
58
59extern int rm_main(int argc, char **argv)
60{
61
62 if (argc < 2) {
Eric Andersenb0e9a701999-10-18 22:28:26 +000063 usage( rm_usage);
Eric Andersenbed30e91999-10-18 19:02:32 +000064 }
65 argc--;
66 argv++;
67
68 /* Parse any options */
69 while (**argv == '-') {
70 while (*++(*argv))
71 switch (**argv) {
72 case 'r':
73 recursiveFlag = TRUE;
74 break;
75 case 'f':
76 forceFlag = TRUE;
77 break;
78 default:
Eric Andersenb0e9a701999-10-18 22:28:26 +000079 usage( rm_usage);
Eric Andersenbed30e91999-10-18 19:02:32 +000080 }
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);
Eric Andersencc8ed391999-10-05 16:24:54 +000090 }
Eric Andersenbed30e91999-10-18 19:02:32 +000091 }
92 exit( TRUE);
Eric Andersencc8ed391999-10-05 16:24:54 +000093}