aboutsummaryrefslogtreecommitdiff
path: root/src/zenutil
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2023-10-25 12:18:14 +0200
committerGitHub <[email protected]>2023-10-25 12:18:14 +0200
commita8667478c57eaed7bfceccdbdd62da04eeca6445 (patch)
tree04928d2effef67caa44b3b44320e610e524ef29f /src/zenutil
parentremoved HttpCidStore (#497) (diff)
downloadzen-a8667478c57eaed7bfceccdbdd62da04eeca6445.tar.xz
zen-a8667478c57eaed7bfceccdbdd62da04eeca6445.zip
New rotating file logger that keeps on running regardless of errors (#495)
* New rotating file logger that keeps on running regardless of errors
Diffstat (limited to 'src/zenutil')
-rw-r--r--src/zenutil/basicfile.cpp34
-rw-r--r--src/zenutil/include/zenutil/basicfile.h2
2 files changed, 35 insertions, 1 deletions
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
}
diff --git a/src/zenutil/include/zenutil/basicfile.h b/src/zenutil/include/zenutil/basicfile.h
index eb97c885c..7797258e8 100644
--- a/src/zenutil/include/zenutil/basicfile.h
+++ b/src/zenutil/include/zenutil/basicfile.h
@@ -62,12 +62,14 @@ public:
void Write(const void* Data, uint64_t Size, uint64_t FileOffset, std::error_code& Ec);
void Flush();
[[nodiscard]] uint64_t FileSize();
+ [[nodiscard]] uint64_t FileSize(std::error_code& Ec);
void SetFileSize(uint64_t FileSize);
IoBuffer ReadAll();
void WriteAll(IoBuffer Data, std::error_code& Ec);
void* Detach();
inline void* Handle() { return m_FileHandle; }
+ bool IsOpen() const { return m_FileHandle != nullptr; }
protected:
void* m_FileHandle = nullptr; // This is either null or valid