From 6a166635b5c1d12aae5e58a04fbe423cf9995f6f Mon Sep 17 00:00:00 2001 From: Dan Engelbrecht Date: Fri, 25 Mar 2022 12:04:59 +0100 Subject: incremental migration with optional clean of source add more fine-grained access modes for BasicFile --- zenstore/basicfile.cpp | 46 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 7 deletions(-) (limited to 'zenstore/basicfile.cpp') diff --git a/zenstore/basicfile.cpp b/zenstore/basicfile.cpp index fc7282941..44a7fc77f 100644 --- a/zenstore/basicfile.cpp +++ b/zenstore/basicfile.cpp @@ -44,13 +44,33 @@ void BasicFile::Open(const std::filesystem::path& FileName, EMode Mode, std::error_code& Ec) { Ec.clear(); - uint32_t ModeFlags = static_cast(Mode); #if ZEN_PLATFORM_WINDOWS - const DWORD dwCreationDisposition = (ModeFlags & static_cast(kAccessTruncate)) ? CREATE_ALWAYS : OPEN_EXISTING; - DWORD dwDesiredAccess = GENERIC_READ; - dwDesiredAccess |= (ModeFlags & static_cast(kAccessWrite)) ? GENERIC_WRITE : 0; - dwDesiredAccess |= (ModeFlags & static_cast(kAccessDelete)) ? DELETE : 0; + DWORD dwCreationDisposition = 0; + DWORD dwDesiredAccess = 0; + switch (Mode) + { + case EMode::kRead: + dwCreationDisposition |= OPEN_EXISTING; + dwDesiredAccess |= GENERIC_READ; + break; + case EMode::kWrite: + dwCreationDisposition |= OPEN_ALWAYS; + dwDesiredAccess |= (GENERIC_READ | GENERIC_WRITE); + break; + case EMode::kDelete: + dwCreationDisposition |= OPEN_ALWAYS; + dwDesiredAccess |= (GENERIC_READ | GENERIC_WRITE | DELETE); + break; + case EMode::kTruncate: + dwCreationDisposition |= CREATE_ALWAYS; + dwDesiredAccess |= (GENERIC_READ | GENERIC_WRITE); + break; + case EMode::kTruncateDelete: + dwCreationDisposition |= CREATE_ALWAYS; + dwDesiredAccess |= (GENERIC_READ | GENERIC_WRITE | DELETE); + break; + } const DWORD dwShareMode = FILE_SHARE_READ; const DWORD dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL; @@ -72,8 +92,20 @@ BasicFile::Open(const std::filesystem::path& FileName, EMode Mode, std::error_co } #else int OpenFlags = O_CLOEXEC; - OpenFlags |= (ModeFlags & static_cast(kAccessWrite)) ? O_RDWR : 0; - OpenFlags |= (ModeFlags & static_cast(kAccessTruncate)) ? (O_CREAT | O_TRUNC) : 0; + switch (Mode) + { + case EMode::kRead: + OpenFlags |= O_RDONLY; + break; + case EMode::kWrite: + case EMode::kDelete: + OpenFlags |= (O_RDWR | O_CREAT); + break; + case EMode::kTruncate: + case EMode::kTruncateDelete: + OpenFlags |= (O_RDWR | O_CREAT | O_TRUNC); + break; + } int Fd = open(FileName.c_str(), OpenFlags, 0666); if (Fd < 0) -- cgit v1.2.3