(__strtol): Remove decl; it doesn't work if __strtol
[gnulib.git] / lib / mkdir.c
index b00199d..1829a9e 100644 (file)
@@ -1,5 +1,5 @@
-/* mkdir.c -- BSD compatible directory functions for System V
-   Copyright (C) 1988, 1990 Free Software Foundation, Inc.
+/* BSD compatible make directory function for System V
+   Copyright (C) 1988, 1990, 1998 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#if defined (CONFIG_BROKETS)
-/* We use <config.h> instead of "config.h" so that a compilation
-   using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
-   (which it would do because it found this file in $srcdir).  */
-#include <config.h>
-#else
-#include "config.h"
-#endif
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#if HAVE_CONFIG_H
+# include <config.h>
 #endif
 
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <errno.h>
-#ifndef STDC_HEADERS
+#ifndef errno
 extern int errno;
 #endif
 
-#ifdef STAT_MACROS_BROKEN
-#ifdef S_ISDIR
-#undef S_ISDIR
+#if STAT_MACROS_BROKEN
+# undef S_ISDIR
 #endif
-#endif /* STAT_MACROS_BROKEN.  */
 
 #if !defined(S_ISDIR) && defined(S_IFDIR)
-#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
+# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
 #endif
 
-#include "safe-stat.h"
+#ifndef S_IRWXU
+# define S_IRWXU 0700
+#endif
+#ifndef S_IRWXG
+# define S_IRWXG 0070
+#endif
+#ifndef S_IRWXO
+# define S_IRWXO 0007
+#endif
 
-/* mkdir and rmdir adapted from GNU tar.  */
+/* mkdir adapted from GNU tar.  */
 
 /* Make directory DPATH, with permission mode DMODE.
 
@@ -59,14 +58,14 @@ extern int errno;
    subroutine didn't return EEXIST.  It does now.  */
 
 int
-mkdir (dpath, dmode)
-     char *dpath;
-     int dmode;
+mkdir (const char *dpath, mode_t dmode)
 {
-  int cpid, status;
+  pid_t cpid;
+  mode_t mode;
+  int status;
   struct stat statbuf;
 
-  if (SAFE_STAT (dpath, &statbuf) == 0)
+  if (stat (dpath, &statbuf) == 0)
     {
       errno = EEXIST;          /* stat worked, so it already exists.  */
       return -1;
@@ -80,69 +79,30 @@ mkdir (dpath, dmode)
   switch (cpid)
     {
     case -1:                   /* Cannot fork.  */
-      return -1;               /* errno is set already.  */
+      return -1;               /* errno is already set.  */
 
     case 0:                    /* Child process.  */
       /* Cheap hack to set mode of new directory.  Since this child
         process is going away anyway, we zap its umask.
         This won't suffice to set SUID, SGID, etc. on this
         directory, so the parent process calls chmod afterward.  */
-      status = umask (0);      /* Get current umask.  */
-      umask (status | (0777 & ~dmode));        /* Set for mkdir.  */
+      mode = umask (0);        /* Get current umask.  */
+      /* Set for mkdir.  */
+      umask (mode | ((S_IRWXU | S_IRWXG | S_IRWXO) & ~dmode));
       execl ("/bin/mkdir", "mkdir", dpath, (char *) 0);
       _exit (1);
 
     default:                   /* Parent process.  */
-      while (wait (&status) != cpid) /* Wait for kid to finish.  */
+      /* Wait for kid to finish.  */
+      while (wait (&status) != cpid)
        /* Do nothing.  */ ;
 
-      if (status & 0xFFFF)
+      if (status)
        {
-         errno = EIO;          /* /bin/mkdir failed.  */
+         /* /bin/mkdir failed.  */
+         errno = EIO;
          return -1;
        }
       return chmod (dpath, dmode);
     }
 }
-
-/* Remove directory DPATH.
-   Return 0 if successful, -1 if not.  */
-
-int
-rmdir (dpath)
-     char *dpath;
-{
-  int cpid, status;
-  struct stat statbuf;
-
-  if (SAFE_STAT (dpath, &statbuf) != 0)
-    return -1;                 /* stat set errno.  */
-
-  if (!S_ISDIR (statbuf.st_mode))
-    {
-      errno = ENOTDIR;
-      return -1;
-    }
-
-  cpid = fork ();
-  switch (cpid)
-    {
-    case -1:                   /* Cannot fork.  */
-      return -1;               /* errno is set already.  */
-
-    case 0:                    /* Child process.  */
-      execl ("/bin/rmdir", "rmdir", dpath, (char *) 0);
-      _exit (1);
-
-    default:                   /* Parent process.  */
-      while (wait (&status) != cpid) /* Wait for kid to finish.  */
-       /* Do nothing.  */ ;
-
-      if (status & 0xFFFF)
-       {
-         errno = EIO;          /* /bin/rmdir failed.  */
-         return -1;
-       }
-      return 0;
-    }
-}