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:
eldritch horrors 2024-03-23 19:37:09 +01:00
parent b252b3c6e3
commit c65f5dd18e
3 changed files with 6 additions and 5 deletions

View file

@ -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};
} }
} }

View file

@ -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
{ {

View file

@ -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();