315
|
1 /* rmdir.c -- BSD compatible remove directory function for System V |
|
2 Copyright (C) 1988, 1990 Free Software Foundation, Inc. |
|
3 |
|
4 This program is free software; you can redistribute it and/or modify |
|
5 it under the terms of the GNU General Public License as published by |
|
6 the Free Software Foundation; either version 2, or (at your option) |
|
7 any later version. |
|
8 |
|
9 This program is distributed in the hope that it will be useful, |
|
10 but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 GNU General Public License for more details. |
|
13 |
|
14 You should have received a copy of the GNU General Public License |
|
15 along with this program; if not, write to the Free Software |
|
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ |
|
17 |
|
18 #ifdef HAVE_CONFIG_H |
|
19 #if defined (CONFIG_BROKETS) |
|
20 /* We use <config.h> instead of "config.h" so that a compilation |
|
21 using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h |
|
22 (which it would do because it found this file in $srcdir). */ |
|
23 #include <config.h> |
|
24 #else |
|
25 #include "config.h" |
|
26 #endif |
|
27 #endif |
|
28 |
|
29 #include <sys/types.h> |
|
30 #include <sys/stat.h> |
|
31 |
|
32 #include <errno.h> |
|
33 #ifndef errno |
|
34 extern int errno; |
|
35 #endif |
|
36 |
|
37 #ifdef STAT_MACROS_BROKEN |
|
38 #undef S_ISDIR |
|
39 #endif |
|
40 |
|
41 #if !defined(S_ISDIR) && defined(S_IFDIR) |
|
42 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) |
|
43 #endif |
|
44 |
|
45 #include "safe-stat.h" |
|
46 |
|
47 /* rmdir adapted from GNU tar. */ |
|
48 |
|
49 /* Remove directory DPATH. |
|
50 Return 0 if successful, -1 if not. */ |
|
51 |
|
52 int |
|
53 rmdir (dpath) |
|
54 char *dpath; |
|
55 { |
|
56 int cpid, status; |
|
57 struct stat statbuf; |
|
58 |
|
59 if (SAFE_STAT (dpath, &statbuf) != 0) |
|
60 return -1; /* errno already set */ |
|
61 |
|
62 if (!S_ISDIR (statbuf.st_mode)) |
|
63 { |
|
64 errno = ENOTDIR; |
|
65 return -1; |
|
66 } |
|
67 |
|
68 cpid = fork (); |
|
69 switch (cpid) |
|
70 { |
|
71 case -1: /* cannot fork */ |
|
72 return -1; /* errno already set */ |
|
73 |
|
74 case 0: /* child process */ |
|
75 execl ("/bin/rmdir", "rmdir", dpath, (char *) 0); |
|
76 _exit (1); |
|
77 |
|
78 default: /* parent process */ |
|
79 |
|
80 /* Wait for kid to finish. */ |
|
81 |
|
82 while (wait (&status) != cpid) |
|
83 /* Do nothing. */ ; |
|
84 |
|
85 if (status & 0xFFFF) |
|
86 { |
|
87 |
|
88 /* /bin/rmdir failed. */ |
|
89 |
|
90 errno = EIO; |
|
91 return -1; |
|
92 } |
|
93 return 0; |
|
94 } |
|
95 } |