summaryrefslogtreecommitdiffstats
path: root/unix
diff options
context:
space:
mode:
authordkf <dkf@noemail.net>2012-11-14 14:29:29 (GMT)
committerdkf <dkf@noemail.net>2012-11-14 14:29:29 (GMT)
commitb67bab5ce0cadadf499b2ab66cde983e33c6dddb (patch)
tree05b1f19e29b491de907eac0275afc0009a0f8cc2 /unix
parenta4132b97b5fd97a81e1c628a23ed4dee4655a6aa (diff)
downloadtcl-b67bab5ce0cadadf499b2ab66cde983e33c6dddb.zip
tcl-b67bab5ce0cadadf499b2ab66cde983e33c6dddb.tar.gz
tcl-b67bab5ce0cadadf499b2ab66cde983e33c6dddb.tar.bz2
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). FossilOrigin-Name: dbb6880cd242d8dc084c96f8e9ac3d727bd6ceef
Diffstat (limited to 'unix')
-rw-r--r--unix/tclUnixPipe.c42
1 files changed, 40 insertions, 2 deletions
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.