merge from gcc
authorDJ Delorie <dj@redhat.com>
Mon, 23 Feb 2009 00:16:38 +0000 (00:16 +0000)
committerDJ Delorie <dj@redhat.com>
Mon, 23 Feb 2009 00:16:38 +0000 (00:16 +0000)
libiberty/ChangeLog
libiberty/make-temp-file.c

index 3101aeac5f3c130fa1aa63386c2390dd297766d0..db7d2878bc050af1f418fbbffed17b3ba7e3a8d2 100644 (file)
@@ -1,3 +1,8 @@
+2009-02-21  Mark Mitchell  <mark@codesourcery.com>
+
+       * make-temp-file.c (<windows.h>): Include on Windows.
+       (choose_tmpdir): On Windows, use GetTempPath.
+
 2009-01-18  Dave Korn  <dave.korn.cygwin@gmail.com>
 
        * configure.ac (funcs, vars, checkfuncs):  Don't munge on Cygwin,
index 94c76d700bd6e5817f62794b1ea05f05048967a0..eadcf8502137f111a7463f0c6b59f6a633f58a3e 100644 (file)
@@ -36,6 +36,9 @@ Boston, MA 02110-1301, USA.  */
 #ifdef HAVE_SYS_FILE_H
 #include <sys/file.h>   /* May get R_OK, etc. on some systems.  */
 #endif
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#include <windows.h>
+#endif
 
 #ifndef R_OK
 #define R_OK 4
@@ -56,6 +59,8 @@ extern int mkstemps (char *, int);
 #define TEMP_FILE "ccXXXXXX"
 #define TEMP_FILE_LEN (sizeof(TEMP_FILE) - 1)
 
+#if !defined(_WIN32) || defined(__CYGWIN__)
+
 /* Subroutine of choose_tmpdir.
    If BASE is non-NULL, return it.
    Otherwise it checks if DIR is a usable directory.
@@ -81,6 +86,8 @@ static const char usrtmp[] =
 static const char vartmp[] =
 { DIR_SEPARATOR, 'v', 'a', 'r', DIR_SEPARATOR, 't', 'm', 'p', 0 };
 
+#endif
+
 static char *memoized_tmpdir;
 
 /*
@@ -97,40 +104,58 @@ files in.
 char *
 choose_tmpdir (void)
 {
-  const char *base = 0;
-  char *tmpdir;
-  unsigned int len;
-
-  if (memoized_tmpdir)
-    return memoized_tmpdir;
-
-  base = try_dir (getenv ("TMPDIR"), base);
-  base = try_dir (getenv ("TMP"), base);
-  base = try_dir (getenv ("TEMP"), base);
-
+  if (!memoized_tmpdir)
+    {
+#if !defined(_WIN32) || defined(__CYGWIN__)
+      const char *base = 0;
+      char *tmpdir;
+      unsigned int len;
+      
+      base = try_dir (getenv ("TMPDIR"), base);
+      base = try_dir (getenv ("TMP"), base);
+      base = try_dir (getenv ("TEMP"), base);
+      
 #ifdef P_tmpdir
-  base = try_dir (P_tmpdir, base);
+      base = try_dir (P_tmpdir, base);
 #endif
 
-  /* Try /var/tmp, /usr/tmp, then /tmp.  */
-  base = try_dir (vartmp, base);
-  base = try_dir (usrtmp, base);
-  base = try_dir (tmp, base);
-  /* If all else fails, use the current directory!  */
-  if (base == 0)
-    base = ".";
-
-  /* Append DIR_SEPARATOR to the directory we've chosen
-     and return it.  */
-  len = strlen (base);
-  tmpdir = XNEWVEC (char, len + 2);
-  strcpy (tmpdir, base);
-  tmpdir[len] = DIR_SEPARATOR;
-  tmpdir[len+1] = '\0';
-
-  memoized_tmpdir = tmpdir;
-  return tmpdir;
+      /* Try /var/tmp, /usr/tmp, then /tmp.  */
+      base = try_dir (vartmp, base);
+      base = try_dir (usrtmp, base);
+      base = try_dir (tmp, base);
+      
+      /* If all else fails, use the current directory!  */
+      if (base == 0)
+       base = ".";
+      /* Append DIR_SEPARATOR to the directory we've chosen
+        and return it.  */
+      len = strlen (base);
+      tmpdir = XNEWVEC (char, len + 2);
+      strcpy (tmpdir, base);
+      tmpdir[len] = DIR_SEPARATOR;
+      tmpdir[len+1] = '\0';
+      memoized_tmpdir = tmpdir;
+#else /* defined(_WIN32) && !defined(__CYGWIN__) */
+      DWORD len;
+
+      /* Figure out how much space we need.  */
+      len = GetTempPath(0, NULL);
+      if (len)
+       {
+         memoized_tmpdir = XNEWVEC (char, len);
+         if (!GetTempPath(len, memoized_tmpdir))
+           {
+             XDELETEVEC (memoized_tmpdir);
+             memoized_tmpdir = NULL;
+           }
+       }
+      if (!memoized_tmpdir)
+       /* If all else fails, use the current directory.  */
+       memoized_tmpdir = xstrdup (".\\");
+#endif /* defined(_WIN32) && !defined(__CYGWIN__) */
+    }
+
+  return memoized_tmpdir;
 }
 
 /*