mirror of
https://github.com/NixOS/nix.git
synced 2025-12-05 00:21:01 +01:00
libutil: Get rid of restartableSourceFromFactory
Instead we can just seek back in the file - duh. Also this makes use of the anonymous temp file facility, since that is much safer (no need window where the we don't have an open file descriptor for it).
This commit is contained in:
parent
4ad272015e
commit
4b3536e092
4 changed files with 43 additions and 73 deletions
|
|
@ -201,6 +201,16 @@ bool FdSource::hasData()
|
|||
}
|
||||
}
|
||||
|
||||
void FdSource::restart()
|
||||
{
|
||||
if (!isSeekable)
|
||||
throw Error("can't seek to the start of a file");
|
||||
buffer.reset();
|
||||
read = bufPosOut = bufPosOut = 0;
|
||||
if (lseek(fd, 0, SEEK_SET) == -1)
|
||||
throw SysError("seeking to the start of a file");
|
||||
}
|
||||
|
||||
void FdSource::skip(size_t len)
|
||||
{
|
||||
/* Discard data in the buffer. */
|
||||
|
|
@ -527,41 +537,4 @@ size_t ChainSource::read(char * data, size_t len)
|
|||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<RestartableSource> restartableSourceFromFactory(std::function<std::unique_ptr<Source>()> factory)
|
||||
{
|
||||
struct RestartableSourceImpl : RestartableSource
|
||||
{
|
||||
RestartableSourceImpl(decltype(factory) factory_)
|
||||
: factory_(std::move(factory_))
|
||||
, impl(this->factory_())
|
||||
{
|
||||
}
|
||||
|
||||
decltype(factory) factory_;
|
||||
std::unique_ptr<Source> impl = factory_();
|
||||
|
||||
size_t read(char * data, size_t len) override
|
||||
{
|
||||
return impl->read(data, len);
|
||||
}
|
||||
|
||||
bool good() override
|
||||
{
|
||||
return impl->good();
|
||||
}
|
||||
|
||||
void skip(size_t len) override
|
||||
{
|
||||
return impl->skip(len);
|
||||
}
|
||||
|
||||
void restart() override
|
||||
{
|
||||
impl = factory_();
|
||||
}
|
||||
};
|
||||
|
||||
return std::make_unique<RestartableSourceImpl>(std::move(factory));
|
||||
}
|
||||
|
||||
} // namespace nix
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue