17
17
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18
18
Boston, MA 02111-1307, USA. */
20
/* This file exports two functions: choose_temp_base and make_temp_file. */
22
20
#ifdef HAVE_CONFIG_H
23
21
#include "config.h"
26
24
#include <stdio.h> /* May get P_tmpdir. */
27
#include <sys/types.h>
31
25
#ifdef HAVE_STDLIB_H
32
26
#include <stdlib.h>
34
28
#ifdef HAVE_STRING_H
35
29
#include <string.h>
37
#ifdef HAVE_SYS_FILE_H
38
#include <sys/file.h> /* May get R_OK, etc. on some systems. */
47
32
#include "libiberty.h"
48
extern int mkstemps ();
51
#if defined (__MSDOS__) || (defined (_WIN32) && ! defined (__CYGWIN__) && ! defined (_UWIN))
52
#define DIR_SEPARATOR '\\'
57
#define DIR_SEPARATOR '/'
60
/* On MSDOS, write temp files in current dir
61
because there's no place else we can expect to use. */
62
/* ??? Although the current directory is tried as a last resort,
63
this is left in so that on MSDOS it is preferred to /tmp on the
64
off chance that someone requires this, since that was the previous
33
extern char *choose_tmpdir PARAMS ((void));
72
35
/* Name of temporary file.
73
36
mktemp requires 6 trailing X's. */
74
37
#define TEMP_FILE "ccXXXXXX"
76
/* Subroutine of choose_temp_base.
77
If BASE is non-NULL, return it.
78
Otherwise it checks if DIR is a usable directory.
79
If success, DIR is returned.
80
Otherwise NULL is returned. */
89
&& access (dir, R_OK | W_OK | X_OK) == 0)
94
/* Return a prefix for temporary file names or NULL if unable to find one.
95
The current directory is chosen if all else fails so the program is
96
exited if a temporary directory can't be found (mktemp fails).
97
The buffer for the result is obtained with xmalloc.
99
This function is provided for backwards compatability only. It use
100
is not recommended. */
38
#define TEMP_FILE_LEN (sizeof(TEMP_FILE) - 1)
42
@deftypefn Extension char* choose_temp_base (void)
44
Return a prefix for temporary file names or @code{NULL} if unable to
45
find one. The current directory is chosen if all else fails so the
46
program is exited if a temporary directory can't be found (@code{mktemp}
47
fails). The buffer for the result is obtained with @code{xmalloc}.
49
This function is provided for backwards compatability only. Its use is
103
57
choose_temp_base ()
59
const char *base = choose_tmpdir ();
106
60
char *temp_filename;
108
static char tmp[] = { DIR_SEPARATOR, 't', 'm', 'p', 0 };
109
static char usrtmp[] = { DIR_SEPARATOR, 'u', 's', 'r', DIR_SEPARATOR, 't', 'm', 'p', 0 };
111
base = try (getenv ("TMPDIR"), base);
112
base = try (getenv ("TMP"), base);
113
base = try (getenv ("TEMP"), base);
116
base = try (P_tmpdir, base);
119
/* Try /usr/tmp, then /tmp. */
120
base = try (usrtmp, base);
121
base = try (tmp, base);
123
/* If all else fails, use the current directory! */
127
63
len = strlen (base);
128
temp_filename = xmalloc (len + 1 /*DIR_SEPARATOR*/
129
+ strlen (TEMP_FILE) + 1);
64
temp_filename = xmalloc (len + TEMP_FILE_LEN + 1);
130
65
strcpy (temp_filename, base);
133
&& temp_filename[len-1] != '/'
134
&& temp_filename[len-1] != DIR_SEPARATOR)
135
temp_filename[len++] = DIR_SEPARATOR;
136
66
strcpy (temp_filename + len, TEMP_FILE);
138
68
mktemp (temp_filename);
141
71
return temp_filename;
143
/* Return a temporary file name (as a string) or NULL if unable to create
147
make_temp_file (suffix)
152
int base_len, suffix_len;
154
static char tmp[] = { DIR_SEPARATOR, 't', 'm', 'p', 0 };
155
static char usrtmp[] = { DIR_SEPARATOR, 'u', 's', 'r', DIR_SEPARATOR, 't', 'm', 'p', 0 };
157
base = try (getenv ("TMPDIR"), base);
158
base = try (getenv ("TMP"), base);
159
base = try (getenv ("TEMP"), base);
162
base = try (P_tmpdir, base);
165
/* Try /usr/tmp, then /tmp. */
166
base = try (usrtmp, base);
167
base = try (tmp, base);
169
/* If all else fails, use the current directory! */
173
base_len = strlen (base);
176
suffix_len = strlen (suffix);
180
temp_filename = xmalloc (base_len + 1 /*DIR_SEPARATOR*/
183
strcpy (temp_filename, base);
186
&& temp_filename[base_len-1] != '/'
187
&& temp_filename[base_len-1] != DIR_SEPARATOR)
188
temp_filename[base_len++] = DIR_SEPARATOR;
189
strcpy (temp_filename + base_len, TEMP_FILE);
192
strcat (temp_filename, suffix);
194
fd = mkstemps (temp_filename, suffix_len);
195
/* If mkstemps failed, then something bad is happening. Maybe we should
196
issue a message about a possible security attack in progress? */
199
/* Similarly if we can not close the file. */
202
return temp_filename;