aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libstore/remote-store.cc42
-rw-r--r--src/libstore/remote-store.hh2
-rw-r--r--src/libstore/store-api.cc6
3 files changed, 33 insertions, 17 deletions
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index 11e6c42fa..df1c1616f 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -19,6 +19,35 @@ namespace nix {
RemoteStore::RemoteStore()
{
+ string remoteMode = getEnv("NIX_REMOTE");
+
+ if (remoteMode == "slave")
+ /* Fork off a setuid worker to do the privileged work. */
+ forkSlave();
+ else if (remoteMode == "daemon")
+ /* Connect to a daemon that does the privileged work for
+ us. */
+ ;
+ else
+ throw Error(format("invalid setting for NIX_REMOTE, `%1%'")
+ % remoteMode);
+
+
+ /* Send the magic greeting, check for the reply. */
+ try {
+ processStderr();
+ writeInt(WORKER_MAGIC_1, to);
+ unsigned int magic = readInt(from);
+ if (magic != WORKER_MAGIC_2) throw Error("protocol mismatch");
+ } catch (Error & e) {
+ throw Error(format("cannot start worker (%1%)")
+ % e.msg());
+ }
+}
+
+
+void RemoteStore::forkSlave()
+{
int sockets[2];
if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) == -1)
throw SysError("cannot create sockets");
@@ -26,7 +55,6 @@ RemoteStore::RemoteStore()
fdSelf = sockets[0];
AutoCloseFD fdChild = sockets[1];
-
/* Start the worker. */
Path worker = getEnv("NIX_WORKER");
if (worker == "")
@@ -78,18 +106,6 @@ RemoteStore::RemoteStore()
from.fd = fdSelf;
to.fd = fdSelf;
-
-
- /* Send the magic greeting, check for the reply. */
- try {
- processStderr();
- writeInt(WORKER_MAGIC_1, to);
- unsigned int magic = readInt(from);
- if (magic != WORKER_MAGIC_2) throw Error("protocol mismatch");
- } catch (Error & e) {
- throw Error(format("cannot start worker process `%1%' (%2%)")
- % worker % e.msg());
- }
}
diff --git a/src/libstore/remote-store.hh b/src/libstore/remote-store.hh
index ed44f6d54..a8e2f788e 100644
--- a/src/libstore/remote-store.hh
+++ b/src/libstore/remote-store.hh
@@ -58,6 +58,8 @@ private:
Pid child;
void processStderr();
+
+ void forkSlave();
};
diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc
index fb86fc6ab..677c3ca3e 100644
--- a/src/libstore/store-api.cc
+++ b/src/libstore/store-api.cc
@@ -137,12 +137,10 @@ boost::shared_ptr<StoreAPI> store;
boost::shared_ptr<StoreAPI> openStore(bool reserveSpace)
{
- string mode = getEnv("NIX_REMOTE");
- if (mode == "")
+ if (getEnv("NIX_REMOTE") == "")
return boost::shared_ptr<StoreAPI>(new LocalStore(reserveSpace));
- else if (mode == "slave")
+ else
return boost::shared_ptr<StoreAPI>(new RemoteStore());
- else throw Error(format("invalid setting for NIX_REMOTE, `%1%'") % mode);
}