You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Allan <ak...@meepzor.com> on 2004/02/26 16:46:22 UTC
[PATCH] Windows IPv6
Here's a patch to enable IPv6 on Windows XP & 2003.
In addition we'll need to change the setting of
APR_HAVE_IPV6 in apr.hw - seems like we'll need
some awk magic to do that.
Note that enabling IPv6 drags in the need for
the XP or 2003 platform SDK but I don't see
any way around it. I believe the platform SDK can
be freely downloaded from MS for those who want to
do an IPv6 build.
Any comments before I commit to 2.1?
Allan
Index: server/mpm/winnt/child.c
===================================================================
RCS file: /home/cvs/httpd-2.0/server/mpm/winnt/child.c,v
retrieving revision 1.26
diff -u -d -b -r1.26 child.c
--- server/mpm/winnt/child.c 9 Feb 2004 20:40:51 -0000 1.26
+++ server/mpm/winnt/child.c 25 Feb 2004 16:20:51 -0000
@@ -314,13 +314,17 @@
int wait_time = 1;
int csd;
SOCKET nsd = INVALID_SOCKET;
- struct sockaddr_in sa_client;
int count_select_errors = 0;
int rc;
int clen;
ap_listen_rec *lr;
struct fd_set listenfds;
SOCKET listenmaxfd = INVALID_SOCKET;
+#if APR_HAVE_IPV6
+ struct sockaddr_in6 sa_client;
+#else
+ struct sockaddr_in sa_client;
+#endif
/* Setup the listeners
* ToDo: Use apr_poll()
@@ -395,7 +399,13 @@
static PCOMP_CONTEXT win9x_get_connection(PCOMP_CONTEXT context)
{
apr_os_sock_info_t sockinfo;
- int len;
+ int len, salen;
+#if APR_HAVE_IPV6
+ salen = sizeof(struct sockaddr_in6);
+#else
+ salen = sizeof(struct sockaddr_in);
+#endif
+
if (context == NULL) {
/* allocate the completion context and the transaction pool */
@@ -415,7 +425,7 @@
if (context->accept_socket == INVALID_SOCKET) {
return NULL;
}
- len = sizeof(struct sockaddr);
+ len = salen;
context->sa_server = apr_palloc(context->ptrans, len);
if (getsockname(context->accept_socket,
context->sa_server, &len)== SOCKET_ERROR) {
@@ -423,7 +433,7 @@
"getsockname failed");
continue;
}
- len = sizeof(struct sockaddr);
+ len = salen;
context->sa_client = apr_palloc(context->ptrans, len);
if ((getpeername(context->accept_socket,
context->sa_client, &len)) == SOCKET_ERROR) {
@@ -434,7 +444,7 @@
sockinfo.os_sock = &context->accept_socket;
sockinfo.local = context->sa_server;
sockinfo.remote = context->sa_client;
- sockinfo.family = APR_INET;
+ sockinfo.family = context->sa_server->sa_family;
sockinfo.type = SOCK_STREAM;
apr_os_sock_make(&context->sock, &sockinfo, context->ptrans);
@@ -465,9 +475,21 @@
DWORD BytesRead;
SOCKET nlsd;
int rv, err_count = 0;
+#if APR_HAVE_IPV6
+ SOCKADDR_STORAGE ss_listen;
+ int namelen = sizeof(ss_listen);
+#endif
apr_os_sock_get(&nlsd, lr->sd);
+#if APR_HAVE_IPV6
+ if (getsockname(nlsd, (struct sockaddr *)&ss_listen, &namelen) == SOCKET_ERROR) {
+ ap_log_error(APLOG_MARK,APLOG_ERR, apr_get_netos_error(), ap_server_conf,
+ "winnt_accept: getsockname error on listening socket, is IPv6 available?");
+ return;
+ }
+#endif
+
while (!shutdown_in_progress) {
if (!context) {
context = mpm_get_completion_context();
@@ -479,6 +501,25 @@
}
/* Create and initialize the accept socket */
+#if APR_HAVE_IPV6
+ if (context->accept_socket == INVALID_SOCKET) {
+ context->accept_socket = socket(ss_listen.ss_family, SOCK_STREAM, IPPROTO_TCP);
+ context->socket_family = ss_listen.ss_family;
+ }
+ else if (context->socket_family != ss_listen.ss_family) {
+ closesocket(context->accept_socket);
+ context->accept_socket = socket(ss_listen.ss_family, SOCK_STREAM, IPPROTO_TCP);
+ context->socket_family = ss_listen.ss_family;
+ }
+
+ if (context->accept_socket == INVALID_SOCKET) {
+ ap_log_error(APLOG_MARK,APLOG_WARNING, apr_get_netos_error(), ap_server_conf,
+ "winnt_accept: Failed to allocate an accept socket. "
+ "Temporary resource constraint? Try again.");
+ Sleep(100);
+ continue;
+ }
+#else
if (context->accept_socket == INVALID_SOCKET) {
context->accept_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (context->accept_socket == INVALID_SOCKET) {
@@ -490,7 +531,7 @@
continue;
}
}
-
+#endif
/* AcceptEx on the completion context. The completion context will be
* signaled when a connection is accepted.
*/
@@ -607,7 +648,7 @@
sockinfo.os_sock = &context->accept_socket;
sockinfo.local = context->sa_server;
sockinfo.remote = context->sa_client;
- sockinfo.family = APR_INET;
+ sockinfo.family = context->sa_server->sa_family;
sockinfo.type = SOCK_STREAM;
apr_os_sock_make(&context->sock, &sockinfo, context->ptrans);
Index: server/mpm/winnt/mpm_winnt.h
===================================================================
RCS file: /home/cvs/httpd-2.0/server/mpm/winnt/mpm_winnt.h,v
retrieving revision 1.48
diff -u -d -b -r1.48 mpm_winnt.h
--- server/mpm/winnt/mpm_winnt.h 9 Feb 2004 20:40:51 -0000 1.48
+++ server/mpm/winnt/mpm_winnt.h 25 Feb 2004 16:20:51 -0000
@@ -85,7 +85,12 @@
#define CONTAINING_RECORD(address, type, field) ((type *)( \
(PCHAR)(address) - \
(PCHAR)(&((type *)0)->field)))
+#if APR_HAVE_IPV6
+#define PADDED_ADDR_SIZE sizeof(SOCKADDR_IN6)+16
+#else
#define PADDED_ADDR_SIZE sizeof(SOCKADDR_IN)+16
+#endif
+
typedef struct CompContext {
struct CompContext *next;
OVERLAPPED Overlapped;
@@ -98,6 +103,7 @@
int sa_client_len;
apr_pool_t *ptrans;
apr_bucket_alloc_t *ba;
+ short socket_family;
} COMP_CONTEXT, *PCOMP_CONTEXT;
typedef enum {
Index: srclib/apr/include/apr.hw
===================================================================
RCS file: /home/cvs/apr/include/apr.hw,v
retrieving revision 1.121
diff -u -d -b -r1.121 apr.hw
--- srclib/apr/include/apr.hw 21 Nov 2003 10:42:03 -0000 1.121
+++ srclib/apr/include/apr.hw 25 Feb 2004 16:20:51 -0000
@@ -87,11 +87,12 @@
* C4075: slight indirection changes (unsigned short* vs short[])
* C4100: unreferenced formal parameter
* C4127: conditional expression is constant
+ * C4163: '_rotl64' : not available as an intrinsic function
* C4201: nonstandard extension nameless struct/unions
* C4244: int to char/short - precision loss
* C4514: unreferenced inline function removed
*/
-#pragma warning(disable: 4100 4127 4201 4514; once: 4057 4075 4244)
+#pragma warning(disable: 4100 4127 4163 4201 4514; once: 4057 4075 4244)
/* Has windows.h already been included? If so, our preferences don't matter,
* but we will still need the winsock things no matter what was included.
Re: [PATCH] Windows IPv6
Posted by Allan Edwards <ak...@us.ibm.com>.
William A. Rowe, Jr. wrote:
> +1, but which warning does 4163 quiet?
It quiets "C4163: '_rotl64' : not available as an intrinsic
function'" (see below) that gets generated as a result of
including the platform SDK. Picking up the platform SDK also
results in a couple of other warnings but this was the
major offendor.
Allan
>
> At 09:46 AM 2/26/2004, you wrote:
>
>>Here's a patch to enable IPv6 on Windows XP & 2003.
>>In addition we'll need to change the setting of
>>APR_HAVE_IPV6 in apr.hw - seems like we'll need
>>some awk magic to do that.
>>
>>Note that enabling IPv6 drags in the need for
>>the XP or 2003 platform SDK but I don't see
>>any way around it. I believe the platform SDK can
>>be freely downloaded from MS for those who want to
>>do an IPv6 build.
>>
>>Any comments before I commit to 2.1?
>>
>>Allan
>>
>>Index: server/mpm/winnt/child.c
>>===================================================================
>>RCS file: /home/cvs/httpd-2.0/server/mpm/winnt/child.c,v
>>retrieving revision 1.26
>>diff -u -d -b -r1.26 child.c
>>--- server/mpm/winnt/child.c 9 Feb 2004 20:40:51 -0000 1.26
>>+++ server/mpm/winnt/child.c 25 Feb 2004 16:20:51 -0000
>>@@ -314,13 +314,17 @@
>> int wait_time = 1;
>> int csd;
>> SOCKET nsd = INVALID_SOCKET;
>>- struct sockaddr_in sa_client;
>> int count_select_errors = 0;
>> int rc;
>> int clen;
>> ap_listen_rec *lr;
>> struct fd_set listenfds;
>> SOCKET listenmaxfd = INVALID_SOCKET;
>>+#if APR_HAVE_IPV6
>>+ struct sockaddr_in6 sa_client;
>>+#else
>>+ struct sockaddr_in sa_client;
>>+#endif
>>
>> /* Setup the listeners
>> * ToDo: Use apr_poll()
>>@@ -395,7 +399,13 @@
>>static PCOMP_CONTEXT win9x_get_connection(PCOMP_CONTEXT context)
>>{
>> apr_os_sock_info_t sockinfo;
>>- int len;
>>+ int len, salen;
>>+#if APR_HAVE_IPV6
>>+ salen = sizeof(struct sockaddr_in6);
>>+#else
>>+ salen = sizeof(struct sockaddr_in);
>>+#endif
>>+
>>
>> if (context == NULL) {
>> /* allocate the completion context and the transaction pool */
>>@@ -415,7 +425,7 @@
>> if (context->accept_socket == INVALID_SOCKET) {
>> return NULL;
>> }
>>- len = sizeof(struct sockaddr);
>>+ len = salen;
>> context->sa_server = apr_palloc(context->ptrans, len);
>> if (getsockname(context->accept_socket,
>> context->sa_server, &len)== SOCKET_ERROR) {
>>@@ -423,7 +433,7 @@
>> "getsockname failed");
>> continue;
>> }
>>- len = sizeof(struct sockaddr);
>>+ len = salen;
>> context->sa_client = apr_palloc(context->ptrans, len);
>> if ((getpeername(context->accept_socket,
>> context->sa_client, &len)) == SOCKET_ERROR) {
>>@@ -434,7 +444,7 @@
>> sockinfo.os_sock = &context->accept_socket;
>> sockinfo.local = context->sa_server;
>> sockinfo.remote = context->sa_client;
>>- sockinfo.family = APR_INET;
>>+ sockinfo.family = context->sa_server->sa_family;
>> sockinfo.type = SOCK_STREAM;
>> apr_os_sock_make(&context->sock, &sockinfo, context->ptrans);
>>
>>@@ -465,9 +475,21 @@
>> DWORD BytesRead;
>> SOCKET nlsd;
>> int rv, err_count = 0;
>>+#if APR_HAVE_IPV6
>>+ SOCKADDR_STORAGE ss_listen;
>>+ int namelen = sizeof(ss_listen);
>>+#endif
>>
>> apr_os_sock_get(&nlsd, lr->sd);
>>
>>+#if APR_HAVE_IPV6
>>+ if (getsockname(nlsd, (struct sockaddr *)&ss_listen, &namelen) == SOCKET_ERROR) {
>>+ ap_log_error(APLOG_MARK,APLOG_ERR, apr_get_netos_error(), ap_server_conf,
>>+ "winnt_accept: getsockname error on listening socket, is IPv6 available?");
>>+ return;
>>+ }
>>+#endif
>>+
>> while (!shutdown_in_progress) {
>> if (!context) {
>> context = mpm_get_completion_context();
>>@@ -479,6 +501,25 @@
>> }
>>
>> /* Create and initialize the accept socket */
>>+#if APR_HAVE_IPV6
>>+ if (context->accept_socket == INVALID_SOCKET) {
>>+ context->accept_socket = socket(ss_listen.ss_family, SOCK_STREAM, IPPROTO_TCP);
>>+ context->socket_family = ss_listen.ss_family;
>>+ }
>>+ else if (context->socket_family != ss_listen.ss_family) {
>>+ closesocket(context->accept_socket);
>>+ context->accept_socket = socket(ss_listen.ss_family, SOCK_STREAM, IPPROTO_TCP);
>>+ context->socket_family = ss_listen.ss_family;
>>+ }
>>+
>>+ if (context->accept_socket == INVALID_SOCKET) {
>>+ ap_log_error(APLOG_MARK,APLOG_WARNING, apr_get_netos_error(), ap_server_conf,
>>+ "winnt_accept: Failed to allocate an accept socket. "
>>+ "Temporary resource constraint? Try again.");
>>+ Sleep(100);
>>+ continue;
>>+ }
>>+#else
>> if (context->accept_socket == INVALID_SOCKET) {
>> context->accept_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
>> if (context->accept_socket == INVALID_SOCKET) {
>>@@ -490,7 +531,7 @@
>> continue;
>> }
>> }
>>-
>>+#endif
>> /* AcceptEx on the completion context. The completion context will be
>> * signaled when a connection is accepted.
>> */
>>@@ -607,7 +648,7 @@
>> sockinfo.os_sock = &context->accept_socket;
>> sockinfo.local = context->sa_server;
>> sockinfo.remote = context->sa_client;
>>- sockinfo.family = APR_INET;
>>+ sockinfo.family = context->sa_server->sa_family;
>> sockinfo.type = SOCK_STREAM;
>> apr_os_sock_make(&context->sock, &sockinfo, context->ptrans);
>>
>>Index: server/mpm/winnt/mpm_winnt.h
>>===================================================================
>>RCS file: /home/cvs/httpd-2.0/server/mpm/winnt/mpm_winnt.h,v
>>retrieving revision 1.48
>>diff -u -d -b -r1.48 mpm_winnt.h
>>--- server/mpm/winnt/mpm_winnt.h 9 Feb 2004 20:40:51 -0000 1.48
>>+++ server/mpm/winnt/mpm_winnt.h 25 Feb 2004 16:20:51 -0000
>>@@ -85,7 +85,12 @@
>>#define CONTAINING_RECORD(address, type, field) ((type *)( \
>> (PCHAR)(address) - \
>> (PCHAR)(&((type *)0)->field)))
>>+#if APR_HAVE_IPV6
>>+#define PADDED_ADDR_SIZE sizeof(SOCKADDR_IN6)+16
>>+#else
>>#define PADDED_ADDR_SIZE sizeof(SOCKADDR_IN)+16
>>+#endif
>>+
>>typedef struct CompContext {
>> struct CompContext *next;
>> OVERLAPPED Overlapped;
>>@@ -98,6 +103,7 @@
>> int sa_client_len;
>> apr_pool_t *ptrans;
>> apr_bucket_alloc_t *ba;
>>+ short socket_family;
>>} COMP_CONTEXT, *PCOMP_CONTEXT;
>>
>>typedef enum {
>>Index: srclib/apr/include/apr.hw
>>===================================================================
>>RCS file: /home/cvs/apr/include/apr.hw,v
>>retrieving revision 1.121
>>diff -u -d -b -r1.121 apr.hw
>>--- srclib/apr/include/apr.hw 21 Nov 2003 10:42:03 -0000 1.121
>>+++ srclib/apr/include/apr.hw 25 Feb 2004 16:20:51 -0000
>>@@ -87,11 +87,12 @@
>> * C4075: slight indirection changes (unsigned short* vs short[])
>> * C4100: unreferenced formal parameter
>> * C4127: conditional expression is constant
>>+ * C4163: '_rotl64' : not available as an intrinsic function
>> * C4201: nonstandard extension nameless struct/unions
>> * C4244: int to char/short - precision loss
>> * C4514: unreferenced inline function removed
>> */
>>-#pragma warning(disable: 4100 4127 4201 4514; once: 4057 4075 4244)
>>+#pragma warning(disable: 4100 4127 4163 4201 4514; once: 4057 4075 4244)
>>
>>/* Has windows.h already been included? If so, our preferences don't matter,
>> * but we will still need the winsock things no matter what was included.
Re: [PATCH] Windows IPv6
Posted by "William A. Rowe, Jr." <wr...@rowe-clan.net>.
+1, but which warning does 4163 quiet?
At 09:46 AM 2/26/2004, you wrote:
>Here's a patch to enable IPv6 on Windows XP & 2003.
>In addition we'll need to change the setting of
>APR_HAVE_IPV6 in apr.hw - seems like we'll need
>some awk magic to do that.
>
>Note that enabling IPv6 drags in the need for
>the XP or 2003 platform SDK but I don't see
>any way around it. I believe the platform SDK can
>be freely downloaded from MS for those who want to
>do an IPv6 build.
>
>Any comments before I commit to 2.1?
>
>Allan
>
>Index: server/mpm/winnt/child.c
>===================================================================
>RCS file: /home/cvs/httpd-2.0/server/mpm/winnt/child.c,v
>retrieving revision 1.26
>diff -u -d -b -r1.26 child.c
>--- server/mpm/winnt/child.c 9 Feb 2004 20:40:51 -0000 1.26
>+++ server/mpm/winnt/child.c 25 Feb 2004 16:20:51 -0000
>@@ -314,13 +314,17 @@
> int wait_time = 1;
> int csd;
> SOCKET nsd = INVALID_SOCKET;
>- struct sockaddr_in sa_client;
> int count_select_errors = 0;
> int rc;
> int clen;
> ap_listen_rec *lr;
> struct fd_set listenfds;
> SOCKET listenmaxfd = INVALID_SOCKET;
>+#if APR_HAVE_IPV6
>+ struct sockaddr_in6 sa_client;
>+#else
>+ struct sockaddr_in sa_client;
>+#endif
>
> /* Setup the listeners
> * ToDo: Use apr_poll()
>@@ -395,7 +399,13 @@
> static PCOMP_CONTEXT win9x_get_connection(PCOMP_CONTEXT context)
> {
> apr_os_sock_info_t sockinfo;
>- int len;
>+ int len, salen;
>+#if APR_HAVE_IPV6
>+ salen = sizeof(struct sockaddr_in6);
>+#else
>+ salen = sizeof(struct sockaddr_in);
>+#endif
>+
>
> if (context == NULL) {
> /* allocate the completion context and the transaction pool */
>@@ -415,7 +425,7 @@
> if (context->accept_socket == INVALID_SOCKET) {
> return NULL;
> }
>- len = sizeof(struct sockaddr);
>+ len = salen;
> context->sa_server = apr_palloc(context->ptrans, len);
> if (getsockname(context->accept_socket,
> context->sa_server, &len)== SOCKET_ERROR) {
>@@ -423,7 +433,7 @@
> "getsockname failed");
> continue;
> }
>- len = sizeof(struct sockaddr);
>+ len = salen;
> context->sa_client = apr_palloc(context->ptrans, len);
> if ((getpeername(context->accept_socket,
> context->sa_client, &len)) == SOCKET_ERROR) {
>@@ -434,7 +444,7 @@
> sockinfo.os_sock = &context->accept_socket;
> sockinfo.local = context->sa_server;
> sockinfo.remote = context->sa_client;
>- sockinfo.family = APR_INET;
>+ sockinfo.family = context->sa_server->sa_family;
> sockinfo.type = SOCK_STREAM;
> apr_os_sock_make(&context->sock, &sockinfo, context->ptrans);
>
>@@ -465,9 +475,21 @@
> DWORD BytesRead;
> SOCKET nlsd;
> int rv, err_count = 0;
>+#if APR_HAVE_IPV6
>+ SOCKADDR_STORAGE ss_listen;
>+ int namelen = sizeof(ss_listen);
>+#endif
>
> apr_os_sock_get(&nlsd, lr->sd);
>
>+#if APR_HAVE_IPV6
>+ if (getsockname(nlsd, (struct sockaddr *)&ss_listen, &namelen) == SOCKET_ERROR) {
>+ ap_log_error(APLOG_MARK,APLOG_ERR, apr_get_netos_error(), ap_server_conf,
>+ "winnt_accept: getsockname error on listening socket, is IPv6 available?");
>+ return;
>+ }
>+#endif
>+
> while (!shutdown_in_progress) {
> if (!context) {
> context = mpm_get_completion_context();
>@@ -479,6 +501,25 @@
> }
>
> /* Create and initialize the accept socket */
>+#if APR_HAVE_IPV6
>+ if (context->accept_socket == INVALID_SOCKET) {
>+ context->accept_socket = socket(ss_listen.ss_family, SOCK_STREAM, IPPROTO_TCP);
>+ context->socket_family = ss_listen.ss_family;
>+ }
>+ else if (context->socket_family != ss_listen.ss_family) {
>+ closesocket(context->accept_socket);
>+ context->accept_socket = socket(ss_listen.ss_family, SOCK_STREAM, IPPROTO_TCP);
>+ context->socket_family = ss_listen.ss_family;
>+ }
>+
>+ if (context->accept_socket == INVALID_SOCKET) {
>+ ap_log_error(APLOG_MARK,APLOG_WARNING, apr_get_netos_error(), ap_server_conf,
>+ "winnt_accept: Failed to allocate an accept socket. "
>+ "Temporary resource constraint? Try again.");
>+ Sleep(100);
>+ continue;
>+ }
>+#else
> if (context->accept_socket == INVALID_SOCKET) {
> context->accept_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
> if (context->accept_socket == INVALID_SOCKET) {
>@@ -490,7 +531,7 @@
> continue;
> }
> }
>-
>+#endif
> /* AcceptEx on the completion context. The completion context will be
> * signaled when a connection is accepted.
> */
>@@ -607,7 +648,7 @@
> sockinfo.os_sock = &context->accept_socket;
> sockinfo.local = context->sa_server;
> sockinfo.remote = context->sa_client;
>- sockinfo.family = APR_INET;
>+ sockinfo.family = context->sa_server->sa_family;
> sockinfo.type = SOCK_STREAM;
> apr_os_sock_make(&context->sock, &sockinfo, context->ptrans);
>
>Index: server/mpm/winnt/mpm_winnt.h
>===================================================================
>RCS file: /home/cvs/httpd-2.0/server/mpm/winnt/mpm_winnt.h,v
>retrieving revision 1.48
>diff -u -d -b -r1.48 mpm_winnt.h
>--- server/mpm/winnt/mpm_winnt.h 9 Feb 2004 20:40:51 -0000 1.48
>+++ server/mpm/winnt/mpm_winnt.h 25 Feb 2004 16:20:51 -0000
>@@ -85,7 +85,12 @@
> #define CONTAINING_RECORD(address, type, field) ((type *)( \
> (PCHAR)(address) - \
> (PCHAR)(&((type *)0)->field)))
>+#if APR_HAVE_IPV6
>+#define PADDED_ADDR_SIZE sizeof(SOCKADDR_IN6)+16
>+#else
> #define PADDED_ADDR_SIZE sizeof(SOCKADDR_IN)+16
>+#endif
>+
> typedef struct CompContext {
> struct CompContext *next;
> OVERLAPPED Overlapped;
>@@ -98,6 +103,7 @@
> int sa_client_len;
> apr_pool_t *ptrans;
> apr_bucket_alloc_t *ba;
>+ short socket_family;
> } COMP_CONTEXT, *PCOMP_CONTEXT;
>
> typedef enum {
>Index: srclib/apr/include/apr.hw
>===================================================================
>RCS file: /home/cvs/apr/include/apr.hw,v
>retrieving revision 1.121
>diff -u -d -b -r1.121 apr.hw
>--- srclib/apr/include/apr.hw 21 Nov 2003 10:42:03 -0000 1.121
>+++ srclib/apr/include/apr.hw 25 Feb 2004 16:20:51 -0000
>@@ -87,11 +87,12 @@
> * C4075: slight indirection changes (unsigned short* vs short[])
> * C4100: unreferenced formal parameter
> * C4127: conditional expression is constant
>+ * C4163: '_rotl64' : not available as an intrinsic function
> * C4201: nonstandard extension nameless struct/unions
> * C4244: int to char/short - precision loss
> * C4514: unreferenced inline function removed
> */
>-#pragma warning(disable: 4100 4127 4201 4514; once: 4057 4075 4244)
>+#pragma warning(disable: 4100 4127 4163 4201 4514; once: 4057 4075 4244)
>
> /* Has windows.h already been included? If so, our preferences don't matter,
> * but we will still need the winsock things no matter what was included.
>
>
>
>
>