forked from lix-project/lix
libutil: convert drainFD to a Bytes generator
the `*Source` name is a slight misnomer since we do also have a
Source type, but we can probably live with this for time being.
Change-Id: I54eb2e59a4009014e324797f16b80b962759c7d3
This commit is contained in:
parent
b252b3c6e3
commit
c65f5dd18e
|
@ -81,12 +81,12 @@ std::string drainFD(int fd, bool block, const size_t reserveSize)
|
||||||
// the parser needs two extra bytes to append terminating characters, other users will
|
// the parser needs two extra bytes to append terminating characters, other users will
|
||||||
// not care very much about the extra memory.
|
// not care very much about the extra memory.
|
||||||
StringSink sink(reserveSize + 2);
|
StringSink sink(reserveSize + 2);
|
||||||
drainFD(fd, sink, block);
|
sink << drainFDSource(fd, block);
|
||||||
return std::move(sink.s);
|
return std::move(sink.s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void drainFD(int fd, Sink & sink, bool block)
|
Generator<Bytes> drainFDSource(int fd, bool block)
|
||||||
{
|
{
|
||||||
// silence GCC maybe-uninitialized warning in finally
|
// silence GCC maybe-uninitialized warning in finally
|
||||||
int saved = 0;
|
int saved = 0;
|
||||||
|
@ -115,7 +115,7 @@ void drainFD(int fd, Sink & sink, bool block)
|
||||||
throw SysError("reading from file");
|
throw SysError("reading from file");
|
||||||
}
|
}
|
||||||
else if (rd == 0) break;
|
else if (rd == 0) break;
|
||||||
else sink({(char *) buf.data(), (size_t) rd});
|
else co_yield std::span{(char *) buf.data(), (size_t) rd};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
///@file
|
///@file
|
||||||
|
|
||||||
#include "error.hh"
|
#include "error.hh"
|
||||||
|
#include "generator.hh"
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
|
@ -35,7 +36,7 @@ void writeFull(int fd, std::string_view s, bool allowInterrupts = true);
|
||||||
*/
|
*/
|
||||||
std::string drainFD(int fd, bool block = true, const size_t reserveSize=0);
|
std::string drainFD(int fd, bool block = true, const size_t reserveSize=0);
|
||||||
|
|
||||||
void drainFD(int fd, Sink & sink, bool block = true);
|
Generator<Bytes> drainFDSource(int fd, bool block = true);
|
||||||
|
|
||||||
class AutoCloseFD
|
class AutoCloseFD
|
||||||
{
|
{
|
||||||
|
|
|
@ -315,7 +315,7 @@ void runProgram2(const RunOptions & options)
|
||||||
out.writeSide.close();
|
out.writeSide.close();
|
||||||
|
|
||||||
if (options.standardOut)
|
if (options.standardOut)
|
||||||
drainFD(out.readSide.get(), *options.standardOut);
|
*options.standardOut << drainFDSource(out.readSide.get());
|
||||||
|
|
||||||
/* Wait for the child to finish. */
|
/* Wait for the child to finish. */
|
||||||
int status = pid.wait();
|
int status = pid.wait();
|
||||||
|
|
Loading…
Reference in a new issue