From bdadb98de8fcd5ed99cca97071741e2775f3ada2 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 21 Feb 2007 17:34:02 +0000 Subject: * `nix-store --import' now also works in remote mode. The worker always requires a signature on the archive. This is to ensure that unprivileged users cannot add Trojan horses to the Nix store. --- src/libstore/remote-store.cc | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) (limited to 'src/libstore/remote-store.cc') diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index dbeb7cf122..1aab90d38c 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -256,7 +256,13 @@ void RemoteStore::exportPath(const Path & path, bool sign, Path RemoteStore::importPath(bool requireSignature, Source & source) { - throw Error("not implemented"); + writeInt(wopImportPath, to); + /* We ignore requireSignature, since the worker forces it to true + anyway. */ + + processStderr(0, &source); + Path path = readStorePath(from); + return path; } @@ -340,16 +346,28 @@ void RemoteStore::collectGarbage(GCAction action, const PathSet & pathsToDelete, } -void RemoteStore::processStderr(Sink * sink) +void RemoteStore::processStderr(Sink * sink, Source * source) { unsigned int msg; - while ((msg = readInt(from)) == STDERR_NEXT || msg == STDERR_DATA) { - string s = readString(from); - if (msg == STDERR_DATA) { + while ((msg = readInt(from)) == STDERR_NEXT + || msg == STDERR_READ || msg == STDERR_WRITE) { + if (msg == STDERR_WRITE) { + string s = readString(from); 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()); + else if (msg == STDERR_READ) { + if (!source) throw Error("no source"); + unsigned int len = readInt(from); + unsigned char * buf = new unsigned char[len]; + AutoDeleteArray d(buf); + (*source)(buf, len); + writeString(string((const char *) buf, len), to); + } + else { + string s = readString(from); + writeToStderr((const unsigned char *) s.c_str(), s.size()); + } } if (msg == STDERR_ERROR) throw Error(readString(from)); -- cgit 1.4.1