aboutsummaryrefslogtreecommitdiff
path: root/src/libutil
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-05-03 22:53:24 +0200
committereldritch horrors <pennae@lix.systems>2024-06-19 10:50:12 +0000
commit11f4a5bc7eca8a4cca2ae9f3d83b69cd497933f8 (patch)
treeb991157e020697bb4f05ad4629298b183cb5ed61 /src/libutil
parent67f778670c085615470b67eb3c54885b8c2d482e (diff)
libutil: return a source from readFile
don't consume a sink, return a source instead. the only reason to not do this is a very slight reduction in dynamic allocations, but since we are going to *at least* do disk io that will not be a lot of overhead anyway Change-Id: Iae2f879ec64c3c3ac1d5310eeb6a85e696d4614a
Diffstat (limited to 'src/libutil')
-rw-r--r--src/libutil/file-system.cc9
-rw-r--r--src/libutil/file-system.hh3
-rw-r--r--src/libutil/hash.cc2
3 files changed, 10 insertions, 4 deletions
diff --git a/src/libutil/file-system.cc b/src/libutil/file-system.cc
index d573b22b4..f51f3c092 100644
--- a/src/libutil/file-system.cc
+++ b/src/libutil/file-system.cc
@@ -289,12 +289,17 @@ std::string readFile(const Path & path)
}
-void readFile(const Path & path, Sink & sink)
+box_ptr<Source> readFileSource(const Path & path)
{
AutoCloseFD fd{open(path.c_str(), O_RDONLY | O_CLOEXEC)};
if (!fd)
throw SysError("opening file '%s'", path);
- drainFD(fd.get(), sink);
+
+ struct FileSource : FdSource {
+ AutoCloseFD fd;
+ explicit FileSource(AutoCloseFD fd) : FdSource(fd.get()), fd(std::move(fd)) {}
+ };
+ return make_box_ptr<FileSource>(std::move(fd));
}
diff --git a/src/libutil/file-system.hh b/src/libutil/file-system.hh
index 6c1923d55..64d884227 100644
--- a/src/libutil/file-system.hh
+++ b/src/libutil/file-system.hh
@@ -5,6 +5,7 @@
* Utiltities for working with the file sytem and file paths.
*/
+#include "box_ptr.hh"
#include "types.hh"
#include "file-descriptor.hh"
@@ -142,7 +143,7 @@ unsigned char getFileType(const Path & path);
* Read the contents of a file into a string.
*/
std::string readFile(const Path & path);
-void readFile(const Path & path, Sink & sink);
+box_ptr<Source> readFileSource(const Path & path);
/**
* Write a string to a file.
diff --git a/src/libutil/hash.cc b/src/libutil/hash.cc
index 006b5000c..822fa150e 100644
--- a/src/libutil/hash.cc
+++ b/src/libutil/hash.cc
@@ -324,7 +324,7 @@ Hash hashString(HashType ht, std::string_view s)
Hash hashFile(HashType ht, const Path & path)
{
HashSink sink(ht);
- readFile(path, sink);
+ readFileSource(path)->drainInto(sink);
return sink.finish().first;
}