blob: 1d6b2cadb5cc3db40aa053c650fffc62fac5e35f [file] [log] [blame]
Erik Andersene49d5ec2000-02-08 19:58:47 +00001/* vi: set sw=4 ts=4: */
Eric Andersenf6be9441999-10-13 21:12:06 +00002/*
Manuel Novoa III cad53642003-03-19 09:13:01 +00003 * rmdir implementation for busybox
Eric Andersenf6be9441999-10-13 21:12:06 +00004 *
Manuel Novoa III cad53642003-03-19 09:13:01 +00005 * Copyright (C) 2003 Manuel Novoa III <mjn3@codepoet.org>
Eric Andersenf6be9441999-10-13 21:12:06 +00006 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 *
21 */
22
Manuel Novoa III cad53642003-03-19 09:13:01 +000023/* BB_AUDIT SUSv3 compliant */
24/* http://www.opengroup.org/onlinepubs/007904975/utilities/rmdir.html */
Matt Kraai13506662001-08-29 21:18:47 +000025
Manuel Novoa III cad53642003-03-19 09:13:01 +000026#include <stdlib.h>
27#include <unistd.h>
28#include <libgen.h>
Eric Andersencbe31da2001-02-20 06:14:08 +000029#include "busybox.h"
Eric Andersencc8ed391999-10-05 16:24:54 +000030
Manuel Novoa III cad53642003-03-19 09:13:01 +000031extern int rmdir_main(int argc, char **argv)
Eric Andersencc8ed391999-10-05 16:24:54 +000032{
Matt Kraai9a71af52000-11-22 01:09:38 +000033 int status = EXIT_SUCCESS;
Manuel Novoa III cad53642003-03-19 09:13:01 +000034 int flags;
35 int do_dot;
36 char *path;
Matt Kraai9a71af52000-11-22 01:09:38 +000037
Manuel Novoa III cad53642003-03-19 09:13:01 +000038 flags = bb_getopt_ulflags(argc, argv, "p");
Matt Kraai13506662001-08-29 21:18:47 +000039
Manuel Novoa III cad53642003-03-19 09:13:01 +000040 argv += optind;
Matt Kraai13506662001-08-29 21:18:47 +000041
Manuel Novoa III cad53642003-03-19 09:13:01 +000042 if (!*argv) {
43 bb_show_usage();
44 }
Erik Andersene49d5ec2000-02-08 19:58:47 +000045
Manuel Novoa III cad53642003-03-19 09:13:01 +000046 do {
47 path = *argv;
48
49 /* Record if the first char was a '.' so we can use dirname later. */
50 do_dot = (*path == '.');
51
52 do {
53 if (rmdir(path) < 0) {
54 bb_perror_msg("`%s'", path); /* Match gnu rmdir msg. */
55 status = EXIT_FAILURE;
56 } else if (flags) {
57 /* Note: path was not empty or null since rmdir succeeded. */
58 path = dirname(path);
59 /* Path is now just the parent component. Note that dirname
60 * returns "." if there are no parents. We must distinguish
61 * this from the case of the original path starting with '.'.
Tim Rikerc1ef7bd2006-01-25 00:08:53 +000062 */
Manuel Novoa III cad53642003-03-19 09:13:01 +000063 if (do_dot || (*path != '.') || path[1]) {
64 continue;
65 }
66 }
67 break;
68 } while (1);
Eric Andersenc7bda1c2004-03-15 08:29:22 +000069
Manuel Novoa III cad53642003-03-19 09:13:01 +000070 } while (*++argv);
Matt Kraai13506662001-08-29 21:18:47 +000071
Matt Kraai9a71af52000-11-22 01:09:38 +000072 return status;
Eric Andersencc8ed391999-10-05 16:24:54 +000073}