From 4aca87515a5083ae0e31ce3177189fd43b6d05ac Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 3 Jan 2015 13:58:15 +0100 Subject: patch to Vanilla Tomato 1.28 --- release/src/router/busybox/coreutils/rmdir.c | 69 +++++++++++++--------------- 1 file changed, 33 insertions(+), 36 deletions(-) (limited to 'release/src/router/busybox/coreutils/rmdir.c') diff --git a/release/src/router/busybox/coreutils/rmdir.c b/release/src/router/busybox/coreutils/rmdir.c index 3f603717..2450a43a 100644 --- a/release/src/router/busybox/coreutils/rmdir.c +++ b/release/src/router/busybox/coreutils/rmdir.c @@ -4,39 +4,37 @@ * * Copyright (C) 2003 Manuel Novoa III * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ /* BB_AUDIT SUSv3 compliant */ /* http://www.opengroup.org/onlinepubs/007904975/utilities/rmdir.html */ -#include -#include -#include -#include "busybox.h" +#include "libbb.h" + +/* This is a NOFORK applet. Be very careful! */ -extern int rmdir_main(int argc, char **argv) + +#define PARENTS 0x01 +#define IGNORE_NON_EMPTY 0x02 + +int rmdir_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int rmdir_main(int argc UNUSED_PARAM, char **argv) { int status = EXIT_SUCCESS; int flags; - int do_dot; char *path; - flags = bb_getopt_ulflags(argc, argv, "p"); - +#if ENABLE_FEATURE_RMDIR_LONG_OPTIONS + static const char rmdir_longopts[] ALIGN1 = + "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" + ; + applet_long_options = rmdir_longopts; +#endif + flags = getopt32(argv, "p"); argv += optind; if (!*argv) { @@ -46,27 +44,26 @@ extern 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 == '.'); - - do { + while (1) { if (rmdir(path) < 0) { - bb_perror_msg("`%s'", path); /* Match gnu rmdir msg. */ +#if ENABLE_FEATURE_RMDIR_LONG_OPTIONS + 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 '.'. - */ - if (do_dot || (*path != '.') || path[1]) { + /* Path is now just the parent component. Dirname + * returns "." if there are no parents. + */ + if (NOT_LONE_CHAR(path, '.')) { continue; } } break; - } while (1); - + } } while (*++argv); return status; -- cgit v1.2.3-54-g00ecf