diff options
Diffstat (limited to 'src/libstore/remote-store.cc')
-rw-r--r-- | src/libstore/remote-store.cc | 54 |
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"); } |