diff options
Diffstat (limited to 'zencore/iobuffer.cpp')
| -rw-r--r-- | zencore/iobuffer.cpp | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/zencore/iobuffer.cpp b/zencore/iobuffer.cpp index c4b7f7bdf..56b05d86d 100644 --- a/zencore/iobuffer.cpp +++ b/zencore/iobuffer.cpp @@ -469,15 +469,20 @@ IoBufferBuilder::MakeFromFileHandle(void* FileHandle, uint64_t Offset, uint64_t return IoBuffer(IoBuffer::BorrowedFile, FileHandle, Offset, Size); } -IoBuffer -IoBufferBuilder::MakeFromFile(const std::filesystem::path& FileName, uint64_t Offset, uint64_t Size) +static IoBuffer +MakeFromFileWithOptions(const std::filesystem::path& FileName, uint64_t Offset, uint64_t Size, bool UseShareDelete) { uint64_t FileSize; #if ZEN_PLATFORM_WINDOWS CAtlFile DataFile; - HRESULT hRes = DataFile.Create(FileName.c_str(), GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING); + DWORD ShareOptions = FILE_SHARE_READ; + if (UseShareDelete) + { + ShareOptions |= FILE_SHARE_DELETE; + } + HRESULT hRes = DataFile.Create(FileName.c_str(), GENERIC_READ, FILE_SHARE_READ | ShareOptions, OPEN_EXISTING); if (FAILED(hRes)) { @@ -486,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 {}; @@ -530,6 +540,18 @@ IoBufferBuilder::MakeFromFile(const std::filesystem::path& FileName, uint64_t Of } IoBuffer +IoBufferBuilder::MakeFromFileWithSharedDelete(const std::filesystem::path& FileName) +{ + return MakeFromFileWithOptions(FileName, 0, ~0ull, 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; |