comparison lib-src/make-path.c @ 1646:81cdb2347fab

Initial revision
author Jim Blandy <jimb@redhat.com>
date Fri, 04 Dec 1992 19:59:59 +0000
parents
children 3d7bd998e203
comparison
equal deleted inserted replaced
1645:fb092d69da76 1646:81cdb2347fab
1 /* Make all the directories along a path.
2 Copyright (C) 1992 Free Software Foundation, Inc.
3
4 This file is part of GNU Emacs.
5
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 1, or (at your option)
9 any later version.
10
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the 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
31 extern int errno;
32
33 char *prog_name;
34
35 int touchy_mkdir (path)
36 char *path;
37 {
38 struct stat buf;
39
40 fprintf (stderr, "mkdir (\"%s\")\n", path);
41
42 /* If the path already exists and is a directory, return success. */
43 if (stat (path, &buf) >= 0
44 && (buf.st_mode & S_IFMT) == S_IFDIR)
45 return 0;
46
47 /* Otherwise, try to make it. If path exists but isn't a directory,
48 this will signal an error. */
49 if (mkdir (path, 0777) < 0)
50 {
51 fprintf (stderr, "%s: ", prog_name);
52 perror (path);
53 return -1;
54 }
55
56 return 0;
57 }
58
59 int
60 main (argc, argv)
61 int argc;
62 char **argv;
63 {
64 prog_name = *argv;
65
66 for (argc--, argv++; argc > 0; argc--, argv++)
67 {
68 char *path = *argv;
69 int i;
70
71 /* Stop at each slash in path and try to create the directory.
72 Skip any initial slash. */
73 for (i = (path[0] == '/') ? 1 : 0; path[i]; i++)
74 if (path[i] == '/')
75 {
76 path[i] = '\0';
77 if (touchy_mkdir (path) < 0)
78 goto next_pathname;
79 path[i] = '/';
80 }
81
82 touchy_mkdir (path);
83
84 next_pathname:
85 ;
86 }
87 }