aboutsummaryrefslogtreecommitdiff
path: root/zencore
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2022-05-30 14:00:18 +0200
committerDan Engelbrecht <[email protected]>2022-05-30 14:02:37 +0200
commit26fb535175e44d5819b385195971b5696e6d6122 (patch)
tree145efe502a7072f150f80954a2991a409cd25c5c /zencore
parentadd comment about removing files (diff)
downloadzen-26fb535175e44d5819b385195971b5696e6d6122.tar.xz
zen-26fb535175e44d5819b385195971b5696e6d6122.zip
create local utility function for IoBufferBuilder::MakeFromFile*
Diffstat (limited to 'zencore')
-rw-r--r--zencore/iobuffer.cpp73
1 files changed, 25 insertions, 48 deletions
diff --git a/zencore/iobuffer.cpp b/zencore/iobuffer.cpp
index 61db25d0f..b948493a7 100644
--- a/zencore/iobuffer.cpp
+++ b/zencore/iobuffer.cpp
@@ -469,60 +469,20 @@ IoBufferBuilder::MakeFromFileHandle(void* FileHandle, uint64_t Offset, uint64_t
return IoBuffer(IoBuffer::BorrowedFile, FileHandle, Offset, Size);
}
-IoBuffer
-IoBufferBuilder::MakeFromFileWithSharedDelete(const std::filesystem::path& FileName)
+static IoBuffer
+MakeFromFileWithOptions(const std::filesystem::path& FileName, uint64_t Offset, uint64_t Size, bool UseShareDelete)
{
- uint64_t Size;
+ uint64_t FileSize;
#if ZEN_PLATFORM_WINDOWS
CAtlFile DataFile;
- HRESULT hRes = DataFile.Create(FileName.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE, OPEN_EXISTING);
-
- if (FAILED(hRes))
- {
- return {};
- }
-
- DataFile.GetSize((ULONGLONG&)Size);
-#else
- int Fd = open(FileName.c_str(), O_RDONLY | O_CLOEXEC);
- if (Fd < 0)
+ DWORD ShareOptions = FILE_SHARE_READ;
+ if (UseShareDelete)
{
- return {};
+ ShareOptions |= FILE_SHARE_DELETE;
}
-
- static_assert(sizeof(decltype(stat::st_size)) == sizeof(uint64_t), "fstat() doesn't support large files");
- struct stat Stat;
- fstat(Fd, &Stat);
- Size = Stat.st_size;
-#endif // ZEN_PLATFORM_WINDOWS
-
- if (Size)
- {
-#if ZEN_PLATFORM_WINDOWS
- void* Fd = DataFile.Detach();
-#endif
- return IoBuffer(IoBuffer::File, (void*)uintptr_t(Fd), 0, Size);
- }
-
-#if !ZEN_PLATFORM_WINDOWS
- close(Fd);
-#endif
-
- // For an empty file, we may as well just return an empty memory IoBuffer
- return IoBuffer(IoBuffer::Wrap, "", 0);
-}
-
-IoBuffer
-IoBufferBuilder::MakeFromFile(const std::filesystem::path& FileName, uint64_t Offset, uint64_t Size)
-{
- uint64_t FileSize;
-
-#if ZEN_PLATFORM_WINDOWS
- CAtlFile DataFile;
-
- HRESULT hRes = DataFile.Create(FileName.c_str(), GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING);
+ HRESULT hRes = DataFile.Create(FileName.c_str(), GENERIC_READ, FILE_SHARE_READ | ShareOptions, OPEN_EXISTING);
if (FAILED(hRes))
{
@@ -531,7 +491,12 @@ IoBufferBuilder::MakeFromFile(const std::filesystem::path& FileName, uint64_t Of
DataFile.GetSize((ULONGLONG&)FileSize);
#else
- int Fd = open(FileName.c_str(), O_RDONLY);
+ int Flags = O_RDONLY;
+ if (UseShareDelete)
+ {
+ Flags |= O_CLOEXEC;
+ }
+ int Fd = open(FileName.c_str(), Flags);
if (Fd < 0)
{
return {};
@@ -575,6 +540,18 @@ IoBufferBuilder::MakeFromFile(const std::filesystem::path& FileName, uint64_t Of
}
IoBuffer
+IoBufferBuilder::MakeFromFileWithSharedDelete(const std::filesystem::path& FileName)
+{
+ return MakeFromFileWithOptions(FileName, ~0ull, 0, true);
+}
+
+IoBuffer
+IoBufferBuilder::MakeFromFile(const std::filesystem::path& FileName, uint64_t Offset, uint64_t Size)
+{
+ return MakeFromFileWithOptions(FileName, Offset, Size, false);
+}
+
+IoBuffer
IoBufferBuilder::MakeFromTemporaryFile(const std::filesystem::path& FileName)
{
uint64_t FileSize;