From: Francesco Chemolli <5175948+kinkie@users.noreply.github.com> Date: Fri, 28 Mar 2025 19:15:46 +0000 (+0000) Subject: MinGW: Fix aiops_win32.cc (#2030) X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=84bb09abbd37baca3637ba9b8acf46976c41f6ac;p=thirdparty%2Fsquid.git MinGW: Fix aiops_win32.cc (#2030) Fixed missing includes, type mismatches in some local variables, applied some AAA; extracted WIN32_maperror into own header and implementation files using NoMoreGlobals, and used modern c++ data types for it. This change also mirrors changes introduced in aiops.cc by commit 91d1cfb. These changes require further refinement (in both files). Examples of errors fixed: ``` aiops_win32.cc: In function 'void* squidaio_xmalloc(int)': aiops_win32.cc:161:17: error: invalid use of incomplete type 'class Mem::Allocator' aiops_win32.cc: In function 'void squidaio_init()': aiops_win32.cc:278:19: error: comparison of integer expressions of different signedness: 'int' and 'size_t' {aka 'long long unsigned int'} aiops_win32.cc: In function 'void squidaio_do_read(squidaio_request_t*)': aiops_win32.cc:782:9: error: 'WIN32_maperror' was not declared in this scope ``` --- diff --git a/compat/Makefile.am b/compat/Makefile.am index 818d615fa8..dd6c7b59dc 100644 --- a/compat/Makefile.am +++ b/compat/Makefile.am @@ -73,6 +73,8 @@ libcompatsquid_la_SOURCES = \ tempnam.h \ types.h \ valgrind.h \ + win32_maperror.cc \ + win32_maperror.h \ xalloc.cc \ xalloc.h \ xis.h \ diff --git a/compat/mswindows.cc b/compat/mswindows.cc index 3922bbda23..a4c7225da3 100644 --- a/compat/mswindows.cc +++ b/compat/mswindows.cc @@ -183,83 +183,6 @@ getgrnam(char *unused) { return &grp; } -struct errorentry { - unsigned long WIN32_code; - int POSIX_errno; -}; - -static struct errorentry errortable[] = { - {ERROR_INVALID_FUNCTION, EINVAL}, - {ERROR_FILE_NOT_FOUND, ENOENT}, - {ERROR_PATH_NOT_FOUND, ENOENT}, - {ERROR_TOO_MANY_OPEN_FILES, EMFILE}, - {ERROR_ACCESS_DENIED, EACCES}, - {ERROR_INVALID_HANDLE, EBADF}, - {ERROR_ARENA_TRASHED, ENOMEM}, - {ERROR_NOT_ENOUGH_MEMORY, ENOMEM}, - {ERROR_INVALID_BLOCK, ENOMEM}, - {ERROR_BAD_ENVIRONMENT, E2BIG}, - {ERROR_BAD_FORMAT, ENOEXEC}, - {ERROR_INVALID_ACCESS, EINVAL}, - {ERROR_INVALID_DATA, EINVAL}, - {ERROR_INVALID_DRIVE, ENOENT}, - {ERROR_CURRENT_DIRECTORY, EACCES}, - {ERROR_NOT_SAME_DEVICE, EXDEV}, - {ERROR_NO_MORE_FILES, ENOENT}, - {ERROR_LOCK_VIOLATION, EACCES}, - {ERROR_BAD_NETPATH, ENOENT}, - {ERROR_NETWORK_ACCESS_DENIED, EACCES}, - {ERROR_BAD_NET_NAME, ENOENT}, - {ERROR_FILE_EXISTS, EEXIST}, - {ERROR_CANNOT_MAKE, EACCES}, - {ERROR_FAIL_I24, EACCES}, - {ERROR_INVALID_PARAMETER, EINVAL}, - {ERROR_NO_PROC_SLOTS, EAGAIN}, - {ERROR_DRIVE_LOCKED, EACCES}, - {ERROR_BROKEN_PIPE, EPIPE}, - {ERROR_DISK_FULL, ENOSPC}, - {ERROR_INVALID_TARGET_HANDLE, EBADF}, - {ERROR_INVALID_HANDLE, EINVAL}, - {ERROR_WAIT_NO_CHILDREN, ECHILD}, - {ERROR_CHILD_NOT_COMPLETE, ECHILD}, - {ERROR_DIRECT_ACCESS_HANDLE, EBADF}, - {ERROR_NEGATIVE_SEEK, EINVAL}, - {ERROR_SEEK_ON_DEVICE, EACCES}, - {ERROR_DIR_NOT_EMPTY, ENOTEMPTY}, - {ERROR_NOT_LOCKED, EACCES}, - {ERROR_BAD_PATHNAME, ENOENT}, - {ERROR_MAX_THRDS_REACHED, EAGAIN}, - {ERROR_LOCK_FAILED, EACCES}, - {ERROR_ALREADY_EXISTS, EEXIST}, - {ERROR_FILENAME_EXCED_RANGE, ENOENT}, - {ERROR_NESTING_NOT_ALLOWED, EAGAIN}, - {ERROR_NOT_ENOUGH_QUOTA, ENOMEM} -}; - -#define MIN_EXEC_ERROR ERROR_INVALID_STARTING_CODESEG -#define MAX_EXEC_ERROR ERROR_INFLOOP_IN_RELOC_CHAIN - -#define MIN_EACCES_RANGE ERROR_WRITE_PROTECT -#define MAX_EACCES_RANGE ERROR_SHARING_BUFFER_EXCEEDED - -void -WIN32_maperror(unsigned long WIN32_oserrno) -{ - _doserrno = WIN32_oserrno; - for (size_t i = 0; i < (sizeof(errortable) / sizeof(struct errorentry)); ++i) { - if (WIN32_oserrno == errortable[i].WIN32_code) { - errno = errortable[i].POSIX_errno; - return; - } - } - if (WIN32_oserrno >= MIN_EACCES_RANGE && WIN32_oserrno <= MAX_EACCES_RANGE) - errno = EACCES; - else if (WIN32_oserrno >= MIN_EXEC_ERROR && WIN32_oserrno <= MAX_EXEC_ERROR) - errno = ENOEXEC; - else - errno = EINVAL; -} - /* syslog emulation layer derived from git */ static HANDLE ms_eventlog; @@ -322,5 +245,4 @@ syslog(int priority, const char *fmt, ...) } /* note: this is all MSWindows-specific code; all of it should be conditional */ -#endif /* _SQUID_WINDOWS_ */ - +#endif /* _SQUID_WINDOWS_ && !_SQUID_CYGWIN_*/ diff --git a/compat/os/mswindows.h b/compat/os/mswindows.h index 1dd1647cbf..080cc26b5c 100644 --- a/compat/os/mswindows.h +++ b/compat/os/mswindows.h @@ -906,9 +906,6 @@ void openlog(const char *ident, int logopt, int facility); void syslog(int priority, const char *fmt, ...); #endif -/* prototypes */ -void WIN32_maperror(unsigned long WIN32_oserrno); - #endif /* _SQUID_WINDOWS_ */ #endif /* SQUID_COMPAT_OS_MSWINDOWS_H */ diff --git a/compat/win32_maperror.cc b/compat/win32_maperror.cc new file mode 100644 index 0000000000..a0937a1c61 --- /dev/null +++ b/compat/win32_maperror.cc @@ -0,0 +1,89 @@ +/* + * Copyright (C) 1996-2023 The Squid Software Foundation and contributors + * + * Squid software is distributed under GPLv2+ license and includes + * contributions from numerous individuals and organizations. + * Please see the COPYING and CONTRIBUTORS files for details. + */ + +#include "squid.h" +#include "compat/win32_maperror.h" + +#if (_SQUID_WINDOWS_ || _SQUID_MINGW_) && !_SQUID_CYGWIN_ + +#if HAVE_WINDOWS_H +#include +#endif +#include +#include + +void +WIN32_maperror(unsigned long WIN32_oserrno) +{ + static const auto errormap = new std::unordered_map { + {ERROR_INVALID_FUNCTION, EINVAL}, + {ERROR_FILE_NOT_FOUND, ENOENT}, + {ERROR_PATH_NOT_FOUND, ENOENT}, + {ERROR_TOO_MANY_OPEN_FILES, EMFILE}, + {ERROR_ACCESS_DENIED, EACCES}, + {ERROR_INVALID_HANDLE, EBADF}, + {ERROR_ARENA_TRASHED, ENOMEM}, + {ERROR_NOT_ENOUGH_MEMORY, ENOMEM}, + {ERROR_INVALID_BLOCK, ENOMEM}, + {ERROR_BAD_ENVIRONMENT, E2BIG}, + {ERROR_BAD_FORMAT, ENOEXEC}, + {ERROR_INVALID_ACCESS, EINVAL}, + {ERROR_INVALID_DATA, EINVAL}, + {ERROR_INVALID_DRIVE, ENOENT}, + {ERROR_CURRENT_DIRECTORY, EACCES}, + {ERROR_NOT_SAME_DEVICE, EXDEV}, + {ERROR_NO_MORE_FILES, ENOENT}, + {ERROR_LOCK_VIOLATION, EACCES}, + {ERROR_BAD_NETPATH, ENOENT}, + {ERROR_NETWORK_ACCESS_DENIED, EACCES}, + {ERROR_BAD_NET_NAME, ENOENT}, + {ERROR_FILE_EXISTS, EEXIST}, + {ERROR_CANNOT_MAKE, EACCES}, + {ERROR_FAIL_I24, EACCES}, + {ERROR_INVALID_PARAMETER, EINVAL}, + {ERROR_NO_PROC_SLOTS, EAGAIN}, + {ERROR_DRIVE_LOCKED, EACCES}, + {ERROR_BROKEN_PIPE, EPIPE}, + {ERROR_DISK_FULL, ENOSPC}, + {ERROR_INVALID_TARGET_HANDLE, EBADF}, + {ERROR_INVALID_HANDLE, EINVAL}, + {ERROR_WAIT_NO_CHILDREN, ECHILD}, + {ERROR_CHILD_NOT_COMPLETE, ECHILD}, + {ERROR_DIRECT_ACCESS_HANDLE, EBADF}, + {ERROR_NEGATIVE_SEEK, EINVAL}, + {ERROR_SEEK_ON_DEVICE, EACCES}, + {ERROR_DIR_NOT_EMPTY, ENOTEMPTY}, + {ERROR_NOT_LOCKED, EACCES}, + {ERROR_BAD_PATHNAME, ENOENT}, + {ERROR_MAX_THRDS_REACHED, EAGAIN}, + {ERROR_LOCK_FAILED, EACCES}, + {ERROR_ALREADY_EXISTS, EEXIST}, + {ERROR_FILENAME_EXCED_RANGE, ENOENT}, + {ERROR_NESTING_NOT_ALLOWED, EAGAIN}, + {ERROR_NOT_ENOUGH_QUOTA, ENOMEM} + }; + _set_doserrno(WIN32_oserrno); + const auto it = errormap->find(WIN32_oserrno); + if (it != errormap->end()) { + errno = it->second; + return; + } + const auto min_exec_error = ERROR_INVALID_STARTING_CODESEG; + const auto max_exec_error = ERROR_INFLOOP_IN_RELOC_CHAIN; + const auto min_eaccess_range = ERROR_WRITE_PROTECT; + const auto max_eaccess_range = ERROR_SHARING_BUFFER_EXCEEDED; + + if (min_eaccess_range <= WIN32_oserrno && WIN32_oserrno <= max_eaccess_range) + errno = EACCES; + else if (min_exec_error <= WIN32_oserrno && WIN32_oserrno <= max_exec_error) + errno = ENOEXEC; + else + errno = EINVAL; +} + +#endif /* (_SQUID_WINDOWS_ || _SQUID_MINGW_) && !_SQUID_CYGWIN_ */ diff --git a/compat/win32_maperror.h b/compat/win32_maperror.h new file mode 100644 index 0000000000..d97b0c1e6c --- /dev/null +++ b/compat/win32_maperror.h @@ -0,0 +1,20 @@ +/* + * Copyright (C) 1996-2023 The Squid Software Foundation and contributors + * + * Squid software is distributed under GPLv2+ license and includes + * contributions from numerous individuals and organizations. + * Please see the COPYING and CONTRIBUTORS files for details. + */ + +#ifndef SQUID_COMPAT_WIN32_MAPERROR_H +#define SQUID_COMPAT_WIN32_MAPERROR_H + +#if (_SQUID_WINDOWS_ || _SQUID_MINGW_) && !_SQUID_CYGWIN_ + +/// maps a Windows system error code to a POSIX errno value +/// sets errno and _doserrno as side effects +void WIN32_maperror(unsigned long WIN32_oserrno); + +#endif /* (_SQUID_WINDOWS_ || _SQUID_MINGW_) && !_SQUID_CYGWIN_ */ + +#endif /* SQUID_COMPAT_WIN32_MAPERROR_H */ diff --git a/src/DiskIO/DiskThreads/aiops_win32.cc b/src/DiskIO/DiskThreads/aiops_win32.cc index 85c36537de..45600700c2 100644 --- a/src/DiskIO/DiskThreads/aiops_win32.cc +++ b/src/DiskIO/DiskThreads/aiops_win32.cc @@ -9,9 +9,11 @@ /* DEBUG: section 43 Windows AIOPS */ #include "squid.h" +#include "compat/win32_maperror.h" #include "DiskIO/DiskThreads/CommIO.h" #include "DiskThreads.h" #include "fd.h" +#include "mem/Allocator.h" #include "mem/Pool.h" #include "SquidConfig.h" #include "Store.h" @@ -108,7 +110,7 @@ static Mem::Allocator *squidaio_small_bufs = nullptr; /* 4K */ static Mem::Allocator *squidaio_tiny_bufs = nullptr; /* 2K */ static Mem::Allocator *squidaio_micro_bufs = nullptr; /* 128K */ -static int request_queue_len = 0; +static size_t request_queue_len = 0; static Mem::Allocator *squidaio_request_pool = nullptr; static Mem::Allocator *squidaio_thread_pool = nullptr; static squidaio_request_queue_t request_queue; @@ -200,7 +202,6 @@ squidaio_xstrfree(char *str) void squidaio_init(void) { - int i; squidaio_thread_t *threadp; if (squidaio_initialised) @@ -275,7 +276,7 @@ squidaio_init(void) assert(NUMTHREADS > 0); - for (i = 0; i < NUMTHREADS; ++i) { + for (size_t i = 0; i < NUMTHREADS; ++i) { threadp = (squidaio_thread_t *)squidaio_thread_pool->alloc(); threadp->status = _THREAD_STARTING; threadp->current_req = nullptr; @@ -319,7 +320,6 @@ void squidaio_shutdown(void) { squidaio_thread_t *threadp; - int i; HANDLE * hthreads; if (!squidaio_initialised) @@ -334,7 +334,7 @@ squidaio_shutdown(void) threadp = threads; - for (i = 0; i < NUMTHREADS; ++i) { + for (size_t i = 0; i < NUMTHREADS; ++i) { threadp->exit = 1; hthreads[i] = threadp->thread; threadp = threadp->next; @@ -348,7 +348,7 @@ squidaio_shutdown(void) WaitForMultipleObjects(NUMTHREADS, hthreads, TRUE, 2000); - for (i = 0; i < NUMTHREADS; ++i) { + for (size_t i = 0; i < NUMTHREADS; ++i) { CloseHandle(hthreads[i]); } @@ -589,7 +589,7 @@ squidaio_queue_request(squidaio_request_t * request) /* Warn if out of threads */ if (request_queue_len > MAGIC1) { static int last_warn = 0; - static int queue_high, queue_low; + static size_t queue_high, queue_low; if (high_start == 0) { high_start = (int)squid_curtime; @@ -1099,7 +1099,6 @@ void squidaio_stats(StoreEntry * sentry) { squidaio_thread_t *threadp; - int i; if (!squidaio_initialised) return; @@ -1110,8 +1109,8 @@ squidaio_stats(StoreEntry * sentry) threadp = threads; - for (i = 0; i < NUMTHREADS; ++i) { - storeAppendPrintf(sentry, "%i\t0x%lx\t%ld\n", i + 1, threadp->dwThreadId, threadp->requests); + for (size_t i = 0; i < NUMTHREADS; ++i) { + storeAppendPrintf(sentry, "%zu\t0x%lx\t%ld\n", i + 1, threadp->dwThreadId, threadp->requests); threadp = threadp->next; } }