aboutsummaryrefslogtreecommitdiff
path: root/src/libstore
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2022-06-23 16:29:50 +0200
committerEelco Dolstra <edolstra@gmail.com>2022-06-23 16:29:50 +0200
commit2a9fddc0b16d9b4771d11fc10d8b2a9cba55ff64 (patch)
tree0353547c8c2869fe341004bdf9f2d1a874642ab1 /src/libstore
parent3c57db1a0f5438015c19285ec02fd15d9c6cb51f (diff)
Automatically use a chroot store if /nix doesn't exist
Specifically, if we're not root and the daemon socket does not exist, then we use ~/.local/share/nix/root as a chroot store. This enables non-root users to download nix-static and have it work out of the box, e.g. ubuntu@ip-10-13-1-146:~$ ~/nix run nixpkgs#hello warning: '/nix' does not exists, so Nix will use '/home/ubuntu/.local/share/nix/root' as a chroot store Hello, world!
Diffstat (limited to 'src/libstore')
-rw-r--r--src/libstore/store-api.cc17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc
index 8861274a2..b46b3066b 100644
--- a/src/libstore/store-api.cc
+++ b/src/libstore/store-api.cc
@@ -1302,7 +1302,8 @@ std::pair<std::string, Store::Params> splitUriAndParams(const std::string & uri_
return {uri, params};
}
-static bool isNonUriPath(const std::string & spec) {
+static bool isNonUriPath(const std::string & spec)
+{
return
// is not a URL
spec.find("://") == std::string::npos
@@ -1319,7 +1320,19 @@ std::shared_ptr<Store> openFromNonUri(const std::string & uri, const Store::Para
return std::make_shared<LocalStore>(params);
else if (pathExists(settings.nixDaemonSocketFile))
return std::make_shared<UDSRemoteStore>(params);
- else
+ else if (!pathExists(stateDir) && params.empty() && getuid() != 0) {
+ /* If /nix doesn't exist, there is no daemon socket, and
+ we're not root, then automatically set up a chroot
+ store in ~/.local/share/nix/root. */
+ auto chrootStore = getDataDir() + "/nix/root";
+ if (!pathExists(chrootStore))
+ warn("'/nix' does not exists, so Nix will use '%s' as a chroot store", chrootStore);
+ else
+ debug("'/nix' does not exists, so Nix will use '%s' as a chroot store", chrootStore);
+ Store::Params params2;
+ params2["root"] = chrootStore;
+ return std::make_shared<LocalStore>(params2);
+ } else
return std::make_shared<LocalStore>(params);
} else if (uri == "daemon") {
return std::make_shared<UDSRemoteStore>(params);