diff options
Diffstat (limited to 'src/libstore')
-rw-r--r-- | src/libstore/remote-store.cc | 54 | ||||
-rw-r--r-- | src/libstore/remote-store.hh | 11 | ||||
-rw-r--r-- | src/libstore/store-api.cc | 1 |
3 files changed, 65 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"); } diff --git a/src/libstore/remote-store.hh b/src/libstore/remote-store.hh index 8ebe5e397e20..da6911cf4fa2 100644 --- a/src/libstore/remote-store.hh +++ b/src/libstore/remote-store.hh @@ -9,6 +9,12 @@ namespace nix { +class Pipe; +class Pid; +struct FdSink; +struct FdSource; + + class RemoteStore : public StoreAPI { public: @@ -44,6 +50,11 @@ public: void ensurePath(const Path & storePath); private: + Pipe toChild; + Pipe fromChild; + FdSink to; + FdSource from; + Pid child; }; diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc index 092d7f1e9405..9e8bc36d7f0d 100644 --- a/src/libstore/store-api.cc +++ b/src/libstore/store-api.cc @@ -91,6 +91,7 @@ Path makeFixedOutputPath(bool recursive, #include "local-store.hh" +#include "serialise.hh" #include "remote-store.hh" |