X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=coreutils%2Frm.c;h=6b3fbcf253d7811b8a5c3144d7d4fed6495981f0;hb=ae05dd42ca809d81f7025d29701d4641f1a996bf;hp=dc35b0297ea095ebb904d2288aef4c571d73d067;hpb=cc8ed39b240180b58810784f844e253263594ac3;p=oweals%2Fbusybox.git diff --git a/coreutils/rm.c b/coreutils/rm.c index dc35b0297..6b3fbcf25 100644 --- a/coreutils/rm.c +++ b/coreutils/rm.c @@ -1,30 +1,56 @@ -#include "internal.h" -#include +/* vi: set sw=4 ts=4: */ +/* + * Mini rm implementation for busybox + * + * Copyright (C) 2001 Matt Kraai + * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + */ -const char rm_usage[] = "rm [-r] file [file ...]\n" -"\n" -"\tDelete files.\n" -"\n" -"\t-r:\tRecursively remove files and directories.\n"; +/* BB_AUDIT SUSv3 compliant */ +/* http://www.opengroup.org/onlinepubs/007904975/utilities/rm.html */ -extern int -rm_main(struct FileInfo * i, int argc, char * * argv) -{ - i->processDirectoriesAfterTheirContents = 1; - return monadic_main(i, argc, argv); -} +/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org) + * + * Size reduction. + */ + +#include "libbb.h" + +/* This is a NOFORK applet. Be very careful! */ -extern int -rm_fn(const struct FileInfo * i) +int rm_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int rm_main(int argc UNUSED_PARAM, 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; + int status = 0; + int flags = 0; + unsigned opt; + + opt_complementary = "f-i:i-f"; + /* -v (verbose) is ignored */ + opt = getopt32(argv, "fiRrv"); + argv += optind; + if (opt & 1) + flags |= FILEUTILS_FORCE; + if (opt & 2) + flags |= FILEUTILS_INTERACTIVE; + if (opt & (8|4)) + flags |= FILEUTILS_RECUR; + + if (*argv != NULL) { + do { + const char *base = bb_get_last_path_component_strip(*argv); + + if (DOT_OR_DOTDOT(base)) { + bb_error_msg("cannot remove '.' or '..'"); + } else if (remove_file(*argv, flags) >= 0) { + continue; + } + status = 1; + } while (*++argv); + } else if (!(flags & FILEUTILS_FORCE)) { + bb_show_usage(); } - else - return 0; + + return status; }