about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libmain/shared.cc25
-rw-r--r--src/libstore/store.cc20
-rw-r--r--tests/common.sh.in3
3 files changed, 25 insertions, 23 deletions
diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc
index 1e48a6365220..97528f123e4a 100644
--- a/src/libmain/shared.cc
+++ b/src/libmain/shared.cc
@@ -23,7 +23,7 @@ extern "C" {
 volatile sig_atomic_t blockInt = 0;
 
 
-void sigintHandler(int signo)
+static void sigintHandler(int signo)
 {
     if (!blockInt) {
         _isInterrupted = 1;
@@ -54,7 +54,7 @@ void printGCWarning()
 }
 
 
-void setLogType(string lt)
+static void setLogType(string lt)
 {
     if (lt == "pretty") logType = ltPretty;
     else if (lt == "escapes") logType = ltEscapes;
@@ -63,22 +63,6 @@ void setLogType(string lt)
 }
 
 
-void checkStoreNotSymlink(Path path)
-{
-    struct stat st;
-    while (path != "/") {
-        if (lstat(path.c_str(), &st))
-            throw SysError(format("getting status of `%1%'") % path);
-        if (S_ISLNK(st.st_mode))
-            throw Error(format(
-                "the path `%1%' is a symlink; "
-                "this is not allowed for the Nix store and its parent directories")
-                % path);
-        path = dirOf(path);
-    }
-}
-
-
 struct RemoveTempRoots 
 {
     ~RemoveTempRoots()
@@ -109,11 +93,6 @@ static void initAndRun(int argc, char * * argv)
     nixDBPath = getEnv("NIX_DB_DIR", nixStateDir + "/db");
     nixConfDir = canonPath(getEnv("NIX_CONF_DIR", NIX_CONF_DIR));
 
-    /* Check that the store directory and its parent are not
-       symlinks. */
-    if (getEnv("NIX_IGNORE_SYMLINK_STORE") != "1")
-        checkStoreNotSymlink(nixStore);
-
     /* Catch SIGINT. */
     struct sigaction act, oact;
     act.sa_handler = sigintHandler;
diff --git a/src/libstore/store.cc b/src/libstore/store.cc
index e792fd28cedc..556ba8e62166 100644
--- a/src/libstore/store.cc
+++ b/src/libstore/store.cc
@@ -76,10 +76,30 @@ static void upgradeStore07();
 static void upgradeStore09();
 
 
+void checkStoreNotSymlink()
+{
+    if (getEnv("NIX_IGNORE_SYMLINK_STORE") == "1") return;
+    Path path = nixStore;
+    struct stat st;
+    while (path != "/") {
+        if (lstat(path.c_str(), &st))
+            throw SysError(format("getting status of `%1%'") % path);
+        if (S_ISLNK(st.st_mode))
+            throw Error(format(
+                "the path `%1%' is a symlink; "
+                "this is not allowed for the Nix store and its parent directories")
+                % path);
+        path = dirOf(path);
+    }
+}
+
+
 void openDB(bool reserveSpace)
 {
     if (readOnlyMode) return;
 
+    checkStoreNotSymlink();
+
     try {
         Path reservedPath = nixDBPath + "/reserved";
         string s = querySetting("gc-reserved-space", "");
diff --git a/tests/common.sh.in b/tests/common.sh.in
index 9766642b0011..0f55d6cf896e 100644
--- a/tests/common.sh.in
+++ b/tests/common.sh.in
@@ -1,5 +1,8 @@
 set -e
 
+# Maybe the build directory is symlinked.
+export NIX_IGNORE_SYMLINK_STORE=1
+
 export TEST_ROOT=$(pwd)/test-tmp
 export NIX_STORE_DIR=$TEST_ROOT/store
 export NIX_DATA_DIR=$TEST_ROOT/data