Subject: Backport from Tcl 8.6. * unix/tclUnixPipe.c (DefaultTempDir): [Bug 2933003]: Allow overriding of the back-stop default temporary file location at compile time by setting the TCL_TEMPORARY_FILE_DIRECTORY #def to a string containing the directory name (defaults to "/tmp" as that is the most common default).

From: "[email-masked]" <dkf>
Date: Wed, 14 Nov 2012 14:29:29 +0000

---
 ChangeLog          |  8 ++++++++
 unix/tclUnixPipe.c | 42 ++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 1a372f3..ef04907 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2012-11-14  Donal K. Fellows  <[email-masked]>
+
+	* unix/tclUnixPipe.c (DefaultTempDir): [Bug 2933003]: Allow overriding
+	of the back-stop default temporary file location at compile time by
+	setting the TCL_TEMPORARY_FILE_DIRECTORY #def to a string containing
+	the directory name (defaults to "/tmp" as that is the most common
+	default).
+
 2012-11-07  Don Porter  <[email-masked]>
 
 	* win/tclWinSock.c:	[Bug 3574493] Avoid hanging on exit due to
diff --git a/unix/tclUnixPipe.c b/unix/tclUnixPipe.c
index 829a4a6..4540ae6 100644
--- a/unix/tclUnixPipe.c
+++ b/unix/tclUnixPipe.c
@@ -199,7 +199,7 @@ TclpCreateTempFile(contents)
      * We should also check against making more then TMP_MAX of these.
      */
 
-    strcpy(fileName, P_tmpdir);				/* INTL: Native. */
+    strcpy(fileName, DefaultTempDir());			/* INTL: Native. */
     if (fileName[strlen(fileName) - 1] != '/') {
 	strcat(fileName, "/");				/* INTL: Native. */
     }
@@ -251,7 +251,7 @@ TclpTempFileName()
      * We should also check against making more then TMP_MAX of these.
      */
 
-    strcpy(fileName, P_tmpdir);		/* INTL: Native. */
+    strcpy(fileName, DefaultTempDir());	/* INTL: Native. */
     if (fileName[strlen(fileName) - 1] != '/') {
 	strcat(fileName, "/");		/* INTL: Native. */
     }
@@ -271,6 +271,44 @@ TclpTempFileName()
 /*
  *----------------------------------------------------------------------
  *
+ * DefaultTempDir --
+ *
+ *	Helper that does *part* of what tempnam() does.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static const char *
+DefaultTempDir(void)
+{
+    const char *dir;
+    struct stat buf;
+
+    dir = getenv("TMPDIR");
+    if (dir && dir[0] && stat(dir, &buf) == 0 && S_ISDIR(buf.st_mode)
+	    && access(dir, W_OK)) {
+	return dir;
+    }
+
+#ifdef P_tmpdir
+    dir = P_tmpdir;
+    if (stat(dir, &buf) == 0 && S_ISDIR(buf.st_mode) && access(dir, W_OK)) {
+	return dir;
+    }
+#endif
+
+    /*
+     * Assume that the default location ("/tmp" if not overridden) is always
+     * an existing writable directory; we've no recovery mechanism if it
+     * isn't.
+     */
+
+    return TCL_TEMPORARY_FILE_DIRECTORY;
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
  * TclpCreatePipe --
  *
  *      Creates a pipe - simply calls the pipe() function.
-- 
cgit v0.12