Mercurial > hg > octave-kai > gnulib-hg
annotate lib/tmpdir.c @ 17342:c75939cb6254
merge with default branch
author | Michael Goffioul <michael.goffioul@gmail.com> |
---|---|
date | Thu, 21 Feb 2013 14:57:31 +0000 |
parents | 087501e891d9 |
children | 960eeef4f5eb |
rev | line source |
---|---|
17249
e542fd46ad6f
maint: update all copyright year number ranges
Eric Blake <eblake@redhat.com>
parents:
16214
diff
changeset
|
1 /* Copyright (C) 1999, 2001-2002, 2006, 2009-2013 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 | |
17318
087501e891d9
tmpdir: use secure_getenv
Paul Eggert <eggert@cs.ucla.edu>
parents:
17249
diff
changeset
|
56 # define __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; | |
92 | |
93 if (!pfx || !pfx[0]) | |
94 { | |
95 pfx = "file"; | |
96 plen = 4; | |
97 } | |
98 else | |
99 { | |
100 plen = strlen (pfx); | |
101 if (plen > 5) | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
102 plen = 5; |
7043 | 103 } |
104 | |
105 if (try_tmpdir) | |
106 { | |
107 d = __secure_getenv ("TMPDIR"); | |
108 if (d != NULL && direxists (d)) | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
109 dir = d; |
7043 | 110 else if (dir != NULL && direxists (dir)) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
111 /* nothing */ ; |
7043 | 112 else |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
113 dir = NULL; |
7043 | 114 } |
115 if (dir == NULL) | |
116 { | |
15534
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
117 #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
|
118 char dirbuf[PATH_MAX]; |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
119 DWORD retval; |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
120 |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
121 /* Find Windows temporary file directory. |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
122 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
|
123 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
|
124 directory (unless $TMPDIR is set). */ |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
125 retval = GetTempPath (PATH_MAX, dirbuf); |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
126 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
|
127 dir = dirbuf; |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
128 else |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
129 #endif |
7043 | 130 if (direxists (P_tmpdir)) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
131 dir = P_tmpdir; |
7043 | 132 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
|
133 dir = "/tmp"; |
7043 | 134 else |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
135 { |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
136 __set_errno (ENOENT); |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
137 return -1; |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
138 } |
7043 | 139 } |
140 | |
141 dlen = strlen (dir); | |
142 while (dlen >= 1 && ISSLASH (dir[dlen - 1])) | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
143 dlen--; /* remove trailing slashes */ |
7043 | 144 |
145 /* check we have room for "${dir}/${pfx}XXXXXX\0" */ | |
146 if (tmpl_len < dlen + 1 + plen + 6 + 1) | |
147 { | |
148 __set_errno (EINVAL); | |
149 return -1; | |
150 } | |
151 | |
152 sprintf (tmpl, "%.*s/%.*sXXXXXX", (int) dlen, dir, (int) plen, pfx); | |
153 return 0; | |
154 } |