diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2007-02-21T16·34+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2007-02-21T16·34+0000 |
commit | 0f5da8a83c227879566ed87623617fe195bc6f88 (patch) | |
tree | 68936736d29d839affea132f65004bfbcb587e1f /src/libstore | |
parent | dc7d59477613e88b18133208f6c8b2f646e66260 (diff) |
* Support exportPath() in remote mode.
Diffstat (limited to 'src/libstore')
-rw-r--r-- | src/libstore/remote-store.cc | 16 | ||||
-rw-r--r-- | src/libstore/remote-store.hh | 2 | ||||
-rw-r--r-- | src/libstore/worker-protocol.hh | 3 |
3 files changed, 16 insertions, 5 deletions
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index 801df58ad9fe..dbeb7cf1227f 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -246,7 +246,11 @@ Path RemoteStore::addTextToStore(const string & suffix, const string & s, void RemoteStore::exportPath(const Path & path, bool sign, Sink & sink) { - throw Error("not implemented"); + writeInt(wopExportPath, to); + writeString(path, to); + writeInt(sign ? 1 : 0, to); + processStderr(&sink); /* sink receives the actual data */ + readInt(from); } @@ -336,12 +340,16 @@ void RemoteStore::collectGarbage(GCAction action, const PathSet & pathsToDelete, } -void RemoteStore::processStderr() +void RemoteStore::processStderr(Sink * sink) { unsigned int msg; - while ((msg = readInt(from)) == STDERR_NEXT) { + while ((msg = readInt(from)) == STDERR_NEXT || msg == STDERR_DATA) { string s = readString(from); - writeToStderr((unsigned char *) s.c_str(), s.size()); + if (msg == STDERR_DATA) { + if (!sink) throw Error("no sink"); + (*sink)((const unsigned char *) s.c_str(), s.size()); + } + else writeToStderr((const unsigned char *) s.c_str(), s.size()); } if (msg == STDERR_ERROR) throw Error(readString(from)); diff --git a/src/libstore/remote-store.hh b/src/libstore/remote-store.hh index 4c594b606670..f57dcbd93866 100644 --- a/src/libstore/remote-store.hh +++ b/src/libstore/remote-store.hh @@ -70,7 +70,7 @@ private: FdSource from; Pid child; - void processStderr(); + void processStderr(Sink * sink = 0); void forkSlave(); diff --git a/src/libstore/worker-protocol.hh b/src/libstore/worker-protocol.hh index b3339101103b..e48fd5fe9708 100644 --- a/src/libstore/worker-protocol.hh +++ b/src/libstore/worker-protocol.hh @@ -26,10 +26,13 @@ typedef enum { wopSyncWithGC, wopFindRoots, wopCollectGarbage, + wopExportPath, + wopImportPath, } WorkerOp; #define STDERR_NEXT 0x6f6c6d67 +#define STDERR_DATA 0x64617461 #define STDERR_LAST 0x616c7473 #define STDERR_ERROR 0x63787470 |