File: win-ipv6.patch

package info (click to toggle)
tomcat-native 1.3.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,956 kB
  • sloc: ansic: 12,920; sh: 3,809; java: 2,432; xml: 709; perl: 327; makefile: 46
file content (125 lines) | stat: -rw-r--r-- 4,472 bytes parent folder | download | duplicates (2)
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;