Handle importing NARs containing files greater than 4 GiB
Also templatize readInt() to work for various integer types.
This commit is contained in:
parent
0780805246
commit
c4a40949d9
7 changed files with 84 additions and 81 deletions
|
@ -397,8 +397,8 @@ PathSet BasicDerivation::outputPaths() const
|
|||
Source & readDerivation(Source & in, Store & store, BasicDerivation & drv)
|
||||
{
|
||||
drv.outputs.clear();
|
||||
auto nr = readInt(in);
|
||||
for (unsigned int n = 0; n < nr; n++) {
|
||||
auto nr = readNum<size_t>(in);
|
||||
for (size_t n = 0; n < nr; n++) {
|
||||
auto name = readString(in);
|
||||
DerivationOutput o;
|
||||
in >> o.path >> o.hashAlgo >> o.hash;
|
||||
|
@ -410,8 +410,8 @@ Source & readDerivation(Source & in, Store & store, BasicDerivation & drv)
|
|||
in >> drv.platform >> drv.builder;
|
||||
drv.args = readStrings<Strings>(in);
|
||||
|
||||
nr = readInt(in);
|
||||
for (unsigned int n = 0; n < nr; n++) {
|
||||
nr = readNum<size_t>(in);
|
||||
for (size_t n = 0; n < nr; n++) {
|
||||
auto key = readString(in);
|
||||
auto value = readString(in);
|
||||
drv.env[key] = value;
|
||||
|
|
|
@ -86,7 +86,7 @@ Paths Store::importPaths(Source & source, std::shared_ptr<FSAccessor> accessor,
|
|||
{
|
||||
Paths res;
|
||||
while (true) {
|
||||
unsigned long long n = readLongLong(source);
|
||||
auto n = readNum<uint64_t>(source);
|
||||
if (n == 0) break;
|
||||
if (n != 1) throw Error("input doesn't look like something created by ‘nix-store --export’");
|
||||
|
||||
|
|
|
@ -108,7 +108,7 @@ void RemoteStore::initConnection(Connection & conn)
|
|||
unsigned int magic = readInt(conn.from);
|
||||
if (magic != WORKER_MAGIC_2) throw Error("protocol mismatch");
|
||||
|
||||
conn.daemonVersion = readInt(conn.from);
|
||||
conn.from >> conn.daemonVersion;
|
||||
if (GET_PROTOCOL_MAJOR(conn.daemonVersion) != GET_PROTOCOL_MAJOR(PROTOCOL_VERSION))
|
||||
throw Error("Nix daemon protocol version not supported");
|
||||
if (GET_PROTOCOL_MINOR(conn.daemonVersion) < 10)
|
||||
|
@ -170,8 +170,7 @@ bool RemoteStore::isValidPathUncached(const Path & path)
|
|||
auto conn(connections->get());
|
||||
conn->to << wopIsValidPath << path;
|
||||
conn->processStderr();
|
||||
unsigned int reply = readInt(conn->from);
|
||||
return reply != 0;
|
||||
return readInt(conn->from);
|
||||
}
|
||||
|
||||
|
||||
|
@ -246,8 +245,8 @@ void RemoteStore::querySubstitutablePathInfos(const PathSet & paths,
|
|||
|
||||
conn->to << wopQuerySubstitutablePathInfos << paths;
|
||||
conn->processStderr();
|
||||
unsigned int count = readInt(conn->from);
|
||||
for (unsigned int n = 0; n < count; n++) {
|
||||
size_t count = readNum<size_t>(conn->from);
|
||||
for (size_t n = 0; n < count; n++) {
|
||||
Path path = readStorePath(*this, conn->from);
|
||||
SubstitutablePathInfo & info(infos[path]);
|
||||
info.deriver = readString(conn->from);
|
||||
|
@ -277,7 +276,7 @@ void RemoteStore::queryPathInfoUncached(const Path & path,
|
|||
throw;
|
||||
}
|
||||
if (GET_PROTOCOL_MINOR(conn->daemonVersion) >= 17) {
|
||||
bool valid = readInt(conn->from) != 0;
|
||||
bool valid; conn->from >> valid;
|
||||
if (!valid) throw InvalidPath(format("path ‘%s’ is not valid") % path);
|
||||
}
|
||||
auto info = std::make_shared<ValidPathInfo>();
|
||||
|
@ -286,12 +285,11 @@ void RemoteStore::queryPathInfoUncached(const Path & path,
|
|||
if (info->deriver != "") assertStorePath(info->deriver);
|
||||
info->narHash = parseHash(htSHA256, readString(conn->from));
|
||||
info->references = readStorePaths<PathSet>(*this, conn->from);
|
||||
info->registrationTime = readInt(conn->from);
|
||||
info->narSize = readLongLong(conn->from);
|
||||
conn->from >> info->registrationTime >> info->narSize;
|
||||
if (GET_PROTOCOL_MINOR(conn->daemonVersion) >= 16) {
|
||||
info->ultimate = readInt(conn->from) != 0;
|
||||
conn->from >> info->ultimate;
|
||||
info->sigs = readStrings<StringSet>(conn->from);
|
||||
info->ca = readString(conn->from);
|
||||
conn->from >> info->ca;
|
||||
}
|
||||
return info;
|
||||
});
|
||||
|
@ -515,7 +513,7 @@ Roots RemoteStore::findRoots()
|
|||
auto conn(connections->get());
|
||||
conn->to << wopFindRoots;
|
||||
conn->processStderr();
|
||||
unsigned int count = readInt(conn->from);
|
||||
size_t count = readNum<size_t>(conn->from);
|
||||
Roots result;
|
||||
while (count--) {
|
||||
Path link = readString(conn->from);
|
||||
|
@ -563,7 +561,7 @@ bool RemoteStore::verifyStore(bool checkContents, bool repair)
|
|||
auto conn(connections->get());
|
||||
conn->to << wopVerifyStore << checkContents << repair;
|
||||
conn->processStderr();
|
||||
return readInt(conn->from) != 0;
|
||||
return readInt(conn->from);
|
||||
}
|
||||
|
||||
|
||||
|
@ -599,7 +597,7 @@ void RemoteStore::Connection::processStderr(Sink * sink, Source * source)
|
|||
}
|
||||
else if (msg == STDERR_READ) {
|
||||
if (!source) throw Error("no source");
|
||||
size_t len = readInt(from);
|
||||
size_t len = readNum<size_t>(from);
|
||||
auto buf = std::make_unique<unsigned char[]>(len);
|
||||
writeString(buf.get(), source->read(buf.get(), len), to);
|
||||
to.flush();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue