From f5f0cf423fda5e030d9be6fd6500a1b06d3a60bc Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 4 Dec 2006 13:28:14 +0000 Subject: [PATCH] * Refactoring. --- src/libstore/remote-store.cc | 42 +++++++++++++++++++++++++----------- src/libstore/remote-store.hh | 2 ++ src/libstore/store-api.cc | 6 ++---- 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 @@ -18,6 +18,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) @@ -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 store; boost::shared_ptr openStore(bool reserveSpace) { - string mode = getEnv("NIX_REMOTE"); - if (mode == "") + if (getEnv("NIX_REMOTE") == "") return boost::shared_ptr(new LocalStore(reserveSpace)); - else if (mode == "slave") + else return boost::shared_ptr(new RemoteStore()); - else throw Error(format("invalid setting for NIX_REMOTE, `%1%'") % mode); }