tmpdir: Use a good default directory on native Windows.
authorBruno Haible <bruno@clisp.org>
Tue, 23 Aug 2011 06:40:27 +0000 (08:40 +0200)
committerBruno Haible <bruno@clisp.org>
Tue, 23 Aug 2011 06:40:27 +0000 (08:40 +0200)
* lib/tmpdir.c: Include <windows.h>, pathmax.h.
(P_tmpdir): Default to _P_tmpdir on native Windows.
(path_search): On native Windows, try the value returned by GetTempPath
before trying P_tmpdir.
* modules/tmpdir (Depends-on): Add pathmax.
Suggested by John Darrington <john@darrington.wattle.id.au>.

ChangeLog
lib/tmpdir.c
modules/tmpdir

index 59b1b4b..a245570 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2011-08-23  Bruno Haible  <bruno@clisp.org>
+
+       tmpdir: Use a good default directory on native Windows.
+       * lib/tmpdir.c: Include <windows.h>, pathmax.h.
+       (P_tmpdir): Default to _P_tmpdir on native Windows.
+       (path_search): On native Windows, try the value returned by GetTempPath
+       before trying P_tmpdir.
+       * modules/tmpdir (Depends-on): Add pathmax.
+       Suggested by John Darrington <john@darrington.wattle.id.au>.
+
 2011-08-20  Reuben Thomas  <rrt@sc3d.org>
 
        doc: fix typo in README-release
index 5590ac3..f159f16 100644 (file)
 
 #include <stdio.h>
 #ifndef P_tmpdir
-# define P_tmpdir "/tmp"
+# ifdef _P_tmpdir /* native Windows */
+#  define P_tmpdir _P_tmpdir
+# else
+#  define P_tmpdir "/tmp"
+# endif
 #endif
 
 #include <sys/stat.h>
 
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# define WIN32_LEAN_AND_MEAN  /* avoid including junk */
+# include <windows.h>
+#endif
+
+#include "pathmax.h"
+
 #if _LIBC
 # define struct_stat64 struct stat64
 #else
@@ -106,6 +117,19 @@ path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx,
     }
   if (dir == NULL)
     {
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+      char dirbuf[PATH_MAX];
+      DWORD retval;
+
+      /* Find Windows temporary file directory.
+         We try this before P_tmpdir because Windows defines P_tmpdir to "\\"
+         and will therefore try to put all temporary files in the root
+         directory (unless $TMPDIR is set).  */
+      retval = GetTempPath (PATH_MAX, dirbuf);
+      if (retval > 0 && retval < PATH_MAX && direxists (dirbuf))
+        dir = dirbuf;
+      else
+#endif
       if (direxists (P_tmpdir))
         dir = P_tmpdir;
       else if (strcmp (P_tmpdir, "/tmp") != 0 && direxists ("/tmp"))
index a42fdc4..0dd1780 100644 (file)
@@ -9,6 +9,7 @@ m4/tmpdir.m4
 Depends-on:
 stdbool
 sys_stat
+pathmax
 
 configure.ac:
 gt_TMPDIR