*** empty log message ***
[arla.git] / tests / kill-softly.c
blob867c1d8c7f23414d7022ea541a9afe0964024242
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>
47 #include <err.h>
48 #include <roken.h>
50 #ifdef RCSID
51 RCSID("$Id$");
52 #endif
54 struct entry {
55 char *name;
56 int status;
59 static void
60 kill_one (struct entry *ents, int ind, int curents);
62 static void
63 do_dir (const char *dirname);
65 static void
66 kill_dir (const char *dirname);
68 static void
69 kill_one (struct entry *ents, int ind, int curents)
71 int ret;
72 int i;
74 ret = unlink (ents[ind].name);
75 if (ret < 0) {
76 if (errno == EISDIR || errno == EPERM)
77 do_dir (ents[ind].name);
78 else
79 err (1, "unlink %s", ents[ind].name);
81 ents[ind].status = 0;
82 for (i = 0; i <= ind; ++i) {
83 struct stat sb;
85 ret = lstat (ents[i].name, &sb);
86 if (ret == 0 || errno != ENOENT)
87 err (1, "%s still exists?", ents[i].name);
90 for (i = ind + 1; i < curents; ++i) {
91 struct stat sb;
93 ret = lstat (ents[i].name, &sb);
94 if (ret < 0)
95 err (1, "stat %s", ents[i].name);
99 static void
100 do_dir (const char *dirname)
102 int ret;
104 ret = chdir (dirname);
105 if (ret < 0)
106 err (1, "chdir %s", dirname);
107 kill_dir (dirname);
108 ret = chdir ("..");
109 if (ret < 0)
110 err (1, "chdir ..");
111 ret = rmdir (dirname);
112 if (ret < 0)
113 err (1, "rmdir %s", dirname);
116 static void
117 kill_dir (const char *dirname)
119 struct entry *ents;
120 int maxents;
121 int curents = 0;
122 DIR *dir;
123 struct dirent *dp;
124 int i;
126 dir = opendir (".");
127 if (dir == NULL)
128 err (1, "opendir %s", dirname);
129 maxents = 10;
130 ents = malloc (sizeof (*ents) * maxents);
131 if (ents == NULL)
132 err (1, "malloc");
133 while ((dp = readdir (dir)) != NULL) {
134 if (strcmp (dp->d_name, ".") == 0
135 || strcmp (dp->d_name, "..") == 0)
136 continue;
138 if (curents >= maxents) {
139 maxents *= 2;
140 ents = realloc (ents, sizeof(*ents) * maxents);
141 if (ents == NULL)
142 err (1, "realloc");
144 ents[curents].name = strdup (dp->d_name);
145 ents[curents].status = 1;
146 ++curents;
148 closedir (dir);
149 for (i = 0; i < curents; ++i)
150 kill_one (ents, i, curents);
151 free (ents);
155 main(int argc, char **argv)
157 setprogname (argv[0]);
159 if (argc != 2)
160 errx (1, "usage: %s directory", argv[0]);
161 do_dir (argv[1]);
162 return 0;