annotate mkpath.c @ 1232:5f1bb459e99c

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