From a8667478c57eaed7bfceccdbdd62da04eeca6445 Mon Sep 17 00:00:00 2001 From: Dan Engelbrecht Date: Wed, 25 Oct 2023 12:18:14 +0200 Subject: New rotating file logger that keeps on running regardless of errors (#495) * New rotating file logger that keeps on running regardless of errors --- src/zenutil/basicfile.cpp | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) (limited to 'src/zenutil/basicfile.cpp') diff --git a/src/zenutil/basicfile.cpp b/src/zenutil/basicfile.cpp index 259d622c4..1dce71e60 100644 --- a/src/zenutil/basicfile.cpp +++ b/src/zenutil/basicfile.cpp @@ -365,7 +365,39 @@ BasicFile::FileSize() int Fd = int(uintptr_t(m_FileHandle)); static_assert(sizeof(decltype(stat::st_size)) == sizeof(uint64_t), "fstat() doesn't support large files"); struct stat Stat; - fstat(Fd, &Stat); + if (fstat(Fd, &Stat) == -1) + { + ThrowSystemError(GetLastError(), fmt::format("Failed to get file size from file '{}'", PathFromHandle(m_FileHandle))); + } + return uint64_t(Stat.st_size); +#endif +} + +uint64_t +BasicFile::FileSize(std::error_code& Ec) +{ +#if ZEN_PLATFORM_WINDOWS + ULARGE_INTEGER liFileSize; + liFileSize.LowPart = ::GetFileSize(m_FileHandle, &liFileSize.HighPart); + if (liFileSize.LowPart == INVALID_FILE_SIZE) + { + int Error = zen::GetLastError(); + if (Error) + { + Ec = MakeErrorCode(Error); + return 0; + } + } + return uint64_t(liFileSize.QuadPart); +#else + int Fd = int(uintptr_t(m_FileHandle)); + static_assert(sizeof(decltype(stat::st_size)) == sizeof(uint64_t), "fstat() doesn't support large files"); + struct stat Stat; + if (fstat(Fd, &Stat) == -1) + { + Ec = MakeErrorCodeFromLastError(); + return 0; + } return uint64_t(Stat.st_size); #endif } -- cgit v1.2.3