Mercurial > emacs
annotate lib-src/make-path.c @ 23323:0800a4f84757
(underlying_strftime):
Set the buffer to a nonzero value before calling
strftime, and check to see whether strftime has set the buffer to zero.
This lets us distinguish between an empty buffer and an error.
I'm installing this patch by hand now; it will be superseded whenever
the glibc sources are propagated back to fsf.org.
| author | Paul Eggert <eggert@twinsun.com> |
|---|---|
| date | Fri, 25 Sep 1998 21:40:23 +0000 |
| parents | 953e5ea2b8ea |
| children |
| rev | line source |
|---|---|
| 1646 | 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 | |
|
6108
b3ea9bc60744
* make-path.c (main): Return 1 on error, not -1. Update GPL.
David J. MacKenzie <djm@gnu.org>
parents:
2978
diff
changeset
|
8 the Free Software Foundation; either version 2, or (at your option) |
| 1646 | 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 | |
|
9050
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
35 /* Create directory DIRNAME if it does not exist already. |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
36 Then give permission for everyone to read and search it. |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
37 Return 0 if successful, 1 if not. */ |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
38 |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
39 int |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
40 touchy_mkdir (dirname) |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
41 char *dirname; |
| 1646 | 42 { |
| 43 struct stat buf; | |
| 44 | |
|
9050
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
45 /* If DIRNAME already exists and is a directory, don't create. */ |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
46 if (! (stat (dirname, &buf) >= 0 |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
47 && (buf.st_mode & S_IFMT) == S_IFDIR)) |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
48 { |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
49 /* Otherwise, try to make it. If DIRNAME exists but isn't a directory, |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
50 this will signal an error. */ |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
51 if (mkdir (dirname, 0777) < 0) |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
52 { |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
53 fprintf (stderr, "%s: ", prog_name); |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
54 perror (dirname); |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
55 return 1; |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
56 } |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
57 } |
| 1646 | 58 |
|
9050
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
59 /* Make sure everyone can look at this directory. */ |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
60 if (stat (dirname, &buf) < 0) |
| 1646 | 61 { |
| 62 fprintf (stderr, "%s: ", prog_name); | |
|
9050
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
63 perror (dirname); |
|
6108
b3ea9bc60744
* make-path.c (main): Return 1 on error, not -1. Update GPL.
David J. MacKenzie <djm@gnu.org>
parents:
2978
diff
changeset
|
64 return 1; |
| 1646 | 65 } |
|
9050
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
66 if (chmod (dirname, 0555 | (buf.st_mode & 0777)) < 0) |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
67 { |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
68 fprintf (stderr, "%s: ", prog_name); |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
69 perror (dirname); |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
70 } |
| 1646 | 71 |
| 72 return 0; | |
| 73 } | |
| 74 | |
| 75 int | |
| 76 main (argc, argv) | |
| 77 int argc; | |
| 78 char **argv; | |
| 79 { | |
| 80 prog_name = *argv; | |
| 81 | |
| 82 for (argc--, argv++; argc > 0; argc--, argv++) | |
| 83 { | |
|
9050
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
84 char *dirname = *argv; |
| 1646 | 85 int i; |
| 86 | |
|
9050
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
87 /* Stop at each slash in dirname and try to create the directory. |
| 1646 | 88 Skip any initial slash. */ |
|
9050
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
89 for (i = (dirname[0] == '/') ? 1 : 0; dirname[i]; i++) |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
90 if (dirname[i] == '/') |
| 1646 | 91 { |
|
9050
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
92 dirname[i] = '\0'; |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
93 if (touchy_mkdir (dirname) < 0) |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
94 goto next_dirname; |
|
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
95 dirname[i] = '/'; |
| 1646 | 96 } |
| 97 | |
|
9050
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
98 touchy_mkdir (dirname); |
| 1646 | 99 |
|
9050
953e5ea2b8ea
(touchy_mkdir): Make dir ugo+re even if it isn't new.
Richard M. Stallman <rms@gnu.org>
parents:
6108
diff
changeset
|
100 next_dirname: |
| 1646 | 101 ; |
| 102 } | |
| 2978 | 103 |
| 104 return 0; | |
| 1646 | 105 } |
