aboutsummaryrefslogtreecommitdiff
path: root/libgfortran/io/unix.c
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>2011-03-19 12:09:27 +0000
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2011-03-19 12:09:27 +0000
commit14bef49e533ced5c3e093f6e555ea98255af9136 (patch)
tree8daf711d7f6d8b47bf84824ba1beb10f9e16069d /libgfortran/io/unix.c
parent5bd4cd72af4b48da82c1bb4d38a5a5532cde1033 (diff)
downloadgcc-14bef49e533ced5c3e093f6e555ea98255af9136.zip
gcc-14bef49e533ced5c3e093f6e555ea98255af9136.tar.gz
gcc-14bef49e533ced5c3e093f6e555ea98255af9136.tar.bz2
re PR libfortran/47439 (Fun with scratch files on Windows MKTEMP only allows for 26 files)
PR libfortran/47439 * io/unix.c (tempfile): Work around poor mktemp() implementations. * gfortran.dg/scratch_1.f90: New test. From-SVN: r171178
Diffstat (limited to 'libgfortran/io/unix.c')
-rw-r--r--libgfortran/io/unix.c38
1 files changed, 33 insertions, 5 deletions
diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c
index 12536ca..edccdd63 100644
--- a/libgfortran/io/unix.c
+++ b/libgfortran/io/unix.c
@@ -1022,6 +1022,12 @@ tempfile (st_parameter_open *opp)
char *template;
const char *slash = "/";
int fd;
+ size_t tempdirlen;
+
+#ifndef HAVE_MKSTEMP
+ int count;
+ size_t slashlen;
+#endif
tempdir = getenv ("GFORTRAN_TMPDIR");
#ifdef __MINGW32__
@@ -1046,16 +1052,19 @@ tempfile (st_parameter_open *opp)
if (tempdir == NULL)
tempdir = DEFAULT_TEMPDIR;
#endif
+
/* Check for special case that tempdir contains slash
or backslash at end. */
- if (*tempdir == 0 || tempdir[strlen (tempdir) - 1] == '/'
+ tempdirlen = strlen (tempdir);
+ if (*tempdir == 0 || tempdir[tempdirlen - 1] == '/'
#ifdef __MINGW32__
- || tempdir[strlen (tempdir) - 1] == '\\'
+ || tempdir[tempdirlen - 1] == '\\'
#endif
)
slash = "";
- template = get_mem (strlen (tempdir) + 20);
+ // Take care that the template is longer in the mktemp() branch.
+ template = get_mem (tempdirlen + 23);
#ifdef HAVE_MKSTEMP
sprintf (template, "%s%sgfortrantmpXXXXXX", tempdir, slash);
@@ -1064,11 +1073,30 @@ tempfile (st_parameter_open *opp)
#else /* HAVE_MKSTEMP */
fd = -1;
+ count = 0;
+ slashlen = strlen (slash);
do
{
- sprintf (template, "%s%sgfortrantmpXXXXXX", tempdir, slash);
+ sprintf (template, "%s%sgfortrantmpaaaXXXXXX", tempdir, slash);
+ if (count > 0)
+ {
+ int c = count;
+ template[tempdirlen + slashlen + 13] = 'a' + (c% 26);
+ c /= 26;
+ template[tempdirlen + slashlen + 12] = 'a' + (c % 26);
+ c /= 26;
+ template[tempdirlen + slashlen + 11] = 'a' + (c % 26);
+ if (c >= 26)
+ break;
+ }
+
if (!mktemp (template))
- break;
+ {
+ errno = EEXIST;
+ count++;
+ continue;
+ }
+
#if defined(HAVE_CRLF) && defined(O_BINARY)
fd = open (template, O_RDWR | O_CREAT | O_EXCL | O_BINARY,
S_IREAD | S_IWRITE);