Mercurial > hg > octave-jordi > gnulib-hg
annotate lib/tmpdir.c @ 18070:d460ec17f09f
autoupdate
author | Karl Berry <karl@freefriends.org> |
---|---|
date | Tue, 28 Jul 2015 13:57:32 -0700 |
parents | ab58d4870664 |
children |
rev | line source |
---|---|
17848 | 1 /* Copyright (C) 1999, 2001-2002, 2006, 2009-2015 Free Software Foundation, |
12559
c2cbabec01dd
update nearly all FSF copyright year lists to include 2010
Jim Meyering <meyering@redhat.com>
parents:
12518
diff
changeset
|
2 Inc. |
7043 | 3 This file is part of the GNU C Library. |
4 | |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
7588
diff
changeset
|
5 This program is free software: you can redistribute it and/or modify |
7139
adb21c293305
Add copyright notices to long-enough files that lack them, since
Paul Eggert <eggert@cs.ucla.edu>
parents:
7043
diff
changeset
|
6 it under the terms of the GNU General Public License as published by |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
7588
diff
changeset
|
7 the Free Software Foundation; either version 3 of the License, or |
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
7588
diff
changeset
|
8 (at your option) any later version. |
7043 | 9 |
7139
adb21c293305
Add copyright notices to long-enough files that lack them, since
Paul Eggert <eggert@cs.ucla.edu>
parents:
7043
diff
changeset
|
10 This program is distributed in the hope that it will be useful, |
7043 | 11 but WITHOUT ANY WARRANTY; without even the implied warranty of |
7139
adb21c293305
Add copyright notices to long-enough files that lack them, since
Paul Eggert <eggert@cs.ucla.edu>
parents:
7043
diff
changeset
|
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
adb21c293305
Add copyright notices to long-enough files that lack them, since
Paul Eggert <eggert@cs.ucla.edu>
parents:
7043
diff
changeset
|
13 GNU General Public License for more details. |
7043 | 14 |
7139
adb21c293305
Add copyright notices to long-enough files that lack them, since
Paul Eggert <eggert@cs.ucla.edu>
parents:
7043
diff
changeset
|
15 You should have received a copy of the GNU General Public License |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
7588
diff
changeset
|
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
7043 | 17 |
18 /* Extracted from sysdeps/posix/tempname.c. */ | |
19 | |
7304
1c4ed7637c24
Include <config.h> unconditionally.
Bruno Haible <bruno@clisp.org>
parents:
7139
diff
changeset
|
20 #include <config.h> |
7043 | 21 |
22 /* Specification. */ | |
23 #include "tmpdir.h" | |
24 | |
25 #include <stdbool.h> | |
26 #include <stdlib.h> | |
27 #include <string.h> | |
28 | |
29 #include <errno.h> | |
30 #ifndef __set_errno | |
31 # define __set_errno(Val) errno = (Val) | |
32 #endif | |
33 | |
34 #include <stdio.h> | |
35 #ifndef P_tmpdir | |
15534
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
36 # ifdef _P_tmpdir /* native Windows */ |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
37 # define P_tmpdir _P_tmpdir |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
38 # else |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
39 # define P_tmpdir "/tmp" |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
40 # endif |
7043 | 41 #endif |
42 | |
43 #include <sys/stat.h> | |
44 | |
15534
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
45 #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
46 # define WIN32_LEAN_AND_MEAN /* avoid including junk */ |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
47 # include <windows.h> |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
48 #endif |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
49 |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
50 #include "pathmax.h" |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
51 |
7043 | 52 #if _LIBC |
53 # define struct_stat64 struct stat64 | |
54 #else | |
55 # define struct_stat64 struct stat | |
17449
960eeef4f5eb
tmpdir: port to VMS, to // != /, and to long dirs
Paul Eggert <eggert@cs.ucla.edu>
parents:
17318
diff
changeset
|
56 # define __libc_secure_getenv secure_getenv |
7043 | 57 # define __xstat64(version, path, buf) stat (path, buf) |
58 #endif | |
59 | |
60 /* Pathname support. | |
61 ISSLASH(C) tests whether C is a directory separator character. | |
62 */ | |
63 #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ | |
16214
ec738d6aeef5
Talk about "native Windows API", not "Win32".
Bruno Haible <bruno@clisp.org>
parents:
16201
diff
changeset
|
64 /* Native Windows, Cygwin, OS/2, DOS */ |
7043 | 65 # define ISSLASH(C) ((C) == '/' || (C) == '\\') |
66 #else | |
67 /* Unix */ | |
68 # define ISSLASH(C) ((C) == '/') | |
69 #endif | |
70 | |
71 | |
72 /* Return nonzero if DIR is an existent directory. */ | |
73 static bool | |
74 direxists (const char *dir) | |
75 { | |
76 struct_stat64 buf; | |
77 return __xstat64 (_STAT_VER, dir, &buf) == 0 && S_ISDIR (buf.st_mode); | |
78 } | |
79 | |
80 /* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is | |
81 non-null and exists, uses it; otherwise uses the first of $TMPDIR, | |
82 P_tmpdir, /tmp that exists. Copies into TMPL a template suitable | |
83 for use with mk[s]temp. Will fail (-1) if DIR is non-null and | |
84 doesn't exist, none of the searched dirs exists, or there's not | |
85 enough space in TMPL. */ | |
86 int | |
87 path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx, | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
88 bool try_tmpdir) |
7043 | 89 { |
90 const char *d; | |
91 size_t dlen, plen; | |
17450
fcdfb5b7741a
* lib/tmpdir.c: Simplify code to add slash; no need for a loop.
Paul Eggert <eggert@cs.ucla.edu>
parents:
17449
diff
changeset
|
92 bool add_slash; |
7043 | 93 |
94 if (!pfx || !pfx[0]) | |
95 { | |
96 pfx = "file"; | |
97 plen = 4; | |
98 } | |
99 else | |
100 { | |
101 plen = strlen (pfx); | |
102 if (plen > 5) | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
103 plen = 5; |
7043 | 104 } |
105 | |
106 if (try_tmpdir) | |
107 { | |
17449
960eeef4f5eb
tmpdir: port to VMS, to // != /, and to long dirs
Paul Eggert <eggert@cs.ucla.edu>
parents:
17318
diff
changeset
|
108 d = __libc_secure_getenv ("TMPDIR"); |
7043 | 109 if (d != NULL && direxists (d)) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
110 dir = d; |
7043 | 111 else if (dir != NULL && direxists (dir)) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
112 /* nothing */ ; |
7043 | 113 else |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
114 dir = NULL; |
7043 | 115 } |
116 if (dir == NULL) | |
117 { | |
15534
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
118 #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
119 char dirbuf[PATH_MAX]; |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
120 DWORD retval; |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
121 |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
122 /* Find Windows temporary file directory. |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
123 We try this before P_tmpdir because Windows defines P_tmpdir to "\\" |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
124 and will therefore try to put all temporary files in the root |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
125 directory (unless $TMPDIR is set). */ |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
126 retval = GetTempPath (PATH_MAX, dirbuf); |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
127 if (retval > 0 && retval < PATH_MAX && direxists (dirbuf)) |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
128 dir = dirbuf; |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
129 else |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
130 #endif |
7043 | 131 if (direxists (P_tmpdir)) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
132 dir = P_tmpdir; |
7043 | 133 else if (strcmp (P_tmpdir, "/tmp") != 0 && direxists ("/tmp")) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
134 dir = "/tmp"; |
7043 | 135 else |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
136 { |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
137 __set_errno (ENOENT); |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
138 return -1; |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
139 } |
7043 | 140 } |
141 | |
142 dlen = strlen (dir); | |
17452
0fa92a6e12b9
tmpdir: fix bug in VMS port
Paul Eggert <eggert@cs.ucla.edu>
parents:
17451
diff
changeset
|
143 #ifdef __VMS |
0fa92a6e12b9
tmpdir: fix bug in VMS port
Paul Eggert <eggert@cs.ucla.edu>
parents:
17451
diff
changeset
|
144 add_slash = 0; |
0fa92a6e12b9
tmpdir: fix bug in VMS port
Paul Eggert <eggert@cs.ucla.edu>
parents:
17451
diff
changeset
|
145 #else |
17450
fcdfb5b7741a
* lib/tmpdir.c: Simplify code to add slash; no need for a loop.
Paul Eggert <eggert@cs.ucla.edu>
parents:
17449
diff
changeset
|
146 add_slash = dlen != 0 && !ISSLASH (dir[dlen - 1]); |
fcdfb5b7741a
* lib/tmpdir.c: Simplify code to add slash; no need for a loop.
Paul Eggert <eggert@cs.ucla.edu>
parents:
17449
diff
changeset
|
147 #endif |
7043 | 148 |
149 /* check we have room for "${dir}/${pfx}XXXXXX\0" */ | |
17449
960eeef4f5eb
tmpdir: port to VMS, to // != /, and to long dirs
Paul Eggert <eggert@cs.ucla.edu>
parents:
17318
diff
changeset
|
150 if (tmpl_len < dlen + add_slash + plen + 6 + 1) |
7043 | 151 { |
152 __set_errno (EINVAL); | |
153 return -1; | |
154 } | |
155 | |
17449
960eeef4f5eb
tmpdir: port to VMS, to // != /, and to long dirs
Paul Eggert <eggert@cs.ucla.edu>
parents:
17318
diff
changeset
|
156 memcpy (tmpl, dir, dlen); |
17451
1c64d8246a92
tmpdir: fix typo in previous change
Paul Eggert <eggert@cs.ucla.edu>
parents:
17450
diff
changeset
|
157 sprintf (tmpl + dlen, &"/%.*sXXXXXX"[!add_slash], (int) plen, pfx); |
7043 | 158 return 0; |
159 } |