Mercurial > hg > octave-lojdl > gnulib-hg
annotate lib/tmpdir.c @ 17102:9e72d3927af1
binary-io, eealloc, mbfile, mbiter, mbutil, xsize: better 'inline'
* lib/binary-io.c, lib/eealloc.c, lib/mbfile.c, lib/mbiter.c:
* lib/mbuiter.c, lib/xsize.c: New files.
* lib/binary-io.h (BINARY_IO_INLINE):
* lib/eealloc.h (EEALLOC_INLINE):
* lib/mbfile.h (MBFILE_INLINE):
* lib/mbiter.h (MBITER_INLINE):
* lib/mbuiter.h (MBUITER_INLINE):
* lib/xsize.h (XSIZE_INLINE):
New macros.
Replace all uses of 'static inline' with them.
Use _GL_INLINE_HEADER_BEGIN, _GL_INLINE_HEADER_END.
* m4/eealloc.m4 (gl_EEALLOC):
* m4/mbfile.m4 (gl_MBFILE):
* m4/mbiter.m4 (gl_MBITER):
* m4/xsize.m4 (gl_XSIZE):
Do not require AC_C_INLINE.
* modules/binary-io (Files, lib_SOURCES): Add lib/binary-io.c
* modules/eealloc (Files, lib_SOURCES): Add lib/eealloc.c.
* modules/mbfile (Files, lib_SOURCES): Add lib/mbfile.c.
* modules/mbiter (Files, lib_SOURCES): Add lib/mbiter.c.
* modules/mbuiter (Files, lib_SOURCES): Add lib/mbuiter.c.
* modules/xsize (Files, lib_SOURCES): Add lib/xsize.c.
* modules/binary-io, modules/eealloc, modules/mbfile:
* modules/mbiter, modules/mbuiter:
(Depends-on): Add extern-inline.
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Wed, 29 Aug 2012 23:13:42 -0700 |
parents | ec738d6aeef5 |
children | e542fd46ad6f |
rev | line source |
---|---|
16201
8250f2777afc
maint: update all copyright year number ranges
Jim Meyering <meyering@redhat.com>
parents:
15534
diff
changeset
|
1 /* Copyright (C) 1999, 2001-2002, 2006, 2009-2012 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 | |
56 # define __xstat64(version, path, buf) stat (path, buf) | |
57 #endif | |
58 | |
59 #if ! (HAVE___SECURE_GETENV || _LIBC) | |
60 # define __secure_getenv getenv | |
61 #endif | |
62 | |
63 /* Pathname support. | |
64 ISSLASH(C) tests whether C is a directory separator character. | |
65 */ | |
66 #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
|
67 /* Native Windows, Cygwin, OS/2, DOS */ |
7043 | 68 # define ISSLASH(C) ((C) == '/' || (C) == '\\') |
69 #else | |
70 /* Unix */ | |
71 # define ISSLASH(C) ((C) == '/') | |
72 #endif | |
73 | |
74 | |
75 /* Return nonzero if DIR is an existent directory. */ | |
76 static bool | |
77 direxists (const char *dir) | |
78 { | |
79 struct_stat64 buf; | |
80 return __xstat64 (_STAT_VER, dir, &buf) == 0 && S_ISDIR (buf.st_mode); | |
81 } | |
82 | |
83 /* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is | |
84 non-null and exists, uses it; otherwise uses the first of $TMPDIR, | |
85 P_tmpdir, /tmp that exists. Copies into TMPL a template suitable | |
86 for use with mk[s]temp. Will fail (-1) if DIR is non-null and | |
87 doesn't exist, none of the searched dirs exists, or there's not | |
88 enough space in TMPL. */ | |
89 int | |
90 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
|
91 bool try_tmpdir) |
7043 | 92 { |
93 const char *d; | |
94 size_t dlen, plen; | |
95 | |
96 if (!pfx || !pfx[0]) | |
97 { | |
98 pfx = "file"; | |
99 plen = 4; | |
100 } | |
101 else | |
102 { | |
103 plen = strlen (pfx); | |
104 if (plen > 5) | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
105 plen = 5; |
7043 | 106 } |
107 | |
108 if (try_tmpdir) | |
109 { | |
110 d = __secure_getenv ("TMPDIR"); | |
111 if (d != NULL && direxists (d)) | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
112 dir = d; |
7043 | 113 else if (dir != NULL && direxists (dir)) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
114 /* nothing */ ; |
7043 | 115 else |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
116 dir = NULL; |
7043 | 117 } |
118 if (dir == NULL) | |
119 { | |
15534
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
120 #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
|
121 char dirbuf[PATH_MAX]; |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
122 DWORD retval; |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
123 |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
124 /* Find Windows temporary file directory. |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
125 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
|
126 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
|
127 directory (unless $TMPDIR is set). */ |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
128 retval = GetTempPath (PATH_MAX, dirbuf); |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
129 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
|
130 dir = dirbuf; |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
131 else |
3ef509e539a1
tmpdir: Use a good default directory on native Windows.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
132 #endif |
7043 | 133 if (direxists (P_tmpdir)) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
134 dir = P_tmpdir; |
7043 | 135 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
|
136 dir = "/tmp"; |
7043 | 137 else |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
138 { |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
139 __set_errno (ENOENT); |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
140 return -1; |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
141 } |
7043 | 142 } |
143 | |
144 dlen = strlen (dir); | |
145 while (dlen >= 1 && ISSLASH (dir[dlen - 1])) | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
146 dlen--; /* remove trailing slashes */ |
7043 | 147 |
148 /* check we have room for "${dir}/${pfx}XXXXXX\0" */ | |
149 if (tmpl_len < dlen + 1 + plen + 6 + 1) | |
150 { | |
151 __set_errno (EINVAL); | |
152 return -1; | |
153 } | |
154 | |
155 sprintf (tmpl, "%.*s/%.*sXXXXXX", (int) dlen, dir, (int) plen, pfx); | |
156 return 0; | |
157 } |