|
|
1.1 root 1: /* srmdir.c
2: Remove a directory and all its contents.
3:
4: Copyright (C) 1992 Ian Lance Taylor
5:
6: This file is part of the Taylor UUCP package.
7:
8: This program is free software; you can redistribute it and/or
9: modify it under the terms of the GNU General Public License as
10: published by the Free Software Foundation; either version 2 of the
11: License, or (at your option) any later version.
12:
13: This program is distributed in the hope that it will be useful, but
14: WITHOUT ANY WARRANTY; without even the implied warranty of
15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16: General Public License for more details.
17:
18: You should have received a copy of the GNU General Public License
19: along with this program; if not, write to the Free Software
20: Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21:
22: The author of the program may be contacted at [email protected] or
23: c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
24: */
25:
26: #include "uucp.h"
27:
28: #include "uudefs.h"
29: #include "sysdep.h"
30: #include "system.h"
31:
32: #include <errno.h>
33:
34: #if HAVE_FTW_H
35: #include <ftw.h>
36: #endif
37:
38: static int isremove_dir P((const char *, const struct stat *, int));
39:
40: /* Keep a list of directories to be removed. */
41:
42: struct sdirlist
43: {
44: struct sdirlist *qnext;
45: char *zdir;
46: };
47:
48: static struct sdirlist *qSdirlist;
49:
50: /* Remove a directory and all files in it. */
51:
52: boolean
53: fsysdep_rmdir (zdir)
54: const char *zdir;
55: {
56: boolean fret;
57: struct sdirlist *q;
58:
59: qSdirlist = NULL;
60:
61: fret = TRUE;
62: if (ftw ((char *) zdir, isremove_dir, 5) != 0)
63: {
64: ulog (LOG_ERROR, "ftw: %s", strerror (errno));
65: fret = FALSE;
66: }
67:
68: q = qSdirlist;
69: while (q != NULL)
70: {
71: struct sdirlist *qnext;
72:
73: if (rmdir (q->zdir) != 0)
74: {
75: ulog (LOG_ERROR, "rmdir (%s): %s", q->zdir, strerror (errno));
76: fret = FALSE;
77: }
78: ubuffree (q->zdir);
79: qnext = q->qnext;
80: xfree ((pointer) q);
81: q = qnext;
82: }
83:
84: return fret;
85: }
86:
87: /* Remove a file in a directory. */
88:
89: /*ARGSUSED*/
90: static int
91: isremove_dir (zfile, qstat, iflag)
92: const char *zfile;
93: const struct stat *qstat;
94: int iflag;
95: {
96: if (iflag == FTW_D || iflag == FTW_DNR)
97: {
98: struct sdirlist *q;
99:
100: q = (struct sdirlist *) xmalloc (sizeof (struct sdirlist));
101: q->qnext = qSdirlist;
102: q->zdir = zbufcpy (zfile);
103: qSdirlist = q;
104: }
105: else
106: {
107: if (remove (zfile) != 0)
108: ulog (LOG_ERROR, "remove (%s): %s", zfile, strerror (errno));
109: }
110:
111: return 0;
112: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.