From d9cb4f7ae7b1f792b87dc3981fdd27cc250b90d8 Mon Sep 17 00:00:00 2001 From: Amos Jeffries Date: Tue, 13 Feb 2024 20:26:47 +0000 Subject: [PATCH] MinGW-w64: enable native file locking (#1358) flock() and related API symbols are not defined by MinGW. --- src/base/File.cc | 28 ++++++++++++++-------------- src/base/File.h | 8 ++++---- src/tools.cc | 4 ++-- src/tools.h | 4 ++-- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/base/File.cc b/src/base/File.cc index 11a66c711e..8c1bfbf0e5 100644 --- a/src/base/File.cc +++ b/src/base/File.cc @@ -34,7 +34,7 @@ FileOpeningConfig::ReadOnly() FileOpeningConfig cfg; /* I/O */ -#if _SQUID_WINDOWS_ +#if _SQUID_WINDOWS_ || _SQUID_MINGW_ cfg.desiredAccess = GENERIC_READ; cfg.shareMode = FILE_SHARE_READ; #else @@ -42,7 +42,7 @@ FileOpeningConfig::ReadOnly() #endif /* locking (if enabled later) */ -#if _SQUID_WINDOWS_ +#if _SQUID_WINDOWS_ || _SQUID_MINGW_ cfg.lockFlags = 0; // no named constant for a shared lock #elif _SQUID_SOLARIS_ cfg.lockType = F_RDLCK; @@ -59,7 +59,7 @@ FileOpeningConfig::ReadWrite() FileOpeningConfig cfg; /* I/O */ -#if _SQUID_WINDOWS_ +#if _SQUID_WINDOWS_ || _SQUID_MINGW_ cfg.desiredAccess = GENERIC_READ | GENERIC_WRITE; cfg.shareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; #else @@ -67,7 +67,7 @@ FileOpeningConfig::ReadWrite() #endif /* locking (if enabled later) */ -#if _SQUID_WINDOWS_ +#if _SQUID_WINDOWS_ || _SQUID_MINGW_ cfg.lockFlags = LOCKFILE_EXCLUSIVE_LOCK; #elif _SQUID_SOLARIS_ cfg.lockType = F_WRLCK; @@ -89,7 +89,7 @@ FileOpeningConfig::locked(unsigned int attempts) FileOpeningConfig & FileOpeningConfig::createdIfMissing() { -#if _SQUID_WINDOWS_ +#if _SQUID_WINDOWS_ || _SQUID_MINGW_ Must((desiredAccess & GENERIC_WRITE) == GENERIC_WRITE); creationDisposition = OPEN_ALWAYS; #else @@ -170,7 +170,7 @@ File::operator = (File &&other) void File::open(const FileOpeningConfig &cfg) { -#if _SQUID_WINDOWS_ +#if _SQUID_WINDOWS_ || _SQUID_MINGW_ fd_ = CreateFile(TEXT(name_.c_str()), cfg.desiredAccess, cfg.shareMode, nullptr, cfg.creationDisposition, FILE_ATTRIBUTE_NORMAL, nullptr); if (fd_ == InvalidHandle) { const auto savedError = GetLastError(); @@ -197,7 +197,7 @@ File::close() { if (!isOpen()) return; -#if _SQUID_WINDOWS_ +#if _SQUID_WINDOWS_ || _SQUID_MINGW_ if (!CloseHandle(fd_)) { const auto savedError = GetLastError(); debugs(54, DBG_IMPORTANT, sysCallFailure("CloseHandle", WindowsErrorMessage(savedError))); @@ -214,7 +214,7 @@ File::close() void File::truncate() { -#if _SQUID_WINDOWS_ +#if _SQUID_WINDOWS_ || _SQUID_MINGW_ if (!SetFilePointer(fd_, 0, nullptr, FILE_BEGIN)) { const auto savedError = GetLastError(); throw TexcHere(sysCallFailure("SetFilePointer", WindowsErrorMessage(savedError))); @@ -243,7 +243,7 @@ File::readSmall(const SBuf::size_type minBytes, const SBuf::size_type maxBytes) SBuf buf; const auto readLimit = maxBytes + 1; // to detect excessively large files that we do not handle char *rawBuf = buf.rawAppendStart(readLimit); -#if _SQUID_WINDOWS_ +#if _SQUID_WINDOWS_ || _SQUID_MINGW_ DWORD result = 0; if (!ReadFile(fd_, rawBuf, readLimit, &result, nullptr)) { const auto savedError = GetLastError(); @@ -279,7 +279,7 @@ File::readSmall(const SBuf::size_type minBytes, const SBuf::size_type maxBytes) void File::writeAll(const SBuf &data) { -#if _SQUID_WINDOWS_ +#if _SQUID_WINDOWS_ || _SQUID_MINGW_ DWORD nBytesWritten = 0; if (!WriteFile(fd_, data.rawContent(), data.length(), &nBytesWritten, nullptr)) { const auto savedError = GetLastError(); @@ -303,7 +303,7 @@ File::writeAll(const SBuf &data) void File::synchronize() { -#if _SQUID_WINDOWS_ +#if _SQUID_WINDOWS_ || _SQUID_MINGW_ if (!FlushFileBuffers(fd_)) { const auto savedError = GetLastError(); throw TexcHere(sysCallFailure("FlushFileBuffers", WindowsErrorMessage(savedError))); @@ -341,7 +341,7 @@ File::lock(const FileOpeningConfig &cfg) void File::lockOnce(const FileOpeningConfig &cfg) { -#if _SQUID_WINDOWS_ +#if _SQUID_WINDOWS_ || _SQUID_MINGW_ if (!LockFileEx(fd_, cfg.lockFlags, 0, 0, 1, 0)) { const auto savedError = GetLastError(); throw TexcHere(sysCallFailure("LockFileEx", WindowsErrorMessage(savedError))); @@ -374,7 +374,7 @@ File::sysCallError(const char *callName, const int savedErrno) const return sysCallFailure(callName, SBuf(xstrerr(savedErrno))); } -#if _SQUID_WINDOWS_ +#if _SQUID_WINDOWS_ || _SQUID_MINGW_ const HANDLE File::InvalidHandle = INVALID_HANDLE_VALUE; -#endif /* _SQUID_WINDOWS_ */ +#endif /* _SQUID_WINDOWS_ || _SQUID_MINGW_*/ diff --git a/src/base/File.h b/src/base/File.h index fddcf911d8..c7b6169bed 100644 --- a/src/base/File.h +++ b/src/base/File.h @@ -39,7 +39,7 @@ private: friend class File; /* file opening parameters */ -#if _SQUID_WINDOWS_ +#if _SQUID_WINDOWS_ || _SQUID_MINGW_ DWORD desiredAccess = 0; ///< 2nd CreateFile() parameter DWORD shareMode = 0; ///< 3rd CreateFile() parameter DWORD creationDisposition = OPEN_EXISTING; ///< 5th CreateFile() parameter @@ -50,7 +50,7 @@ private: #endif /* file locking (disabled unless lock(n) sets positive lockAttempts) */ -#if _SQUID_WINDOWS_ +#if _SQUID_WINDOWS_ || _SQUID_MINGW_ DWORD lockFlags = 0; ///< 2nd LockFileEx() parameter #elif _SQUID_SOLARIS_ int lockType = F_UNLCK; ///< flock::type member for fcntl(F_SETLK) @@ -92,7 +92,7 @@ public: protected: bool isOpen() const { -#if _SQUID_WINDOWS_ +#if _SQUID_WINDOWS_ || _SQUID_MINGW_ return fd_ != InvalidHandle; #else return fd_ >= 0; @@ -113,7 +113,7 @@ private: SBuf name_; ///< location on disk // Windows-specific HANDLE is needed because LockFileEx() does not take POSIX FDs. -#if _SQUID_WINDOWS_ +#if _SQUID_WINDOWS_ || _SQUID_MINGW_ typedef HANDLE Handle; static const Handle InvalidHandle; #else diff --git a/src/tools.cc b/src/tools.cc index 5c11ddb320..2c1e340c6b 100644 --- a/src/tools.cc +++ b/src/tools.cc @@ -1186,7 +1186,7 @@ WaitForOnePid(pid_t pid, PidStatus &status, int flags) #endif } -#if _SQUID_WINDOWS_ +#if _SQUID_WINDOWS_ || _SQUID_MINGW_ SBuf WindowsErrorMessage(DWORD errorId) { @@ -1209,5 +1209,5 @@ WindowsErrorMessage(DWORD errorId) LocalFree(rawMessage); return result; } -#endif // _SQUID_WINDOWS_ +#endif // _SQUID_WINDOWS_ || _SQUID_MINGW_ diff --git a/src/tools.h b/src/tools.h index ae76af1a22..f3c808a6ee 100644 --- a/src/tools.h +++ b/src/tools.h @@ -109,10 +109,10 @@ inline pid_t WaitForAnyPid(PidStatus &status, int flags) return WaitForOnePid(-1, status, flags); } -#if _SQUID_WINDOWS_ +#if _SQUID_WINDOWS_ || _SQUID_MINGW_ /// xstrerror(errno) equivalent for Windows errors returned by GetLastError() SBuf WindowsErrorMessage(DWORD errorId); -#endif // _SQUID_WINDOWS_ +#endif // _SQUID_WINDOWS_ || _SQUID_MINGW_ #endif /* SQUID_SRC_TOOLS_H */ -- 2.47.2