1/* BSD compatible remove directory function for System V
2
3   Copyright (C) 1988, 1990, 1999, 2003, 2004, 2005, 2006 Free
4   Software Foundation, Inc.
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program; if not, write to the Free Software Foundation,
18   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
19
20#include <config.h>
21
22#include <sys/types.h>
23#include <sys/stat.h>
24#include <errno.h>
25
26/* rmdir adapted from GNU tar.  */
27
28/* Remove directory DIR.
29   Return 0 if successful, -1 if not.  */
30
31int
32rmdir (char const *dir)
33{
34  pid_t cpid;
35  int status;
36  struct stat statbuf;
37
38  if (stat (dir, &statbuf) != 0)
39    return -1;			/* errno already set */
40
41  if (!S_ISDIR (statbuf.st_mode))
42    {
43      errno = ENOTDIR;
44      return -1;
45    }
46
47  cpid = fork ();
48  switch (cpid)
49    {
50    case -1:			/* cannot fork */
51      return -1;		/* errno already set */
52
53    case 0:			/* child process */
54      execl ("/bin/rmdir", "rmdir", dir, (char *) 0);
55      _exit (1);
56
57    default:			/* parent process */
58
59      /* Wait for kid to finish.  */
60
61      while (wait (&status) != cpid)
62	/* Do nothing.  */ ;
63
64      if (status)
65	{
66
67	  /* /bin/rmdir failed.  */
68
69	  errno = EIO;
70	  return -1;
71	}
72      return 0;
73    }
74}
75