forked from lix-project/lix
* Refactoring.
This commit is contained in:
parent
052b6fb149
commit
f5f0cf423f
|
@ -18,6 +18,35 @@ namespace nix {
|
||||||
|
|
||||||
|
|
||||||
RemoteStore::RemoteStore()
|
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];
|
int sockets[2];
|
||||||
if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) == -1)
|
if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) == -1)
|
||||||
|
@ -26,7 +55,6 @@ RemoteStore::RemoteStore()
|
||||||
fdSelf = sockets[0];
|
fdSelf = sockets[0];
|
||||||
AutoCloseFD fdChild = sockets[1];
|
AutoCloseFD fdChild = sockets[1];
|
||||||
|
|
||||||
|
|
||||||
/* Start the worker. */
|
/* Start the worker. */
|
||||||
Path worker = getEnv("NIX_WORKER");
|
Path worker = getEnv("NIX_WORKER");
|
||||||
if (worker == "")
|
if (worker == "")
|
||||||
|
@ -78,18 +106,6 @@ RemoteStore::RemoteStore()
|
||||||
|
|
||||||
from.fd = fdSelf;
|
from.fd = fdSelf;
|
||||||
to.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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,8 @@ private:
|
||||||
Pid child;
|
Pid child;
|
||||||
|
|
||||||
void processStderr();
|
void processStderr();
|
||||||
|
|
||||||
|
void forkSlave();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -137,12 +137,10 @@ boost::shared_ptr<StoreAPI> store;
|
||||||
|
|
||||||
boost::shared_ptr<StoreAPI> openStore(bool reserveSpace)
|
boost::shared_ptr<StoreAPI> openStore(bool reserveSpace)
|
||||||
{
|
{
|
||||||
string mode = getEnv("NIX_REMOTE");
|
if (getEnv("NIX_REMOTE") == "")
|
||||||
if (mode == "")
|
|
||||||
return boost::shared_ptr<StoreAPI>(new LocalStore(reserveSpace));
|
return boost::shared_ptr<StoreAPI>(new LocalStore(reserveSpace));
|
||||||
else if (mode == "slave")
|
else
|
||||||
return boost::shared_ptr<StoreAPI>(new RemoteStore());
|
return boost::shared_ptr<StoreAPI>(new RemoteStore());
|
||||||
else throw Error(format("invalid setting for NIX_REMOTE, `%1%'") % mode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue