about summary refs log tree commit diff
diff options
context:
space:
mode:
-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 df1c1616f8..4d4189be0c 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 a8e2f788e9..ad29305db7 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 284477483a..8b1d4e15db 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 */