diff options
| author | Dan Engelbrecht <[email protected]> | 2022-05-30 14:00:18 +0200 |
|---|---|---|
| committer | Dan Engelbrecht <[email protected]> | 2022-05-30 14:02:37 +0200 |
| commit | 26fb535175e44d5819b385195971b5696e6d6122 (patch) | |
| tree | 145efe502a7072f150f80954a2991a409cd25c5c /zencore | |
| parent | add comment about removing files (diff) | |
| download | zen-26fb535175e44d5819b385195971b5696e6d6122.tar.xz zen-26fb535175e44d5819b385195971b5696e6d6122.zip | |
create local utility function for IoBufferBuilder::MakeFromFile*
Diffstat (limited to 'zencore')
| -rw-r--r-- | zencore/iobuffer.cpp | 73 |
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; |