1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
Index: apr/apr/branches/1.7.x/include/arch/win32/apr_arch_misc.h
===================================================================
--- apr/apr/branches/1.7.x/include/arch/win32/apr_arch_misc.h (revision 1890229)
+++ apr/apr/branches/1.7.x/include/arch/win32/apr_arch_misc.h (revision 1890230)
@@ -110,7 +110,11 @@
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;
Index: apr/apr/branches/1.7.x/misc/win32/misc.c
===================================================================
--- apr/apr/branches/1.7.x/misc/win32/misc.c (revision 1890229)
+++ apr/apr/branches/1.7.x/misc/win32/misc.c (revision 1890230)
@@ -27,25 +27,15 @@
{
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 @@
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 @@
*level = apr_os_level;
- if (apr_os_level < APR_WIN_UNSUP) {
+ if (apr_os_level <= APR_WIN_UNSUP) {
return APR_EGENERAL;
}
Index: apr/apr/branches/1.7.x/network_io/win32/sockets.c
===================================================================
--- apr/apr/branches/1.7.x/network_io/win32/sockets.c (revision 1890229)
+++ apr/apr/branches/1.7.x/network_io/win32/sockets.c (revision 1890230)
@@ -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_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;
|