aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libstore/export-import.cc23
-rw-r--r--src/libstore/legacy-ssh-store.cc4
-rw-r--r--src/libstore/remote-store.cc5
-rw-r--r--src/libutil/serialise.hh9
-rw-r--r--src/nix-daemon/nix-daemon.cc17
5 files changed, 21 insertions, 37 deletions
diff --git a/src/libstore/export-import.cc b/src/libstore/export-import.cc
index e584ae538..531f010d9 100644
--- a/src/libstore/export-import.cc
+++ b/src/libstore/export-import.cc
@@ -61,27 +61,6 @@ void Store::exportPath(const Path & path, Sink & sink)
hashAndWriteSink << exportMagic << path << info->references << info->deriver << 0;
}
-struct TeeSource : Source
-{
- Source & readSource;
- ref<std::string> data;
- TeeSource(Source & readSource)
- : readSource(readSource)
- , data(make_ref<std::string>())
- {
- }
- size_t read(unsigned char * data, size_t len)
- {
- size_t n = readSource.read(data, len);
- this->data->append((char *) data, n);
- return n;
- }
-};
-
-struct NopSink : ParseSink
-{
-};
-
Paths Store::importPaths(Source & source, std::shared_ptr<FSAccessor> accessor, bool dontCheckSigs)
{
Paths res;
@@ -92,7 +71,7 @@ Paths Store::importPaths(Source & source, std::shared_ptr<FSAccessor> accessor,
/* Extract the NAR from the source. */
TeeSource tee(source);
- NopSink sink;
+ ParseSink sink;
parseDump(sink, tee);
uint32_t magic = readInt(source);
diff --git a/src/libstore/legacy-ssh-store.cc b/src/libstore/legacy-ssh-store.cc
index b20ff185f..031fcac95 100644
--- a/src/libstore/legacy-ssh-store.cc
+++ b/src/libstore/legacy-ssh-store.cc
@@ -169,9 +169,9 @@ struct LegacySSHStore : public Store
/* FIXME: inefficient. */
ParseSink parseSink; /* null sink; just parse the NAR */
- SavingSourceAdapter savedNAR(conn->from);
+ TeeSource savedNAR(conn->from);
parseDump(parseSink, savedNAR);
- sink(savedNAR.s);
+ sink(*savedNAR.data);
}
/* Unsupported methods. */
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index 642825914..47413d573 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -378,8 +378,9 @@ void RemoteStore::addToStore(const ValidPathInfo & info, const ref<std::string>
conn->to << wopAddToStoreNar
<< info.path << info.deriver << printHash(info.narHash)
<< info.references << info.registrationTime << info.narSize
- << info.ultimate << info.sigs << info.ca << *nar << repair << dontCheckSigs;
- // FIXME: don't send nar as a string
+ << info.ultimate << info.sigs << info.ca
+ << repair << dontCheckSigs;
+ conn->to(*nar);
conn->processStderr();
}
}
diff --git a/src/libutil/serialise.hh b/src/libutil/serialise.hh
index 3072f422e..2bdee7080 100644
--- a/src/libutil/serialise.hh
+++ b/src/libutil/serialise.hh
@@ -140,15 +140,16 @@ struct StringSource : Source
/* Adapter class of a Source that saves all data read to `s'. */
-struct SavingSourceAdapter : Source
+struct TeeSource : Source
{
Source & orig;
- string s;
- SavingSourceAdapter(Source & orig) : orig(orig) { }
+ ref<std::string> data;
+ TeeSource(Source & orig)
+ : orig(orig), data(make_ref<std::string>()) { }
size_t read(unsigned char * data, size_t len)
{
size_t n = orig.read(data, len);
- s.append((const char *) data, n);
+ this->data->append((const char *) data, n);
return n;
}
};
diff --git a/src/nix-daemon/nix-daemon.cc b/src/nix-daemon/nix-daemon.cc
index a1b3f2f6f..174821884 100644
--- a/src/nix-daemon/nix-daemon.cc
+++ b/src/nix-daemon/nix-daemon.cc
@@ -283,7 +283,7 @@ static void performOp(ref<LocalStore> store, bool trusted, unsigned int clientVe
}
HashType hashAlgo = parseHashType(s);
- SavingSourceAdapter savedNAR(from);
+ TeeSource savedNAR(from);
RetrieveRegularNARSink savedRegular;
if (recursive) {
@@ -297,7 +297,7 @@ static void performOp(ref<LocalStore> store, bool trusted, unsigned int clientVe
startWork();
if (!savedRegular.regular) throw Error("regular file expected");
- Path path = store->addToStoreFromDump(recursive ? savedNAR.s : savedRegular.s, baseName, recursive, hashAlgo);
+ Path path = store->addToStoreFromDump(recursive ? *savedNAR.data : savedRegular.s, baseName, recursive, hashAlgo);
stopWork();
to << path;
@@ -569,6 +569,7 @@ static void performOp(ref<LocalStore> store, bool trusted, unsigned int clientVe
}
case wopAddToStoreNar: {
+ bool repair, dontCheckSigs;
ValidPathInfo info;
info.path = readStorePath(*store, from);
from >> info.deriver;
@@ -578,14 +579,16 @@ static void performOp(ref<LocalStore> store, bool trusted, unsigned int clientVe
info.references = readStorePaths<PathSet>(*store, from);
from >> info.registrationTime >> info.narSize >> info.ultimate;
info.sigs = readStrings<StringSet>(from);
- from >> info.ca;
- auto nar = make_ref<std::string>(readString(from));
- bool repair, dontCheckSigs;
- from >> repair >> dontCheckSigs;
+ from >> info.ca >> repair >> dontCheckSigs;
if (!trusted && dontCheckSigs)
dontCheckSigs = false;
+
+ TeeSource tee(from);
+ ParseSink sink;
+ parseDump(sink, tee);
+
startWork();
- store->addToStore(info, nar, repair, dontCheckSigs, nullptr);
+ store->addToStore(info, tee.data, repair, dontCheckSigs, nullptr);
stopWork();
break;
}