diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2006-12-04 14:21:39 +0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2006-12-04 14:21:39 +0000 |
commit | 4740baf3a61c48c07f12f23927c84ca9892088a8 (patch) | |
tree | 1d854b07cd2f240600ea3ec4ee18311374eb5a1c | |
parent | f5f0cf423fda5e030d9be6fd6500a1b06d3a60bc (diff) |
* When NIX_REMOTE=daemon, connect to /nix/var/nix/daemon.socket
instead of forking a worker.
-rw-r--r-- | src/libstore/remote-store.cc | 36 | ||||
-rw-r--r-- | src/libstore/remote-store.hh | 4 | ||||
-rw-r--r-- | src/libstore/worker-protocol.hh | 5 |
3 files changed, 37 insertions, 8 deletions
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index df1c1616f..4d4189be0 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -8,6 +8,7 @@ #include <sys/types.h> #include <sys/stat.h> #include <sys/socket.h> +#include <sys/un.h> #include <fcntl.h> #include <iostream> @@ -27,11 +28,14 @@ RemoteStore::RemoteStore() else 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); + from.fd = fdSocket; + to.fd = fdSocket; + /* Send the magic greeting, check for the reply. */ try { @@ -52,7 +56,7 @@ void RemoteStore::forkSlave() if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) == -1) throw SysError("cannot create sockets"); - fdSelf = sockets[0]; + fdSocket = sockets[0]; AutoCloseFD fdChild = sockets[1]; /* Start the worker. */ @@ -80,7 +84,7 @@ void RemoteStore::forkSlave() if (dup2(fdChild, STDIN_FILENO) == -1) throw SysError("dupping read side"); - close(fdSelf); + close(fdSocket); close(fdChild); int fdDebug = open("/tmp/worker-log", O_WRONLY | O_CREAT | O_TRUNC, 0644); @@ -104,16 +108,34 @@ void RemoteStore::forkSlave() fdChild.close(); - from.fd = fdSelf; - to.fd = fdSelf; +} + + +void RemoteStore::connectToDaemon() +{ + fdSocket = socket(PF_UNIX, SOCK_STREAM, 0); + if (fdSocket == -1) + throw SysError("cannot create Unix domain socket"); + + string socketPath = nixStateDir + DEFAULT_SOCKET_PATH; + + struct sockaddr_un addr; + addr.sun_family = AF_UNIX; + if (socketPath.size() >= sizeof(addr.sun_path)) + throw Error(format("socket path `%1%' is too long") % socketPath); + strcpy(addr.sun_path, socketPath.c_str()); + + if (connect(fdSocket, (struct sockaddr *) &addr, sizeof(addr)) == -1) + throw SysError(format("cannot connect to daemon at `%1%'") % socketPath); } RemoteStore::~RemoteStore() { try { - fdSelf.close(); - child.wait(true); + fdSocket.close(); + if (child != -1) + child.wait(true); } catch (Error & e) { printMsg(lvlError, format("error (ignored): %1%") % e.msg()); } diff --git a/src/libstore/remote-store.hh b/src/libstore/remote-store.hh index a8e2f788e..ad29305db 100644 --- a/src/libstore/remote-store.hh +++ b/src/libstore/remote-store.hh @@ -52,7 +52,7 @@ public: void syncWithGC(); private: - AutoCloseFD fdSelf; + AutoCloseFD fdSocket; FdSink to; FdSource from; Pid child; @@ -60,6 +60,8 @@ private: void processStderr(); void forkSlave(); + + void connectToDaemon(); }; diff --git a/src/libstore/worker-protocol.hh b/src/libstore/worker-protocol.hh index 284477483..8b1d4e15d 100644 --- a/src/libstore/worker-protocol.hh +++ b/src/libstore/worker-protocol.hh @@ -28,4 +28,9 @@ typedef enum { #define STDERR_ERROR 0x63787470 +/* The default location of the daemon socket, relative to + nixStateDir. */ +#define DEFAULT_SOCKET_PATH "/daemon.socket" + + #endif /* !__WORKER_PROTOCOL_H */ |