about summary refs log tree commit diff
path: root/src/libstore/remote-store.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore/remote-store.cc')
-rw-r--r--src/libstore/remote-store.cc54
1 files changed, 53 insertions, 1 deletions
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index 27717a816a53..6f3c110a3df8 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -1,12 +1,64 @@
+#include "serialise.hh"
+#include "util.hh"
 #include "remote-store.hh"
 
+#include <iostream>
+#include <unistd.h>
+
 
 namespace nix {
 
 
 RemoteStore::RemoteStore()
 {
-    throw Error("not implemented");
+    toChild.create();
+    fromChild.create();
+
+
+    /* Start the worker. */
+    string worker = "nix-worker";
+
+    child = fork();
+    
+    switch (child) {
+        
+    case -1:
+        throw SysError("unable to fork");
+
+    case 0:
+        try { /* child */
+
+            fromChild.readSide.close();
+            if (dup2(fromChild.writeSide, STDOUT_FILENO) == -1)
+                throw SysError("dupping write side");
+
+            toChild.writeSide.close();
+            if (dup2(toChild.readSide, STDIN_FILENO) == -1)
+                throw SysError("dupping read side");
+
+            execlp(worker.c_str(), worker.c_str(),
+                "-vvv", "--slave", NULL);
+            
+            throw SysError(format("executing `%1%'") % worker);
+            
+        } catch (std::exception & e) {
+            std::cerr << format("child error: %1%\n") % e.what();
+        }
+        quickExit(1);
+    }
+
+    fromChild.writeSide.close();
+    toChild.readSide.close();
+
+    from.fd = fromChild.readSide;
+    to.fd = toChild.writeSide;
+
+    
+    /* Send the magic greeting, check for the reply. */
+    writeInt(0x6e697864, to);
+    
+    unsigned int magic = readInt(from);
+    if (magic != 0x6478696e) throw Error("protocol mismatch");
 }