* Makefile.in (exec_prefix): New variable.
[bpt/emacs.git] / lib-src / make-path.c
CommitLineData
d95ba5f0
JB
1/* Make all the directories along a path.
2 Copyright (C) 1992 Free Software Foundation, Inc.
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 1, or (at your option)
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20/* This program works like mkdir, except that it generates
21 intermediate directories if they don't exist. This is just like
22 the `mkdir -p' command on most systems; unfortunately, the mkdir
23 command on some of the purer BSD systems (like Mt. Xinu) don't have
24 that option. */
25
26#include <sys/types.h>
27#include <sys/stat.h>
28#include <stdio.h>
29#include <errno.h>
30
31extern int errno;
32
33char *prog_name;
34
35int touchy_mkdir (path)
36 char *path;
37{
38 struct stat buf;
39
4aa1632a 40 /* If PATH already exists and is a directory, return success. */
d95ba5f0
JB
41 if (stat (path, &buf) >= 0
42 && (buf.st_mode & S_IFMT) == S_IFDIR)
43 return 0;
44
4aa1632a 45 /* Otherwise, try to make it. If PATH exists but isn't a directory,
d95ba5f0
JB
46 this will signal an error. */
47 if (mkdir (path, 0777) < 0)
48 {
49 fprintf (stderr, "%s: ", prog_name);
50 perror (path);
51 return -1;
52 }
53
54 return 0;
55}
56
57int
58main (argc, argv)
59 int argc;
60 char **argv;
61{
62 prog_name = *argv;
63
64 for (argc--, argv++; argc > 0; argc--, argv++)
65 {
66 char *path = *argv;
67 int i;
68
69 /* Stop at each slash in path and try to create the directory.
70 Skip any initial slash. */
71 for (i = (path[0] == '/') ? 1 : 0; path[i]; i++)
72 if (path[i] == '/')
73 {
74 path[i] = '\0';
75 if (touchy_mkdir (path) < 0)
76 goto next_pathname;
77 path[i] = '/';
78 }
79
80 touchy_mkdir (path);
81
82 next_pathname:
83 ;
84 }
85}