]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - gnu/libexec/uucp/libunix/srmdir.c
unfinished sblive driver, playback/mixer only for now - not enabled in
[FreeBSD/FreeBSD.git] / gnu / libexec / uucp / libunix / srmdir.c
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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21
22    The author of the program may be contacted at ian@airs.com or
23    c/o Cygnus Support, 48 Grove Street, Somerville, MA 02144.
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 \f
38 static int isremove_dir P((const char *, struct stat *, int));
39 \f
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      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 }