busybox/coreutils/rm.c
<<
>>
Prefs
   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_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