diff options
author | Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2011-03-19 12:09:27 +0000 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2011-03-19 12:09:27 +0000 |
commit | 14bef49e533ced5c3e093f6e555ea98255af9136 (patch) | |
tree | 8daf711d7f6d8b47bf84824ba1beb10f9e16069d /libgfortran/io/unix.c | |
parent | 5bd4cd72af4b48da82c1bb4d38a5a5532cde1033 (diff) | |
download | gcc-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.c | 38 |
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); |