1/* vi: set sw=4 ts=4: */ 2/* 3 * Mini rm implementation for busybox 4 * 5 * Copyright (C) 2001 Matt Kraai <kraai@alumni.carnegiemellon.edu> 6 * 7 * Licensed under GPLv2 or later, see file LICENSE in this source tree. 8 */ 9/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org) 10 * 11 * Size reduction. 12 */ 13//config:config RM 14//config: bool "rm (5.4 kb)" 15//config: default y 16//config: help 17//config: rm is used to remove files or directories. 18 19//applet:IF_RM(APPLET_NOEXEC(rm, rm, BB_DIR_BIN, BB_SUID_DROP, rm)) 20/* was NOFORK, but then "rm -i FILE" can't be ^C'ed if run by hush */ 21 22//kbuild:lib-$(CONFIG_RM) += rm.o 23 24/* BB_AUDIT SUSv3 compliant */ 25/* http://www.opengroup.org/onlinepubs/007904975/utilities/rm.html */ 26 27//usage:#define rm_trivial_usage 28//usage: "[-irf] FILE..." 29//usage:#define rm_full_usage "\n\n" 30//usage: "Remove (unlink) FILEs\n" 31//usage: "\n -i Always prompt before removing" 32//usage: "\n -f Never prompt" 33//usage: "\n -R,-r Recurse" 34//usage: 35//usage:#define rm_example_usage 36//usage: "$ rm -rf /tmp/foo\n" 37 38#include "libbb.h" 39 40/* This is a NOEXEC applet. Be very careful! */ 41 42int rm_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 43int rm_main(int argc UNUSED_PARAM, char **argv) 44{ 45 int status = 0; 46 int flags = 0; 47 unsigned opt; 48 49 opt = getopt32(argv, "^" "fiRrv" "\0" "f-i:i-f"); 50 argv += optind; 51 if (opt & 1) 52 flags |= FILEUTILS_FORCE; 53 if (opt & 2) 54 flags |= FILEUTILS_INTERACTIVE; 55 if (opt & (8|4)) 56 flags |= FILEUTILS_RECUR; 57 if ((opt & 16) && FILEUTILS_VERBOSE) 58 flags |= FILEUTILS_VERBOSE; 59 60 if (*argv != NULL) { 61 do { 62 const char *base = bb_get_last_path_component_strip(*argv); 63 64 if (DOT_OR_DOTDOT(base)) { 65 bb_simple_error_msg("can't remove '.' or '..'"); 66 } else if (remove_file(*argv, flags) >= 0) { 67 continue; 68 } 69 status = 1; 70 } while (*++argv); 71 } else if (!(flags & FILEUTILS_FORCE)) { 72 bb_show_usage(); 73 } 74 75 return status; 76} 77