From 14bef49e533ced5c3e093f6e555ea98255af9136 Mon Sep 17 00:00:00 2001 From: Francois-Xavier Coudert Date: Sat, 19 Mar 2011 12:09:27 +0000 Subject: [PATCH] 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 --- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gfortran.dg/scratch_1.f90 | 8 ++++++ libgfortran/ChangeLog | 5 ++++ libgfortran/io/unix.c | 38 +++++++++++++++++++++---- 4 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/scratch_1.f90 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1a30a107a74..7ac4d78a77d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-03-16 Francois-Xavier Coudert + + PR libfortran/47439 + * gfortran.dg/scratch_1.f90: New test. + 2011-03-18 Joseph Myers * gcc.dg/c1x-typedef-1.c: Expect errors for redefinitions of diff --git a/gcc/testsuite/gfortran.dg/scratch_1.f90 b/gcc/testsuite/gfortran.dg/scratch_1.f90 new file mode 100644 index 00000000000..32bf0c45a1d --- /dev/null +++ b/gcc/testsuite/gfortran.dg/scratch_1.f90 @@ -0,0 +1,8 @@ +! { dg-do run } +! Check that we can open more than 26 scratch files concurrently + integer :: i + do i = 1, 3000 + print *, i + open(100+i,status="scratch") + end do +end diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 9723efe21ee..70cf85b42a6 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,8 @@ +2011-03-19 Francois-Xavier Coudert + + PR libfortran/47439 + * io/unix.c (tempfile): Work around poor mktemp() implementations. + 2011-03-16 Francois-Xavier Coudert PR libfortran/47883 diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index 12536ca5cbe..edccdd6397a 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); -- 2.30.2