(chown_cmd): reorder command arguments to match code. Based on patch
[arla.git] / tests / rm-rf.c
blob08f519f1f4d6cdaac20c25f769dd50718c2b8fce
1 /*
2 * Copyright (c) 1995 - 2000 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the Institute nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
34 #ifdef HAVE_CONFIG_H
35 #include <config.h>
36 #endif
38 #include <stdio.h>
39 #include <stdlib.h>
40 #include <string.h>
41 #include <sys/types.h>
42 #include <sys/stat.h>
43 #include <fcntl.h>
44 #include <unistd.h>
45 #include <dirent.h>
46 #include <fs.h>
47 #include <arlalib.h>
48 #include <kafs.h>
50 #include <err.h>
51 #include <roken.h>
53 #ifdef RCSID
54 RCSID("$Id$");
55 #endif
57 static void
58 kill_one (const char *filename);
60 static void
61 kill_dir (const char *dirname);
63 static void
64 do_dir (const char *dirname);
66 #ifdef KERBEROS
67 static int has_afs = 0;
68 #endif
70 static void
71 kill_one (const char *filename)
73 int ret;
75 ret = unlink (filename);
76 if (ret < 0) {
77 if (errno == EISDIR || errno == EPERM)
78 do_dir (filename);
79 else
80 err (1, "unlink %s", filename);
84 static void
85 do_dir (const char *dirname)
87 int ret;
89 #ifdef KERBEROS
90 if (has_afs) {
91 ret = fs_rmmount (dirname);
92 if (ret == 0)
93 return;
95 #endif
97 ret = chdir (dirname);
98 if (ret < 0)
99 err (1, "chdir %s", dirname);
100 kill_dir (dirname);
101 ret = chdir ("..");
102 if (ret < 0)
103 err (1, "chdir ..");
104 ret = rmdir (dirname);
105 if (ret < 0)
106 err (1, "rmdir %s", dirname);
109 static void
110 kill_dir (const char *dirname)
112 DIR *dir;
113 struct dirent *dp;
115 dir = opendir (".");
116 if (dir == NULL)
117 err (1, "opendir %s", dirname);
118 while ((dp = readdir (dir)) != NULL) {
119 if (strcmp (dp->d_name, ".") == 0
120 || strcmp (dp->d_name, "..") == 0)
121 continue;
123 kill_one (dp->d_name);
125 closedir(dir);
129 main(int argc, char **argv)
131 setprogname (argv[0]);
133 #ifdef KERBEROS
134 has_afs = k_hasafs();
135 #endif
137 if (argc < 2)
138 errx (1, "usage: %s directory [...]", argv[0]);
139 while (argc >= 2) {
140 do_dir (argv[1]);
141 argc--;
142 argv++;
144 return 0;