This is another "breaking" change. However, whatever enum values are used, it should always be as a comparison operator, and this is an internal value. It would prove unreliable if someone looked for Windows 10+ and looked against apr-1.7.0.dll, but that just means a feature available isn't recognized.
I think this one is safe for the 1.7.0 -> 1.7.1 based on semver, any concerns? On Wed, May 26, 2021 at 2:57 PM <micha...@apache.org> wrote: > > Author: michaelo > Date: Wed May 26 19:57:29 2021 > New Revision: 1890230 > > URL: http://svn.apache.org/viewvc?rev=1890230&view=rev > Log: > Backport r1861050, r1805309, r1861045, r1861046, r1861049, r1861053, > r1861054, r1861061 from trunk: > > * misc/win32/misc.c > (apr_get_oslevel): Fix condition to actually return APR_EGENERAL on > unsupported OS. > > === > > apr_socket_listen(): Allow larger backlog queue lengths on Windows 8+. > > Starting with Windows 8, the socket listen() function accepts a special > SOMAXCONN_HINT(N) argument that allows making the backlog queue > length larger than the otherwise predefined limit of around 200: > > https://msdn.microsoft.com/en-us/library/windows/desktop/ms739168 > > https://blogs.msdn.microsoft.com/winsdk/2015/06/01/winsocks-listen-backlog-offers-more-flexibility-in-windows-8/ > > Having a larger listen backlog can be used for certain high performance > applications that need to handle lots of incoming connections. One > example would be the httpd server with it's "ListenBacklog" directive > where setting it to a larger value currently allows serving more concurrent > connections on Windows with mpm_winnt. > > * include/arch/win32/apr_arch_misc.h > (enum apr_oslevel_e): Add APR_WIN_8. > > * misc/win32/misc.c > (apr_get_oslevel): Determine whether we are running on Windows 7 or > on Windows 8+. > > * network_io/win32/sockets.c > (SOMAXCONN_HINT): Define this macro in case we are building against > an older version of Windows SDK. > (apr_socket_listen): Use SOMAXCONN_HINT() for the backlog queue length > if it's supported by the Windows version we are running on. > > Patch by: Evgeny Kotkov <evgeny.kotkov {at} visualsvn.com> > > === > > * misc/win32/misc.c > (apr_get_oslevel): Check return code from GetVersionEx(). > > === > > * misc/win32/misc.c > (apr_get_oslevel): Do not use static variables to protect from potential > race condition. > > === > > * misc/win32/misc.c > (apr_get_oslevel): Use GetVersionExW() with OSVERSIONINFOEXW to version > information with service pack info. > > === > > * include/arch/win32/apr_arch_misc.h > (enum apr_oslevel_e): Add APR_WIN_8_1. > > * misc/win32/misc.c > (apr_get_oslevel): Determine whether we are running on Windows 8 or > on Windows 8.1+. > > === > > Fix problem that apr_get_oslevel() was returning APR_WIN_XP on Windows 10. > > * include/arch/win32/apr_arch_misc.h > (enum apr_oslevel_e): Add APR_WIN_10. > > * misc/win32/misc.c > (apr_get_oslevel): Return APR_WIN_10 when dwMajorVersion is greater than 6. > > === > > * include/arch/win32/apr_arch_misc.h > (enum apr_oslevel_e): Add APR_WIN_7_SP1. > > * misc/win32/misc.c > (apr_get_oslevel): Determine whether we are running on Windows 7 or on > Windows 7 SP1. > > Modified: > apr/apr/branches/1.7.x/CHANGES > apr/apr/branches/1.7.x/include/arch/win32/apr_arch_misc.h > apr/apr/branches/1.7.x/misc/win32/misc.c > apr/apr/branches/1.7.x/network_io/win32/sockets.c > > Modified: apr/apr/branches/1.7.x/CHANGES > URL: > http://svn.apache.org/viewvc/apr/apr/branches/1.7.x/CHANGES?rev=1890230&r1=1890229&r2=1890230&view=diff > ============================================================================== > --- apr/apr/branches/1.7.x/CHANGES [utf-8] (original) > +++ apr/apr/branches/1.7.x/CHANGES [utf-8] Wed May 26 19:57:29 2021 > @@ -47,6 +47,11 @@ Changes for APR 1.7.1 > events are emitted on pool clear/destroy for proper accounting. > [Brane Čibej] > > + *) apr_socket_listen: Allow larger listen backlog values on Windows 8+. > + [Evgeny Kotkov <evgeny.kotkov visualsvn.com>] > + > + *) Fixed: apr_get_oslevel() was returning APR_WIN_XP on Windows 10 > + > Changes for APR 1.7.0 > > *) apr_dir_read: [Unix] Dropped the preference of the dirread_r() flavor > > Modified: apr/apr/branches/1.7.x/include/arch/win32/apr_arch_misc.h > URL: > http://svn.apache.org/viewvc/apr/apr/branches/1.7.x/include/arch/win32/apr_arch_misc.h?rev=1890230&r1=1890229&r2=1890230&view=diff > ============================================================================== > --- apr/apr/branches/1.7.x/include/arch/win32/apr_arch_misc.h (original) > +++ apr/apr/branches/1.7.x/include/arch/win32/apr_arch_misc.h Wed May 26 > 19:57:29 2021 > @@ -110,7 +110,11 @@ typedef enum { > APR_WIN_XP_SP2 = 62, > APR_WIN_2003 = 70, > APR_WIN_VISTA = 80, > - APR_WIN_7 = 90 > + APR_WIN_7 = 90, > + APR_WIN_7_SP1 = 91, > + APR_WIN_8 = 100, > + APR_WIN_8_1 = 110, > + APR_WIN_10 = 120 > } apr_oslevel_e; > > extern APR_DECLARE_DATA apr_oslevel_e apr_os_level; > > Modified: apr/apr/branches/1.7.x/misc/win32/misc.c > URL: > http://svn.apache.org/viewvc/apr/apr/branches/1.7.x/misc/win32/misc.c?rev=1890230&r1=1890229&r2=1890230&view=diff > ============================================================================== > --- apr/apr/branches/1.7.x/misc/win32/misc.c (original) > +++ apr/apr/branches/1.7.x/misc/win32/misc.c Wed May 26 19:57:29 2021 > @@ -27,25 +27,15 @@ apr_status_t apr_get_oslevel(apr_oslevel > { > if (apr_os_level == APR_WIN_UNK) > { > - static OSVERSIONINFO oslev; > - oslev.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); > - GetVersionEx(&oslev); > + OSVERSIONINFOEXW oslev; > + oslev.dwOSVersionInfoSize = sizeof(oslev); > + if (!GetVersionExW((OSVERSIONINFOW*) &oslev)) { > + return apr_get_os_error(); > + } > > if (oslev.dwPlatformId == VER_PLATFORM_WIN32_NT) > { > - static unsigned int servpack = 0; > - TCHAR *pservpack; > - if ((pservpack = oslev.szCSDVersion)) { > - while (*pservpack && !apr_isdigit(*pservpack)) { > - pservpack++; > - } > - if (*pservpack) > -#ifdef _UNICODE > - servpack = _wtoi(pservpack); > -#else > - servpack = atoi(pservpack); > -#endif > - } > + unsigned int servpack = oslev.wServicePackMajor; > > if (oslev.dwMajorVersion < 3) { > apr_os_level = APR_WIN_UNSUP; > @@ -99,11 +89,19 @@ apr_status_t apr_get_oslevel(apr_oslevel > else if (oslev.dwMajorVersion == 6) { > if (oslev.dwMinorVersion == 0) > apr_os_level = APR_WIN_VISTA; > + else if (oslev.dwMinorVersion == 1) { > + if (servpack < 1) > + apr_os_level = APR_WIN_7; > + else > + apr_os_level = APR_WIN_7_SP1; > + } > + else if (oslev.dwMinorVersion == 2) > + apr_os_level = APR_WIN_8; > else > - apr_os_level = APR_WIN_7; > + apr_os_level = APR_WIN_8_1; > } > else { > - apr_os_level = APR_WIN_XP; > + apr_os_level = APR_WIN_10; > } > } > #ifndef WINNT > @@ -151,7 +149,7 @@ apr_status_t apr_get_oslevel(apr_oslevel > > *level = apr_os_level; > > - if (apr_os_level < APR_WIN_UNSUP) { > + if (apr_os_level <= APR_WIN_UNSUP) { > return APR_EGENERAL; > } > > > Modified: apr/apr/branches/1.7.x/network_io/win32/sockets.c > URL: > http://svn.apache.org/viewvc/apr/apr/branches/1.7.x/network_io/win32/sockets.c?rev=1890230&r1=1890229&r2=1890230&view=diff > ============================================================================== > --- apr/apr/branches/1.7.x/network_io/win32/sockets.c (original) > +++ apr/apr/branches/1.7.x/network_io/win32/sockets.c Wed May 26 19:57:29 2021 > @@ -24,6 +24,13 @@ > #include "apr_arch_inherit.h" > #include "apr_arch_misc.h" > > +/* Borrow the definition of SOMAXCONN_HINT() from Windows SDK 8, > + * in case the SDK we are building against doesn't have it. > + */ > +#ifndef SOMAXCONN_HINT > +#define SOMAXCONN_HINT(b) (-(b)) > +#endif > + > static char generic_inaddr_any[16] = {0}; /* big enough for IPv4 or IPv6 */ > > static apr_status_t socket_cleanup(void *sock) > @@ -223,7 +230,21 @@ APR_DECLARE(apr_status_t) apr_socket_bin > APR_DECLARE(apr_status_t) apr_socket_listen(apr_socket_t *sock, > apr_int32_t backlog) > { > - if (listen(sock->socketdes, backlog) == SOCKET_ERROR) > + int backlog_val; > + > + if (apr_os_level >= APR_WIN_8) { > + /* Starting from Windows 8, listen() accepts a special > SOMAXCONN_HINT() > + * arg that allows setting the listen backlog value to a larger > + * value than the predefined Winsock 2 limit (several hundred). > + * > https://blogs.msdn.microsoft.com/winsdk/2015/06/01/winsocks-listen-backlog-offers-more-flexibility-in-windows-8/ > + */ > + backlog_val = SOMAXCONN_HINT(backlog); > + } > + else { > + backlog_val = backlog; > + } > + > + if (listen(sock->socketdes, backlog_val) == SOCKET_ERROR) > return apr_get_netos_error(); > else > return APR_SUCCESS; > >