home *** CD-ROM | disk | FTP | other *** search
/ PC-Online 1996 May / PCOnline_05_1996.bin / linux / source / a / bin / fileutil.12 / fileutil / fileutils-3.12 / lib / rmdir.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-08  |  1.9 KB  |  89 lines

  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. #include <config.h>
  20. #endif
  21.  
  22. #include <sys/types.h>
  23. #include <sys/stat.h>
  24.  
  25. #include <errno.h>
  26. #ifndef errno
  27. extern int errno;
  28. #endif
  29.  
  30. #ifdef STAT_MACROS_BROKEN
  31. #undef S_ISDIR
  32. #endif
  33.  
  34. #if !defined(S_ISDIR) && defined(S_IFDIR)
  35. #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
  36. #endif
  37.  
  38. #include "safe-stat.h"
  39.  
  40. /* rmdir adapted from GNU tar.  */
  41.  
  42. /* Remove directory DPATH.
  43.    Return 0 if successful, -1 if not.  */
  44.  
  45. int
  46. rmdir (dpath)
  47.      char *dpath;
  48. {
  49.   int cpid, status;
  50.   struct stat statbuf;
  51.  
  52.   if (SAFE_STAT (dpath, &statbuf) != 0)
  53.     return -1;            /* errno already set */
  54.  
  55.   if (!S_ISDIR (statbuf.st_mode))
  56.     {
  57.       errno = ENOTDIR;
  58.       return -1;
  59.     }
  60.  
  61.   cpid = fork ();
  62.   switch (cpid)
  63.     {
  64.     case -1:            /* cannot fork */
  65.       return -1;        /* errno already set */
  66.  
  67.     case 0:            /* child process */
  68.       execl ("/bin/rmdir", "rmdir", dpath, (char *) 0);
  69.       _exit (1);
  70.  
  71.     default:            /* parent process */
  72.  
  73.       /* Wait for kid to finish.  */
  74.  
  75.       while (wait (&status) != cpid)
  76.     /* Do nothing.  */ ;
  77.  
  78.       if (status & 0xFFFF)
  79.     {
  80.  
  81.       /* /bin/rmdir failed.  */
  82.  
  83.       errno = EIO;
  84.       return -1;
  85.     }
  86.       return 0;
  87.     }
  88. }
  89.