forked from lix-project/lix
read(): Use char * instead of unsigned char *
This gets rid of some pointless casts.
This commit is contained in:
parent
faa31f4084
commit
1b79b5b983
|
@ -165,7 +165,7 @@ struct TunnelSource : BufferedSource
|
||||||
Source & from;
|
Source & from;
|
||||||
BufferedSink & to;
|
BufferedSink & to;
|
||||||
TunnelSource(Source & from, BufferedSink & to) : from(from), to(to) { }
|
TunnelSource(Source & from, BufferedSink & to) : from(from), to(to) { }
|
||||||
size_t readUnbuffered(unsigned char * data, size_t len) override
|
size_t readUnbuffered(char * data, size_t len) override
|
||||||
{
|
{
|
||||||
to << STDERR_READ << len;
|
to << STDERR_READ << len;
|
||||||
to.flush();
|
to.flush();
|
||||||
|
|
|
@ -1143,7 +1143,7 @@ StorePath LocalStore::addToStoreFromDump(Source & source0, const string & name,
|
||||||
dump.resize(oldSize + want);
|
dump.resize(oldSize + want);
|
||||||
auto got = 0;
|
auto got = 0;
|
||||||
try {
|
try {
|
||||||
got = source.read((uint8_t *) dump.data() + oldSize, want);
|
got = source.read(dump.data() + oldSize, want);
|
||||||
} catch (EndOfFile &) {
|
} catch (EndOfFile &) {
|
||||||
inMemory = true;
|
inMemory = true;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -96,7 +96,7 @@ struct NarAccessor : public FSAccessor
|
||||||
NarMember{FSAccessor::Type::tSymlink, false, 0, 0, target});
|
NarMember{FSAccessor::Type::tSymlink, false, 0, 0, target});
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t read(unsigned char * data, size_t len) override
|
size_t read(char * data, size_t len) override
|
||||||
{
|
{
|
||||||
auto n = source.read(data, len);
|
auto n = source.read(data, len);
|
||||||
pos += n;
|
pos += n;
|
||||||
|
|
|
@ -75,7 +75,7 @@ std::pair<ref<FSAccessor>, Path> RemoteFSAccessor::fetch(const Path & path_)
|
||||||
throw SysError("seeking in '%s'", cacheFile);
|
throw SysError("seeking in '%s'", cacheFile);
|
||||||
|
|
||||||
std::string buf(length, 0);
|
std::string buf(length, 0);
|
||||||
readFull(fd.get(), (unsigned char *) buf.data(), length);
|
readFull(fd.get(), buf.data(), length);
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
});
|
});
|
||||||
|
|
|
@ -856,7 +856,7 @@ std::exception_ptr RemoteStore::Connection::processStderr(Sink * sink, Source *
|
||||||
else if (msg == STDERR_READ) {
|
else if (msg == STDERR_READ) {
|
||||||
if (!source) throw Error("no source");
|
if (!source) throw Error("no source");
|
||||||
size_t len = readNum<size_t>(from);
|
size_t len = readNum<size_t>(from);
|
||||||
auto buf = std::make_unique<unsigned char[]>(len);
|
auto buf = std::make_unique<char[]>(len);
|
||||||
writeString({(const char *) buf.get(), source->read(buf.get(), len)}, to);
|
writeString({(const char *) buf.get(), source->read(buf.get(), len)}, to);
|
||||||
to.flush();
|
to.flush();
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,14 +50,14 @@ static void dumpContents(const Path & path, size_t size,
|
||||||
AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_CLOEXEC);
|
AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_CLOEXEC);
|
||||||
if (!fd) throw SysError("opening file '%1%'", path);
|
if (!fd) throw SysError("opening file '%1%'", path);
|
||||||
|
|
||||||
std::vector<unsigned char> buf(65536);
|
std::vector<char> buf(65536);
|
||||||
size_t left = size;
|
size_t left = size;
|
||||||
|
|
||||||
while (left > 0) {
|
while (left > 0) {
|
||||||
auto n = std::min(left, buf.size());
|
auto n = std::min(left, buf.size());
|
||||||
readFull(fd.get(), buf.data(), n);
|
readFull(fd.get(), buf.data(), n);
|
||||||
left -= n;
|
left -= n;
|
||||||
sink({(char *) buf.data(), n});
|
sink({buf.data(), n});
|
||||||
}
|
}
|
||||||
|
|
||||||
writePadding(size, sink);
|
writePadding(size, sink);
|
||||||
|
@ -155,14 +155,14 @@ static void parseContents(ParseSink & sink, Source & source, const Path & path)
|
||||||
sink.preallocateContents(size);
|
sink.preallocateContents(size);
|
||||||
|
|
||||||
uint64_t left = size;
|
uint64_t left = size;
|
||||||
std::vector<unsigned char> buf(65536);
|
std::vector<char> buf(65536);
|
||||||
|
|
||||||
while (left) {
|
while (left) {
|
||||||
checkInterrupt();
|
checkInterrupt();
|
||||||
auto n = buf.size();
|
auto n = buf.size();
|
||||||
if ((uint64_t)n > left) n = left;
|
if ((uint64_t)n > left) n = left;
|
||||||
source(buf.data(), n);
|
source(buf.data(), n);
|
||||||
sink.receiveContents({(char *) buf.data(), n});
|
sink.receiveContents({buf.data(), n});
|
||||||
left -= n;
|
left -= n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -84,7 +84,7 @@ bool FdSink::good()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Source::operator () (unsigned char * data, size_t len)
|
void Source::operator () (char * data, size_t len)
|
||||||
{
|
{
|
||||||
while (len) {
|
while (len) {
|
||||||
size_t n = read(data, len);
|
size_t n = read(data, len);
|
||||||
|
@ -96,12 +96,12 @@ void Source::operator () (unsigned char * data, size_t len)
|
||||||
void Source::drainInto(Sink & sink)
|
void Source::drainInto(Sink & sink)
|
||||||
{
|
{
|
||||||
std::string s;
|
std::string s;
|
||||||
std::vector<unsigned char> buf(8192);
|
std::vector<char> buf(8192);
|
||||||
while (true) {
|
while (true) {
|
||||||
size_t n;
|
size_t n;
|
||||||
try {
|
try {
|
||||||
n = read(buf.data(), buf.size());
|
n = read(buf.data(), buf.size());
|
||||||
sink({(char *) buf.data(), n});
|
sink({buf.data(), n});
|
||||||
} catch (EndOfFile &) {
|
} catch (EndOfFile &) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -117,9 +117,9 @@ std::string Source::drain()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
size_t BufferedSource::read(unsigned char * data, size_t len)
|
size_t BufferedSource::read(char * data, size_t len)
|
||||||
{
|
{
|
||||||
if (!buffer) buffer = decltype(buffer)(new unsigned char[bufSize]);
|
if (!buffer) buffer = decltype(buffer)(new char[bufSize]);
|
||||||
|
|
||||||
if (!bufPosIn) bufPosIn = readUnbuffered(buffer.get(), bufSize);
|
if (!bufPosIn) bufPosIn = readUnbuffered(buffer.get(), bufSize);
|
||||||
|
|
||||||
|
@ -138,12 +138,12 @@ bool BufferedSource::hasData()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
size_t FdSource::readUnbuffered(unsigned char * data, size_t len)
|
size_t FdSource::readUnbuffered(char * data, size_t len)
|
||||||
{
|
{
|
||||||
ssize_t n;
|
ssize_t n;
|
||||||
do {
|
do {
|
||||||
checkInterrupt();
|
checkInterrupt();
|
||||||
n = ::read(fd, (char *) data, len);
|
n = ::read(fd, data, len);
|
||||||
} while (n == -1 && errno == EINTR);
|
} while (n == -1 && errno == EINTR);
|
||||||
if (n == -1) { _good = false; throw SysError("reading from file"); }
|
if (n == -1) { _good = false; throw SysError("reading from file"); }
|
||||||
if (n == 0) { _good = false; throw EndOfFile("unexpected end-of-file"); }
|
if (n == 0) { _good = false; throw EndOfFile("unexpected end-of-file"); }
|
||||||
|
@ -158,10 +158,10 @@ bool FdSource::good()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
size_t StringSource::read(unsigned char * data, size_t len)
|
size_t StringSource::read(char * data, size_t len)
|
||||||
{
|
{
|
||||||
if (pos == s.size()) throw EndOfFile("end of string reached");
|
if (pos == s.size()) throw EndOfFile("end of string reached");
|
||||||
size_t n = s.copy((char *) data, len, pos);
|
size_t n = s.copy(data, len, pos);
|
||||||
pos += n;
|
pos += n;
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
@ -225,7 +225,7 @@ std::unique_ptr<Source> sinkToSource(
|
||||||
std::string cur;
|
std::string cur;
|
||||||
size_t pos = 0;
|
size_t pos = 0;
|
||||||
|
|
||||||
size_t read(unsigned char * data, size_t len) override
|
size_t read(char * data, size_t len) override
|
||||||
{
|
{
|
||||||
if (!coro)
|
if (!coro)
|
||||||
coro = coro_t::pull_type(VirtualStackAllocator{}, [&](coro_t::push_type & yield) {
|
coro = coro_t::pull_type(VirtualStackAllocator{}, [&](coro_t::push_type & yield) {
|
||||||
|
@ -244,7 +244,7 @@ std::unique_ptr<Source> sinkToSource(
|
||||||
}
|
}
|
||||||
|
|
||||||
auto n = std::min(cur.size() - pos, len);
|
auto n = std::min(cur.size() - pos, len);
|
||||||
memcpy(data, (unsigned char *) cur.data() + pos, n);
|
memcpy(data, cur.data() + pos, n);
|
||||||
pos += n;
|
pos += n;
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
|
@ -258,9 +258,9 @@ std::unique_ptr<Source> sinkToSource(
|
||||||
void writePadding(size_t len, Sink & sink)
|
void writePadding(size_t len, Sink & sink)
|
||||||
{
|
{
|
||||||
if (len % 8) {
|
if (len % 8) {
|
||||||
unsigned char zero[8];
|
char zero[8];
|
||||||
memset(zero, 0, sizeof(zero));
|
memset(zero, 0, sizeof(zero));
|
||||||
sink({(char *) zero, 8 - (len % 8)});
|
sink({zero, 8 - (len % 8)});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -321,7 +321,7 @@ Sink & operator << (Sink & sink, const Error & ex)
|
||||||
void readPadding(size_t len, Source & source)
|
void readPadding(size_t len, Source & source)
|
||||||
{
|
{
|
||||||
if (len % 8) {
|
if (len % 8) {
|
||||||
unsigned char zero[8];
|
char zero[8];
|
||||||
size_t n = 8 - (len % 8);
|
size_t n = 8 - (len % 8);
|
||||||
source(zero, n);
|
source(zero, n);
|
||||||
for (unsigned int i = 0; i < n; i++)
|
for (unsigned int i = 0; i < n; i++)
|
||||||
|
@ -330,7 +330,7 @@ void readPadding(size_t len, Source & source)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
size_t readString(unsigned char * buf, size_t max, Source & source)
|
size_t readString(char * buf, size_t max, Source & source)
|
||||||
{
|
{
|
||||||
auto len = readNum<size_t>(source);
|
auto len = readNum<size_t>(source);
|
||||||
if (len > max) throw SerialisationError("string is too long");
|
if (len > max) throw SerialisationError("string is too long");
|
||||||
|
@ -345,7 +345,7 @@ string readString(Source & source, size_t max)
|
||||||
auto len = readNum<size_t>(source);
|
auto len = readNum<size_t>(source);
|
||||||
if (len > max) throw SerialisationError("string is too long");
|
if (len > max) throw SerialisationError("string is too long");
|
||||||
std::string res(len, 0);
|
std::string res(len, 0);
|
||||||
source((unsigned char*) res.data(), len);
|
source(res.data(), len);
|
||||||
readPadding(len, source);
|
readPadding(len, source);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -404,7 +404,7 @@ void StringSink::operator () (std::string_view data)
|
||||||
s->append(data);
|
s->append(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ChainSource::read(unsigned char * data, size_t len)
|
size_t ChainSource::read(char * data, size_t len)
|
||||||
{
|
{
|
||||||
if (useSecond) {
|
if (useSecond) {
|
||||||
return source2.read(data, len);
|
return source2.read(data, len);
|
||||||
|
|
|
@ -51,12 +51,12 @@ struct Source
|
||||||
/* Store exactly ‘len’ bytes in the buffer pointed to by ‘data’.
|
/* Store exactly ‘len’ bytes in the buffer pointed to by ‘data’.
|
||||||
It blocks until all the requested data is available, or throws
|
It blocks until all the requested data is available, or throws
|
||||||
an error if it is not going to be available. */
|
an error if it is not going to be available. */
|
||||||
void operator () (unsigned char * data, size_t len);
|
void operator () (char * data, size_t len);
|
||||||
|
|
||||||
/* Store up to ‘len’ in the buffer pointed to by ‘data’, and
|
/* Store up to ‘len’ in the buffer pointed to by ‘data’, and
|
||||||
return the number of bytes stored. It blocks until at least
|
return the number of bytes stored. It blocks until at least
|
||||||
one byte is available. */
|
one byte is available. */
|
||||||
virtual size_t read(unsigned char * data, size_t len) = 0;
|
virtual size_t read(char * data, size_t len) = 0;
|
||||||
|
|
||||||
virtual bool good() { return true; }
|
virtual bool good() { return true; }
|
||||||
|
|
||||||
|
@ -71,18 +71,18 @@ struct Source
|
||||||
struct BufferedSource : Source
|
struct BufferedSource : Source
|
||||||
{
|
{
|
||||||
size_t bufSize, bufPosIn, bufPosOut;
|
size_t bufSize, bufPosIn, bufPosOut;
|
||||||
std::unique_ptr<unsigned char[]> buffer;
|
std::unique_ptr<char[]> buffer;
|
||||||
|
|
||||||
BufferedSource(size_t bufSize = 32 * 1024)
|
BufferedSource(size_t bufSize = 32 * 1024)
|
||||||
: bufSize(bufSize), bufPosIn(0), bufPosOut(0), buffer(nullptr) { }
|
: bufSize(bufSize), bufPosIn(0), bufPosOut(0), buffer(nullptr) { }
|
||||||
|
|
||||||
size_t read(unsigned char * data, size_t len) override;
|
size_t read(char * data, size_t len) override;
|
||||||
|
|
||||||
bool hasData();
|
bool hasData();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/* Underlying read call, to be overridden. */
|
/* Underlying read call, to be overridden. */
|
||||||
virtual size_t readUnbuffered(unsigned char * data, size_t len) = 0;
|
virtual size_t readUnbuffered(char * data, size_t len) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -138,7 +138,7 @@ struct FdSource : BufferedSource
|
||||||
|
|
||||||
bool good() override;
|
bool good() override;
|
||||||
protected:
|
protected:
|
||||||
size_t readUnbuffered(unsigned char * data, size_t len) override;
|
size_t readUnbuffered(char * data, size_t len) override;
|
||||||
private:
|
private:
|
||||||
bool _good = true;
|
bool _good = true;
|
||||||
};
|
};
|
||||||
|
@ -163,7 +163,7 @@ struct StringSource : Source
|
||||||
const string & s;
|
const string & s;
|
||||||
size_t pos;
|
size_t pos;
|
||||||
StringSource(const string & _s) : s(_s), pos(0) { }
|
StringSource(const string & _s) : s(_s), pos(0) { }
|
||||||
size_t read(unsigned char * data, size_t len) override;
|
size_t read(char * data, size_t len) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -187,10 +187,10 @@ struct TeeSource : Source
|
||||||
Sink & sink;
|
Sink & sink;
|
||||||
TeeSource(Source & orig, Sink & sink)
|
TeeSource(Source & orig, Sink & sink)
|
||||||
: orig(orig), sink(sink) { }
|
: orig(orig), sink(sink) { }
|
||||||
size_t read(unsigned char * data, size_t len)
|
size_t read(char * data, size_t len)
|
||||||
{
|
{
|
||||||
size_t n = orig.read(data, len);
|
size_t n = orig.read(data, len);
|
||||||
sink({(char *) data, n});
|
sink({data, n});
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -202,7 +202,7 @@ struct SizedSource : Source
|
||||||
size_t remain;
|
size_t remain;
|
||||||
SizedSource(Source & orig, size_t size)
|
SizedSource(Source & orig, size_t size)
|
||||||
: orig(orig), remain(size) { }
|
: orig(orig), remain(size) { }
|
||||||
size_t read(unsigned char * data, size_t len)
|
size_t read(char * data, size_t len)
|
||||||
{
|
{
|
||||||
if (this->remain <= 0) {
|
if (this->remain <= 0) {
|
||||||
throw EndOfFile("sized: unexpected end-of-file");
|
throw EndOfFile("sized: unexpected end-of-file");
|
||||||
|
@ -216,7 +216,7 @@ struct SizedSource : Source
|
||||||
/* Consume the original source until no remain data is left to consume. */
|
/* Consume the original source until no remain data is left to consume. */
|
||||||
size_t drainAll()
|
size_t drainAll()
|
||||||
{
|
{
|
||||||
std::vector<unsigned char> buf(8192);
|
std::vector<char> buf(8192);
|
||||||
size_t sum = 0;
|
size_t sum = 0;
|
||||||
while (this->remain > 0) {
|
while (this->remain > 0) {
|
||||||
size_t n = read(buf.data(), buf.size());
|
size_t n = read(buf.data(), buf.size());
|
||||||
|
@ -256,13 +256,13 @@ struct LambdaSink : Sink
|
||||||
/* Convert a function into a source. */
|
/* Convert a function into a source. */
|
||||||
struct LambdaSource : Source
|
struct LambdaSource : Source
|
||||||
{
|
{
|
||||||
typedef std::function<size_t(unsigned char *, size_t)> lambda_t;
|
typedef std::function<size_t(char *, size_t)> lambda_t;
|
||||||
|
|
||||||
lambda_t lambda;
|
lambda_t lambda;
|
||||||
|
|
||||||
LambdaSource(const lambda_t & lambda) : lambda(lambda) { }
|
LambdaSource(const lambda_t & lambda) : lambda(lambda) { }
|
||||||
|
|
||||||
size_t read(unsigned char * data, size_t len) override
|
size_t read(char * data, size_t len) override
|
||||||
{
|
{
|
||||||
return lambda(data, len);
|
return lambda(data, len);
|
||||||
}
|
}
|
||||||
|
@ -278,7 +278,7 @@ struct ChainSource : Source
|
||||||
: source1(s1), source2(s2)
|
: source1(s1), source2(s2)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
size_t read(unsigned char * data, size_t len) override;
|
size_t read(char * data, size_t len) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -322,7 +322,7 @@ template<typename T>
|
||||||
T readNum(Source & source)
|
T readNum(Source & source)
|
||||||
{
|
{
|
||||||
unsigned char buf[8];
|
unsigned char buf[8];
|
||||||
source(buf, sizeof(buf));
|
source((char *) buf, sizeof(buf));
|
||||||
|
|
||||||
uint64_t n =
|
uint64_t n =
|
||||||
((uint64_t) buf[0]) |
|
((uint64_t) buf[0]) |
|
||||||
|
@ -354,7 +354,7 @@ inline uint64_t readLongLong(Source & source)
|
||||||
|
|
||||||
|
|
||||||
void readPadding(size_t len, Source & source);
|
void readPadding(size_t len, Source & source);
|
||||||
size_t readString(unsigned char * buf, size_t max, Source & source);
|
size_t readString(char * buf, size_t max, Source & source);
|
||||||
string readString(Source & source, size_t max = std::numeric_limits<size_t>::max());
|
string readString(Source & source, size_t max = std::numeric_limits<size_t>::max());
|
||||||
template<class T> T readStrings(Source & source);
|
template<class T> T readStrings(Source & source);
|
||||||
|
|
||||||
|
@ -386,9 +386,9 @@ struct StreamToSourceAdapter : Source
|
||||||
: istream(istream)
|
: istream(istream)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
size_t read(unsigned char * data, size_t len) override
|
size_t read(char * data, size_t len) override
|
||||||
{
|
{
|
||||||
if (!istream->read((char *) data, len)) {
|
if (!istream->read(data, len)) {
|
||||||
if (istream->eof()) {
|
if (istream->eof()) {
|
||||||
if (istream->gcount() == 0)
|
if (istream->gcount() == 0)
|
||||||
throw EndOfFile("end of file");
|
throw EndOfFile("end of file");
|
||||||
|
@ -411,7 +411,7 @@ struct FramedSource : Source
|
||||||
{
|
{
|
||||||
Source & from;
|
Source & from;
|
||||||
bool eof = false;
|
bool eof = false;
|
||||||
std::vector<unsigned char> pending;
|
std::vector<char> pending;
|
||||||
size_t pos = 0;
|
size_t pos = 0;
|
||||||
|
|
||||||
FramedSource(Source & from) : from(from)
|
FramedSource(Source & from) : from(from)
|
||||||
|
@ -423,13 +423,13 @@ struct FramedSource : Source
|
||||||
while (true) {
|
while (true) {
|
||||||
auto n = readInt(from);
|
auto n = readInt(from);
|
||||||
if (!n) break;
|
if (!n) break;
|
||||||
std::vector<unsigned char> data(n);
|
std::vector<char> data(n);
|
||||||
from(data.data(), n);
|
from(data.data(), n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t read(unsigned char * data, size_t len) override
|
size_t read(char * data, size_t len) override
|
||||||
{
|
{
|
||||||
if (eof) throw EndOfFile("reached end of FramedSource");
|
if (eof) throw EndOfFile("reached end of FramedSource");
|
||||||
|
|
||||||
|
@ -439,7 +439,7 @@ struct FramedSource : Source
|
||||||
eof = true;
|
eof = true;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
pending = std::vector<unsigned char>(len);
|
pending = std::vector<char>(len);
|
||||||
pos = 0;
|
pos = 0;
|
||||||
from(pending.data(), len);
|
from(pending.data(), len);
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,7 +66,7 @@ private:
|
||||||
*buffer = self->buffer.data();
|
*buffer = self->buffer.data();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return self->source->read(self->buffer.data(), 4096);
|
return self->source->read((char *) self->buffer.data(), 4096);
|
||||||
} catch (EndOfFile &) {
|
} catch (EndOfFile &) {
|
||||||
return 0;
|
return 0;
|
||||||
} catch (std::exception & err) {
|
} catch (std::exception & err) {
|
||||||
|
|
|
@ -340,13 +340,13 @@ void writeFile(const Path & path, Source & source, mode_t mode)
|
||||||
if (!fd)
|
if (!fd)
|
||||||
throw SysError("opening file '%1%'", path);
|
throw SysError("opening file '%1%'", path);
|
||||||
|
|
||||||
std::vector<unsigned char> buf(64 * 1024);
|
std::vector<char> buf(64 * 1024);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
while (true) {
|
while (true) {
|
||||||
try {
|
try {
|
||||||
auto n = source.read(buf.data(), buf.size());
|
auto n = source.read(buf.data(), buf.size());
|
||||||
writeFull(fd.get(), {(char *) buf.data(), n});
|
writeFull(fd.get(), {buf.data(), n});
|
||||||
} catch (EndOfFile &) { break; }
|
} catch (EndOfFile &) { break; }
|
||||||
}
|
}
|
||||||
} catch (Error & e) {
|
} catch (Error & e) {
|
||||||
|
@ -632,11 +632,11 @@ void replaceSymlink(const Path & target, const Path & link,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void readFull(int fd, unsigned char * buf, size_t count)
|
void readFull(int fd, char * buf, size_t count)
|
||||||
{
|
{
|
||||||
while (count) {
|
while (count) {
|
||||||
checkInterrupt();
|
checkInterrupt();
|
||||||
ssize_t res = read(fd, (char *) buf, count);
|
ssize_t res = read(fd, buf, count);
|
||||||
if (res == -1) {
|
if (res == -1) {
|
||||||
if (errno == EINTR) continue;
|
if (errno == EINTR) continue;
|
||||||
throw SysError("reading from file");
|
throw SysError("reading from file");
|
||||||
|
@ -1137,7 +1137,7 @@ void runProgram2(const RunOptions & options)
|
||||||
in.readSide = -1;
|
in.readSide = -1;
|
||||||
writerThread = std::thread([&]() {
|
writerThread = std::thread([&]() {
|
||||||
try {
|
try {
|
||||||
std::vector<unsigned char> buf(8 * 1024);
|
std::vector<char> buf(8 * 1024);
|
||||||
while (true) {
|
while (true) {
|
||||||
size_t n;
|
size_t n;
|
||||||
try {
|
try {
|
||||||
|
@ -1145,7 +1145,7 @@ void runProgram2(const RunOptions & options)
|
||||||
} catch (EndOfFile &) {
|
} catch (EndOfFile &) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
writeFull(in.writeSide.get(), {(char *) buf.data(), n});
|
writeFull(in.writeSide.get(), {buf.data(), n});
|
||||||
}
|
}
|
||||||
promise.set_value();
|
promise.set_value();
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
|
|
|
@ -155,7 +155,7 @@ void replaceSymlink(const Path & target, const Path & link,
|
||||||
|
|
||||||
/* Wrappers arount read()/write() that read/write exactly the
|
/* Wrappers arount read()/write() that read/write exactly the
|
||||||
requested number of bytes. */
|
requested number of bytes. */
|
||||||
void readFull(int fd, unsigned char * buf, size_t count);
|
void readFull(int fd, char * buf, size_t count);
|
||||||
void writeFull(int fd, std::string_view s, bool allowInterrupts = true);
|
void writeFull(int fd, std::string_view s, bool allowInterrupts = true);
|
||||||
|
|
||||||
MakeError(EndOfFile, Error);
|
MakeError(EndOfFile, Error);
|
||||||
|
|
Loading…
Reference in a new issue