aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2006-12-04 14:21:39 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2006-12-04 14:21:39 +0000
commit4740baf3a61c48c07f12f23927c84ca9892088a8 (patch)
tree1d854b07cd2f240600ea3ec4ee18311374eb5a1c
parentf5f0cf423fda5e030d9be6fd6500a1b06d3a60bc (diff)
* When NIX_REMOTE=daemon, connect to /nix/var/nix/daemon.socket
instead of forking a worker.
-rw-r--r--src/libstore/remote-store.cc36
-rw-r--r--src/libstore/remote-store.hh4
-rw-r--r--src/libstore/worker-protocol.hh5
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 */