]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
MinGW-w64: enable native file locking (#1358)
authorAmos Jeffries <yadij@users.noreply.github.com>
Tue, 13 Feb 2024 20:26:47 +0000 (20:26 +0000)
committerSquid Anubis <squid-anubis@squid-cache.org>
Wed, 14 Feb 2024 01:30:17 +0000 (01:30 +0000)
flock() and related API symbols are not defined by MinGW.

src/base/File.cc
src/base/File.h
src/tools.cc
src/tools.h

index 11a66c711eca048e9220d2751dd7bdb87cbb4301..8c1bfbf0e599b5272345d69098a426d29a589a08 100644 (file)
@@ -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_*/
 
index fddcf911d833bc9e59ee51dc91b85bac3192ab42..c7b6169bed130dc8347420eb9dadb1793ff09fcd 100644 (file)
@@ -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
index 5c11ddb320d26a59c970f358b919118eb086a85a..2c1e340c6b8663e36eabaadacbf2a9ef4dd3a63f 100644 (file)
@@ -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_
 
index ae76af1a22d3103786a72af851134044dd7a4852..f3c808a6ee0ca85d4dc09bfd805eb91f48de7f9e 100644 (file)
@@ -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 */