aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/exec.cc6
-rw-r--r--src/util.cc20
-rw-r--r--src/util.hh3
3 files changed, 24 insertions, 5 deletions
diff --git a/src/exec.cc b/src/exec.cc
index e9ddb5ee1..2e092b2e0 100644
--- a/src/exec.cc
+++ b/src/exec.cc
@@ -54,11 +54,7 @@ void runProgram(const string & program,
/* Create a temporary directory where the build will take
place. */
- static int counter = 0;
- string tmpDir = (format("/tmp/nix-%1%-%2%") % getpid() % counter++).str();
-
- if (mkdir(tmpDir.c_str(), 0777) == -1)
- throw SysError(format("creating directory `%1%'") % tmpDir);
+ string tmpDir = createTempDir();
AutoDelete delTmpDir(tmpDir);
diff --git a/src/util.cc b/src/util.cc
index bedd031de..ed7562a29 100644
--- a/src/util.cc
+++ b/src/util.cc
@@ -171,6 +171,26 @@ void makePathReadOnly(const string & path)
}
+static string tempName()
+{
+ static int counter = 0;
+ char * s = getenv("TMPDIR");
+ string tmpRoot = s ? canonPath(string(s)) : "/tmp";
+ return (format("%1%/nix-%2%-%3%") % tmpRoot % getpid() % counter++).str();
+}
+
+
+string createTempDir()
+{
+ while (1) {
+ string tmpDir = tempName();
+ if (mkdir(tmpDir.c_str(), 0777) == 0) return tmpDir;
+ if (errno != EEXIST)
+ throw SysError(format("creating directory `%1%'") % tmpDir);
+ }
+}
+
+
Verbosity verbosity = lvlError;
static int nestingLevel = 0;
diff --git a/src/util.hh b/src/util.hh
index d0e42f3b1..31dba7faf 100644
--- a/src/util.hh
+++ b/src/util.hh
@@ -72,6 +72,9 @@ void deletePath(const string & path);
/* Make a path read-only recursively. */
void makePathReadOnly(const string & path);
+/* Create a temporary directory. */
+string createTempDir();
+
/* Messages. */