X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Frmdir.c;h=955740494955666e7e4bf8c21861f5fbc41e70c1;hb=3d27d435dbe7d39894257894b9dd32bfa607604c;hp=71d29dd98d0484eb4e3f87058034afb37903c6ac;hpb=9b49a5ed8551e46892af3f676e5d96d21b540e3c;p=oweals%2Fbusybox.git diff --git a/coreutils/rmdir.c b/coreutils/rmdir.c index 71d29dd98..955740494 100644 --- a/coreutils/rmdir.c +++ b/coreutils/rmdir.c @@ -4,27 +4,58 @@ * * Copyright (C) 2003 Manuel Novoa III * - * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ +//config:config RMDIR +//config: bool "rmdir (3.4 kb)" +//config: default y +//config: help +//config: rmdir is used to remove empty directories. + +//applet:IF_RMDIR(APPLET_NOFORK(rmdir, rmdir, BB_DIR_BIN, BB_SUID_DROP, rmdir)) + +//kbuild:lib-$(CONFIG_RMDIR) += rmdir.o /* BB_AUDIT SUSv3 compliant */ /* http://www.opengroup.org/onlinepubs/007904975/utilities/rmdir.html */ -#include +//usage:#define rmdir_trivial_usage +//usage: "[OPTIONS] DIRECTORY..." +//usage:#define rmdir_full_usage "\n\n" +//usage: "Remove DIRECTORY if it is empty\n" +//usage: "\n -p Include parents" +//usage: IF_LONG_OPTS( +//usage: "\n --ignore-fail-on-non-empty" +//usage: ) +//usage: +//usage:#define rmdir_example_usage +//usage: "# rmdir /tmp/foo\n" + #include "libbb.h" /* This is a NOFORK applet. Be very careful! */ +#define PARENTS (1 << 0) +#define VERBOSE ((1 << 1) * ENABLE_FEATURE_VERBOSE) +#define IGNORE_NON_EMPTY ((1 << 2) * ENABLE_LONG_OPTS) + int rmdir_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; -int rmdir_main(int argc, char **argv) +int rmdir_main(int argc UNUSED_PARAM, char **argv) { int status = EXIT_SUCCESS; int flags; - int do_dot; char *path; - flags = getopt32(argv, "p"); + flags = getopt32long(argv, "pv", + "parents\0" No_argument "p" + /* Debian etch: many packages fail to be purged or installed + * because they desperately want this option: */ + "ignore-fail-on-non-empty\0" No_argument "\xff" + IF_FEATURE_VERBOSE( + "verbose\0" No_argument "v" + ) + ); argv += optind; if (!*argv) { @@ -34,27 +65,30 @@ int rmdir_main(int argc, char **argv) do { path = *argv; - /* Record if the first char was a '.' so we can use dirname later. */ - do_dot = (*path == '.'); - while (1) { + if (flags & VERBOSE) { + printf("rmdir: removing directory, '%s'\n", path); + } + if (rmdir(path) < 0) { - bb_perror_msg("'%s'", path); /* Match gnu rmdir msg. */ +#if ENABLE_LONG_OPTS + if ((flags & IGNORE_NON_EMPTY) && errno == ENOTEMPTY) + break; +#endif + bb_perror_msg("'%s'", path); /* Match gnu rmdir msg. */ status = EXIT_FAILURE; - } else if (flags) { - /* Note: path was not empty or null since rmdir succeeded. */ + } else if (flags & PARENTS) { + /* Note: path was not "" since rmdir succeeded. */ path = dirname(path); - /* Path is now just the parent component. Note that dirname - * returns "." if there are no parents. We must distinguish - * this from the case of the original path starting with '.'. + /* Path is now just the parent component. Dirname + * returns "." if there are no parents. */ - if (do_dot || (*path != '.') || path[1]) { + if (NOT_LONE_CHAR(path, '.')) { continue; } } break; } - } while (*++argv); return status;