1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-06-27 21:01:16 +02:00

Expose RestoreSink in header (fs-sink.hh)

Co-Authored-By: Matthew Bauer <mjbauer95@gmail.com>
Co-Authored-By: Carlo Nucera <carlo.nucera@protonmail.com>
This commit is contained in:
John Ericson 2023-09-07 22:49:01 -04:00
parent 8a416e819c
commit f2e201fbdb
2 changed files with 73 additions and 61 deletions

View file

@ -15,32 +15,28 @@ static RestoreSinkSettings restoreSinkSettings;
static GlobalConfig::Register r1(&restoreSinkSettings); static GlobalConfig::Register r1(&restoreSinkSettings);
struct RestoreSink : ParseSink
{
Path dstPath;
AutoCloseFD fd;
void createDirectory(const Path & path) override void RestoreSink::createDirectory(const Path & path)
{ {
Path p = dstPath + path; Path p = dstPath + path;
if (mkdir(p.c_str(), 0777) == -1) if (mkdir(p.c_str(), 0777) == -1)
throw SysError("creating directory '%1%'", p); throw SysError("creating directory '%1%'", p);
}; };
void createRegularFile(const Path & path) override void RestoreSink::createRegularFile(const Path & path)
{ {
Path p = dstPath + path; Path p = dstPath + path;
fd = open(p.c_str(), O_CREAT | O_EXCL | O_WRONLY | O_CLOEXEC, 0666); fd = open(p.c_str(), O_CREAT | O_EXCL | O_WRONLY | O_CLOEXEC, 0666);
if (!fd) throw SysError("creating file '%1%'", p); if (!fd) throw SysError("creating file '%1%'", p);
} }
void closeRegularFile() override void RestoreSink::closeRegularFile()
{ {
/* Call close explicitly to make sure the error is checked */ /* Call close explicitly to make sure the error is checked */
fd.close(); fd.close();
} }
void isExecutable() override void RestoreSink::isExecutable()
{ {
struct stat st; struct stat st;
if (fstat(fd.get(), &st) == -1) if (fstat(fd.get(), &st) == -1)
@ -49,9 +45,9 @@ struct RestoreSink : ParseSink
throw SysError("fchmod"); throw SysError("fchmod");
} }
void preallocateContents(uint64_t len) override void RestoreSink::preallocateContents(uint64_t len)
{ {
if (!archiveSettings.preallocateContents) if (!restoreSinkSettings.preallocateContents)
return; return;
#if HAVE_POSIX_FALLOCATE #if HAVE_POSIX_FALLOCATE
@ -67,16 +63,15 @@ struct RestoreSink : ParseSink
#endif #endif
} }
void receiveContents(std::string_view data) override void RestoreSink::receiveContents(std::string_view data)
{ {
writeFull(fd.get(), data); writeFull(fd.get(), data);
} }
void createSymlink(const Path & path, const std::string & target) override void RestoreSink::createSymlink(const Path & path, const std::string & target)
{ {
Path p = dstPath + path; Path p = dstPath + path;
nix::createSymlink(target, p); nix::createSymlink(target, p);
} }
};
} }

View file

@ -22,4 +22,21 @@ struct ParseSink
virtual void createSymlink(const Path & path, const std::string & target) { }; virtual void createSymlink(const Path & path, const std::string & target) { };
}; };
struct RestoreSink : ParseSink
{
Path dstPath;
AutoCloseFD fd;
void createDirectory(const Path & path) override;
void createRegularFile(const Path & path) override;
void closeRegularFile() override;
void isExecutable() override;
void preallocateContents(uint64_t size) override;
void receiveContents(std::string_view data) override;
void createSymlink(const Path & path, const std::string & target) override;
};
} }