about summary refs log tree commit diff
path: root/src/libstore/store-api.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore/store-api.cc')
-rw-r--r--src/libstore/store-api.cc20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc
index a73ebd824264..f5035d3230fd 100644
--- a/src/libstore/store-api.cc
+++ b/src/libstore/store-api.cc
@@ -311,10 +311,22 @@ std::shared_ptr<StoreAPI> store;
 
 std::shared_ptr<StoreAPI> openStore(bool reserveSpace)
 {
-    if (getEnv("NIX_REMOTE") == "")
-        return std::shared_ptr<StoreAPI>(new LocalStore(reserveSpace));
-    else
-        return std::shared_ptr<StoreAPI>(new RemoteStore());
+    enum { mDaemon, mLocal, mAuto } mode;
+
+    mode = getEnv("NIX_REMOTE") == "daemon" ? mDaemon : mAuto;
+
+    if (mode == mAuto) {
+        if (LocalStore::haveWriteAccess())
+            mode = mLocal;
+        else if (pathExists(settings.nixDaemonSocketFile))
+            mode = mDaemon;
+        else
+            mode = mLocal;
+    }
+
+    return mode == mDaemon
+        ? (std::shared_ptr<StoreAPI>) std::make_shared<RemoteStore>()
+        : std::make_shared<LocalStore>(reserveSpace);
 }