diff src/sysdep.c @ 4438:aaab60c46bff

* config.h.in: Add #undefs for HAVE_MKDIR and HAVE_RMDIR, for configure to edit. * sysdep.c [not HAVE_MKDIR] (mkdir): New function, taken from tar, for use on systems lacking the mkdir function. [not HAVE_RMDIR] (rmdir): New function, taken from tar, for use on systems lacking the rmdir function.
author Jim Blandy <jimb@redhat.com>
date Tue, 03 Aug 1993 07:02:38 +0000
parents ecac48eaacce
children 1ae92cbb80ba
line wrap: on
line diff
--- a/src/sysdep.c	Tue Aug 03 06:57:03 1993 +0000
+++ b/src/sysdep.c	Tue Aug 03 07:02:38 1993 +0000
@@ -3091,6 +3091,118 @@
 #endif /* VMS */
 
 #endif /* NONSYSTEM_DIR_LIBRARY */
+
+
+/* mkdir and rmdir functions, for systems which don't have them.  */
+
+#ifndef HAVE_MKDIR
+/*
+ * Written by Robert Rother, Mariah Corporation, August 1985.
+ *
+ * If you want it, it's yours.  All I ask in return is that if you
+ * figure out how to do this in a Bourne Shell script you send me
+ * a copy.
+ *					sdcsvax!rmr or rmr@uscd
+ *
+ * Severely hacked over by John Gilmore to make a 4.2BSD compatible
+ * subroutine.	11Mar86; hoptoad!gnu
+ *
+ * Modified by rmtodd@uokmax 6-28-87 -- when making an already existing dir,
+ * subroutine didn't return EEXIST.  It does now.
+ */
+
+/*
+ * Make a directory.
+ */
+int
+mkdir (dpath, dmode)
+     char *dpath;
+     int dmode;
+{
+  int cpid, status;
+  struct stat statbuf;
+
+  if (stat (dpath, &statbuf) == 0)
+    {
+      errno = EEXIST;		/* Stat worked, so it already exists */
+      return -1;
+    }
+
+  /* If stat fails for a reason other than non-existence, return error */
+  if (errno != ENOENT)
+    return -1;
+
+  switch (cpid = fork ())
+    {
+
+    case -1:			/* Error in fork() */
+      return (-1);		/* Errno is set already */
+
+    case 0:			/* Child process */
+      /*
+		 * Cheap hack to set mode of new directory.  Since this
+		 * child process is going away anyway, we zap its umask.
+		 * FIXME, this won't suffice to set SUID, SGID, etc. on this
+		 * directory.  Does anybody care?
+		 */
+      status = umask (0);	/* Get current umask */
+      status = umask (status | (0777 & ~dmode));	/* Set for mkdir */
+      execl ("/bin/mkdir", "mkdir", dpath, (char *) 0);
+      _exit (-1);		/* Can't exec /bin/mkdir */
+
+    default:			/* Parent process */
+      while (cpid != wait (&status));	/* Wait for kid to finish */
+    }
+
+  if (WIFSIGNALED (status) || WEXITSTATUS (status) != 0)
+    {
+      errno = EIO;		/* We don't know why, but */
+      return -1;		/* /bin/mkdir failed */
+    }
+
+  return 0;
+}
+#endif /* not HAVE_MKDIR */
+
+#ifndef HAVE_RMDIR
+int
+rmdir (dpath)
+     char *dpath;
+{
+  int cpid, status;
+  struct stat statbuf;
+
+  if (stat (dpath, &statbuf) != 0)
+    {
+      /* Stat just set errno.  We don't have to */
+      return -1;
+    }
+
+  switch (cpid = fork ())
+    {
+
+    case -1:			/* Error in fork() */
+      return (-1);		/* Errno is set already */
+
+    case 0:			/* Child process */
+      execl ("/bin/rmdir", "rmdir", dpath, (char *) 0);
+      _exit (-1);		/* Can't exec /bin/mkdir */
+
+    default:			/* Parent process */
+      while (cpid != wait (&status));	/* Wait for kid to finish */
+    }
+
+  if (WIFSIGNALED (status) || WEXITSTATUS (status) != 0)
+    {
+      errno = EIO;		/* We don't know why, but */
+      return -1;		/* /bin/mkdir failed */
+    }
+
+  return 0;
+}
+#endif /* !HAVE_RMDIR */
+
+
 
 /* Functions for VMS */
 #ifdef VMS