17bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes/* $NetBSD: rmdir.c,v 1.26 2011/08/29 14:49:38 joerg Exp $ */ 27bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes 37bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes/*- 47bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * Copyright (c) 1992, 1993, 1994 57bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * The Regents of the University of California. All rights reserved. 67bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * 77bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * Redistribution and use in source and binary forms, with or without 87bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * modification, are permitted provided that the following conditions 97bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * are met: 107bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * 1. Redistributions of source code must retain the above copyright 117bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * notice, this list of conditions and the following disclaimer. 127bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * 2. Redistributions in binary form must reproduce the above copyright 137bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * notice, this list of conditions and the following disclaimer in the 147bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * documentation and/or other materials provided with the distribution. 157bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * 3. Neither the name of the University nor the names of its contributors 167bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * may be used to endorse or promote products derived from this software 177bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * without specific prior written permission. 187bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * 197bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 207bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 217bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 227bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 237bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 247bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 257bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 267bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 277bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 287bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 297bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes * SUCH DAMAGE. 307bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes */ 317bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes 327bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes#include <sys/cdefs.h> 337bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes#ifndef lint 347bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes__COPYRIGHT("@(#) Copyright (c) 1992, 1993, 1994\ 357bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes The Regents of the University of California. All rights reserved."); 367bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes#endif /* not lint */ 377bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes 387bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes#ifndef lint 397bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes#if 0 407bb5660647d0106f96b000c25f5690a45734c38cElliott Hughesstatic char sccsid[] = "@(#)rmdir.c 8.3 (Berkeley) 4/2/94"; 417bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes#else 427bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes__RCSID("$NetBSD: rmdir.c,v 1.26 2011/08/29 14:49:38 joerg Exp $"); 437bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes#endif 447bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes#endif /* not lint */ 457bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes 467bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes#include <sys/param.h> 477bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes 487bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes#include <err.h> 497bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes#include <locale.h> 507bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes#include <stdio.h> 517bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes#include <stdlib.h> 527bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes#include <string.h> 537bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes#include <unistd.h> 547bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes 557bb5660647d0106f96b000c25f5690a45734c38cElliott Hughesstatic int rm_path(char *); 567bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes__dead static void usage(void); 577bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes 587bb5660647d0106f96b000c25f5690a45734c38cElliott Hughesint 597bb5660647d0106f96b000c25f5690a45734c38cElliott Hughesmain(int argc, char *argv[]) 607bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes{ 617bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes int ch, errors, pflag; 627bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes 637bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes setprogname(argv[0]); 647bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes (void)setlocale(LC_ALL, ""); 657bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes 667bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes pflag = 0; 677bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes while ((ch = getopt(argc, argv, "p")) != -1) 687bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes switch(ch) { 697bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes case 'p': 707bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes pflag = 1; 717bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes break; 727bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes case '?': 737bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes default: 747bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes usage(); 757bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes } 767bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes argc -= optind; 777bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes argv += optind; 787bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes 797bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes if (argc == 0) 807bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes usage(); 817bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes 827bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes for (errors = 0; *argv; argv++) { 837bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes /* We rely on the kernel to ignore trailing '/' characters. */ 847bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes if (rmdir(*argv) < 0) { 857bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes warn("%s", *argv); 867bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes errors = 1; 877bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes } else if (pflag) 887bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes errors |= rm_path(*argv); 897bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes } 907bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes 917bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes exit(errors); 927bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes /* NOTREACHED */ 937bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes} 947bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes 957bb5660647d0106f96b000c25f5690a45734c38cElliott Hughesstatic int 967bb5660647d0106f96b000c25f5690a45734c38cElliott Hughesrm_path(char *path) 977bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes{ 987bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes char *p; 997bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes 1007bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes while ((p = strrchr(path, '/')) != NULL) { 1017bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes *p = 0; 1027bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes if (p[1] == 0) 1037bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes /* Ignore trailing '/' on deleted name */ 1047bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes continue; 1057bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes 1067bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes if (rmdir(path) < 0) { 1077bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes warn("%s", path); 1087bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes return (1); 1097bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes } 1107bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes } 1117bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes 1127bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes return (0); 1137bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes} 1147bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes 1157bb5660647d0106f96b000c25f5690a45734c38cElliott Hughesstatic void 1167bb5660647d0106f96b000c25f5690a45734c38cElliott Hughesusage(void) 1177bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes{ 1187bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes (void)fprintf(stderr, "usage: %s [-p] directory ...\n", getprogname()); 1197bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes exit(1); 1207bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes /* NOTREACHED */ 1217bb5660647d0106f96b000c25f5690a45734c38cElliott Hughes} 122