From bb07e58a9c59705b54164b06bcbe40c052880d90 Mon Sep 17 00:00:00 2001 From: Dan Engelbrecht Date: Mon, 7 Nov 2022 10:18:44 +0100 Subject: Support file reference in package message (#184) * Fix packed message parsing for absolute path * Always enable are sharing when opening files as IoBuffers. * Allow control over sending partial files as localfile ref * Check "AcceptFlags" field in RPC message for allowing localfile ref in reply * make oplog entry add operations ZEN_DEBUG level logs * changelog --- zencore/include/zencore/iobuffer.h | 1 - zencore/iobuffer.cpp | 36 +++++++++--------------------------- 2 files changed, 9 insertions(+), 28 deletions(-) (limited to 'zencore') diff --git a/zencore/include/zencore/iobuffer.h b/zencore/include/zencore/iobuffer.h index b38201ba3..7f107cc0f 100644 --- a/zencore/include/zencore/iobuffer.h +++ b/zencore/include/zencore/iobuffer.h @@ -409,7 +409,6 @@ class IoBufferBuilder { public: ZENCORE_API static IoBuffer MakeFromFile(const std::filesystem::path& FileName, uint64_t Offset = 0, uint64_t Size = ~0ull); - ZENCORE_API static IoBuffer MakeFromFileWithSharedDelete(const std::filesystem::path& FileName); ZENCORE_API static IoBuffer MakeFromTemporaryFile(const std::filesystem::path& FileName); ZENCORE_API static IoBuffer MakeFromFileHandle(void* FileHandle, uint64_t Offset = 0, uint64_t Size = ~0ull); ZENCORE_API static IoBuffer ReadFromFileMaybe(IoBuffer& InBuffer); diff --git a/zencore/iobuffer.cpp b/zencore/iobuffer.cpp index 177b7dfb6..16dd22a58 100644 --- a/zencore/iobuffer.cpp +++ b/zencore/iobuffer.cpp @@ -480,20 +480,16 @@ IoBufferBuilder::MakeFromFileHandle(void* FileHandle, uint64_t Offset, uint64_t return IoBuffer(IoBuffer::BorrowedFile, FileHandle, Offset, Size); } -static IoBuffer -MakeFromFileWithOptions(const std::filesystem::path& FileName, uint64_t Offset, uint64_t Size, bool UseShareDelete) +IoBuffer +IoBufferBuilder::MakeFromFile(const std::filesystem::path& FileName, uint64_t Offset, uint64_t Size) { uint64_t FileSize; #if ZEN_PLATFORM_WINDOWS CAtlFile DataFile; - 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); + DWORD ShareOptions = FILE_SHARE_DELETE | FILE_SHARE_WRITE | FILE_SHARE_DELETE | FILE_SHARE_READ; + HRESULT hRes = DataFile.Create(FileName.c_str(), GENERIC_READ, ShareOptions, OPEN_EXISTING); if (FAILED(hRes)) { @@ -502,12 +498,8 @@ MakeFromFileWithOptions(const std::filesystem::path& FileName, uint64_t Offset, DataFile.GetSize((ULONGLONG&)FileSize); #else - int Flags = O_RDONLY; - if (UseShareDelete) - { - Flags |= O_CLOEXEC; - } - int Fd = open(FileName.c_str(), Flags); + int Flags = O_RDONLY | O_CLOEXEC; + int Fd = open(FileName.c_str(), Flags); if (Fd < 0) { return {}; @@ -539,7 +531,9 @@ MakeFromFileWithOptions(const std::filesystem::path& FileName, uint64_t Offset, #if ZEN_PLATFORM_WINDOWS void* Fd = DataFile.Detach(); #endif - return IoBuffer(IoBuffer::File, (void*)uintptr_t(Fd), Offset, Size); + IoBuffer Iob(IoBuffer::File, (void*)uintptr_t(Fd), Offset, Size); + Iob.m_Core->SetIsWholeFile(Offset == 0 && Size == FileSize); + return Iob; } #if !ZEN_PLATFORM_WINDOWS @@ -550,18 +544,6 @@ MakeFromFileWithOptions(const std::filesystem::path& FileName, uint64_t Offset, return IoBuffer(IoBuffer::Wrap, "", 0); } -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) { -- cgit v1.2.3