From 11bde14e4fdf4e2c4c49c85be790bfb080e68170 Mon Sep 17 00:00:00 2001 From: Steve Price Date: Sat, 14 Dec 1996 06:13:51 +0000 Subject: [PATCH] -Wall cleaning and implement -p commandline option. -p mod obtained from: NetBSD --- bin/rmdir/rmdir.1 | 32 ++++++++++++++--------------- bin/rmdir/rmdir.c | 52 ++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 61 insertions(+), 23 deletions(-) diff --git a/bin/rmdir/rmdir.1 b/bin/rmdir/rmdir.1 index 30d0fa54744c..8ae09ecdaa85 100644 --- a/bin/rmdir/rmdir.1 +++ b/bin/rmdir/rmdir.1 @@ -33,7 +33,7 @@ .\" SUCH DAMAGE. .\" .\" @(#)rmdir.1 8.1 (Berkeley) 5/31/93 -.\" $Id: rmdir.1,v 1.2 1994/09/24 02:57:11 davidg Exp $ +.\" $Id: rmdir.1,v 1.3 1996/08/29 18:06:08 wosch Exp $ .\" .Dd May 31, 1993 .Dt RMDIR 1 @@ -43,7 +43,7 @@ .Nd remove directories .Sh SYNOPSIS .Nm rmdir -.\" .Op Fl p +.Op Fl p .Ar directory ... .Sh DESCRIPTION The rmdir utility removes the directory entry specified by @@ -58,24 +58,24 @@ must be specified first so the parent directory is empty when .Nm rmdir tries to remove it. -.\" .Pp -.\" The following option is available: -.\" .Bl -tag -width Ds -.\" .It Fl p -.\" Each -.\" .Ar directory -.\" argument is treated as a pathname of which all -.\" components will be removed, if they are empty, -.\" starting with the last most component. -.\" (See -.\" .Xr rm 1 -.\" for fully non-discriminant recursive removal). -.\" .El +.Pp +The following option is available: +.Bl -tag -width Ds +.It Fl p +Each +.Ar directory +argument is treated as a pathname of which all +components will be removed, if they are empty, +starting with the last most component. +(See +.Xr rm 1 +for fully non-discriminant recursive removal.) +.El .Pp The .Nm rmdir utility exits with one of the following values: -.Bl -tag -width flag +.Bl -tag -width Ds .It Li \&0 Each directory entry specified by a dir operand referred to an empty directory and was removed diff --git a/bin/rmdir/rmdir.c b/bin/rmdir/rmdir.c index e47cbb2bdba1..b9151dd17e60 100644 --- a/bin/rmdir/rmdir.c +++ b/bin/rmdir/rmdir.c @@ -30,17 +30,17 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id$ + * $Id: rmdir.c,v 1.2 1994/09/24 02:57:13 davidg Exp $ */ #ifndef lint -static char copyright[] = +static char const copyright[] = "@(#) Copyright (c) 1992, 1993, 1994\n\ The Regents of the University of California. All rights reserved.\n"; #endif /* not lint */ #ifndef lint -static char sccsid[] = "@(#)rmdir.c 8.3 (Berkeley) 4/2/94"; +static char const sccsid[] = "@(#)rmdir.c 8.3 (Berkeley) 4/2/94"; #endif /* not lint */ #include @@ -50,6 +50,7 @@ static char sccsid[] = "@(#)rmdir.c 8.3 (Berkeley) 4/2/94"; #include #include +int rm_path __P((char *)); void usage __P((void)); int @@ -58,9 +59,14 @@ main(argc, argv) char *argv[]; { int ch, errors; + int pflag; - while ((ch = getopt(argc, argv, "")) != EOF) + pflag = 0; + while ((ch = getopt(argc, argv, "p")) != EOF) switch(ch) { + case 'p': + pflag = 1; + break; case '?': default: usage(); @@ -71,18 +77,50 @@ main(argc, argv) if (argc == 0) usage(); - for (errors = 0; *argv; ++argv) + for (errors = 0; *argv; argv++) { + char *p; + + /* Delete trailing slashes, per POSIX. */ + p = *argv + strlen(*argv); + while (--p > *argv && *p == '/') + ; + *++p = '\0'; + if (rmdir(*argv) < 0) { warn("%s", *argv); errors = 1; - } + } else if (pflag) + errors |= rm_path(*argv); + } + exit(errors); } +int +rm_path(path) + char *path; +{ + char *p; + + while ((p = strrchr(path, '/')) != NULL) { + /* Delete trailing slashes. */ + while (--p > path && *p == '/') + ; + *++p = '\0'; + + if (rmdir(path) < 0) { + warn("%s", path); + return (1); + } + } + + return (0); +} + void usage() { - (void)fprintf(stderr, "usage: rmdir directory ...\n"); + (void)fprintf(stderr, "usage: rmdir [-p] directory ...\n"); exit(1); }