mirror of
https://github.com/NixOS/nix
synced 2025-07-07 06:01:48 +02:00
Use the daemon when we don't have write access to the Nix database
This commit is contained in:
parent
4fa08f3edb
commit
9e7c1a4bbd
7 changed files with 57 additions and 13 deletions
|
@ -397,9 +397,15 @@ int LocalStore::getSchema()
|
|||
}
|
||||
|
||||
|
||||
bool LocalStore::haveWriteAccess()
|
||||
{
|
||||
return access(settings.nixDBPath.c_str(), R_OK | W_OK) == 0;
|
||||
}
|
||||
|
||||
|
||||
void LocalStore::openDB(bool create)
|
||||
{
|
||||
if (access(settings.nixDBPath.c_str(), R_OK | W_OK))
|
||||
if (!haveWriteAccess())
|
||||
throw SysError(format("Nix database directory ‘%1%’ is not writable") % settings.nixDBPath);
|
||||
|
||||
/* Open the Nix database. */
|
||||
|
|
|
@ -253,6 +253,12 @@ private:
|
|||
|
||||
int getSchema();
|
||||
|
||||
public:
|
||||
|
||||
static bool haveWriteAccess();
|
||||
|
||||
private:
|
||||
|
||||
void openDB(bool create);
|
||||
|
||||
void makeStoreWritable();
|
||||
|
|
|
@ -50,14 +50,8 @@ void RemoteStore::openConnection(bool reserveSpace)
|
|||
if (initialised) return;
|
||||
initialised = true;
|
||||
|
||||
string remoteMode = getEnv("NIX_REMOTE");
|
||||
|
||||
if (remoteMode == "daemon")
|
||||
/* Connect to a daemon that does the privileged work for
|
||||
us. */
|
||||
connectToDaemon();
|
||||
else
|
||||
throw Error(format("invalid setting for NIX_REMOTE, ‘%1%’") % remoteMode);
|
||||
/* Connect to a daemon that does the privileged work for us. */
|
||||
connectToDaemon();
|
||||
|
||||
from.fd = fdSocket;
|
||||
to.fd = fdSocket;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue