XEmacs 21.2-b1
[chise/xemacs-chise.git.1] / lib-src / make-path.c
diff --git a/lib-src/make-path.c b/lib-src/make-path.c
new file mode 100644 (file)
index 0000000..b3de190
--- /dev/null
@@ -0,0 +1,91 @@
+/* Make all the directories along a path.
+   Copyright (C) 1992 Free Software Foundation, Inc.
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs; see the file COPYING.  If not, write to
+the Free the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: FSF 19.28. */
+
+/* This program works like mkdir, except that it generates
+   intermediate directories if they don't exist.  This is just like
+   the `mkdir -p' command on most systems; unfortunately, the mkdir
+   command on some of the purer BSD systems (like Mt. Xinu) don't have
+   that option. */
+
+#ifdef emacs
+#include <../src/config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <errno.h>
+
+extern int errno;
+
+char *prog_name;
+
+static int touchy_mkdir (char *path)
+{
+  struct stat buf;
+
+  /* If PATH already exists and is a directory, return success.  */
+  if (stat (path, &buf) >= 0
+      && (buf.st_mode & S_IFMT) == S_IFDIR)
+    return 0;
+
+  /* Otherwise, try to make it.  If PATH exists but isn't a directory,
+     this will signal an error.  */
+  if (mkdir (path, 0777) < 0)
+    {
+      fprintf (stderr, "%s: ", prog_name);
+      perror (path);
+      return 1;
+    }
+
+  return 0;
+}
+
+int
+main (int argc, char *argv[])
+{
+  prog_name = *argv;
+
+  for (argc--, argv++; argc > 0; argc--, argv++)
+    {
+      char *path = *argv;
+      int i;
+
+      /* Stop at each slash in path and try to create the directory.
+        Skip any initial slash.  */
+      for (i = (path[0] == '/') ? 1 : 0; path[i]; i++)
+       if (path[i] == '/')
+         {
+           path[i] = '\0';
+           if (touchy_mkdir (path) < 0)
+             goto next_pathname;
+           path[i] = '/';
+         }
+
+      touchy_mkdir (path);
+
+    next_pathname:
+      ;
+    }
+
+  return 0;
+}