Restore support for Microsoft VC6 compiler.
Some functions in the msvcrt module are skipped,
and socket.ioctl is enabled only when using a more recent Platform SDK.

(and yes, there are still companies that use a 10-years old compiler)
diff --git a/Include/pythonrun.h b/Include/pythonrun.h
index c5635ba..b2b3afd 100644
--- a/Include/pythonrun.h
+++ b/Include/pythonrun.h
@@ -153,7 +153,7 @@
    to a 8k margin. */
 #define PYOS_STACK_MARGIN 2048
 
-#if defined(WIN32) && !defined(MS_WIN64) && defined(_MSC_VER)
+#if defined(WIN32) && !defined(MS_WIN64) && defined(_MSC_VER) && _MSC_VER >= 1300
 /* Enable stack checking under Microsoft C */
 #define USE_STACKCHECK
 #endif
diff --git a/Modules/errnomodule.c b/Modules/errnomodule.c
index 696d396..642d721 100644
--- a/Modules/errnomodule.c
+++ b/Modules/errnomodule.c
@@ -5,7 +5,7 @@
 
 /* Windows socket errors (WSA*)  */
 #ifdef MS_WINDOWS
-#include <winsock.h>
+#include <windows.h>
 #endif
 
 /*
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index e956831..e4c8ac8 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -2805,7 +2805,7 @@
 Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
 of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
 
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
 static PyObject*
 sock_ioctl(PySocketSockObject *s, PyObject *arg)
 {
@@ -2858,7 +2858,7 @@
 			  METH_NOARGS, getsockname_doc},
 	{"getsockopt",	  (PyCFunction)sock_getsockopt, METH_VARARGS,
 			  getsockopt_doc},
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
 	{"ioctl",	  (PyCFunction)sock_ioctl, METH_VARARGS,
 			  sock_ioctl_doc},
 #endif
diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h
index 285c1fe..44483cb 100644
--- a/Modules/socketmodule.h
+++ b/Modules/socketmodule.h
@@ -13,19 +13,23 @@
 # endif
 
 #else /* MS_WINDOWS */
-#if _MSC_VER >= 1300
 # include <winsock2.h>
 # include <ws2tcpip.h>
-# include <MSTcpIP.h> /* for SIO_RCVALL */
-# define HAVE_ADDRINFO
-# define HAVE_SOCKADDR_STORAGE
-# define HAVE_GETADDRINFO
-# define HAVE_GETNAMEINFO
-# define ENABLE_IPV6
-#else
-# include <winsock.h>
-#endif
-#endif
+/* VC6 is shipped with old platform headers, and does not have MSTcpIP.h
+ * Separate SDKs have all the functions we want, but older ones don't have
+ * any version information. I use IPPROTO_IPV6 to detect a decent SDK.
+ */
+# ifdef IPPROTO_IPV6
+#  include <MSTcpIP.h> /* for SIO_RCVALL */
+#  define HAVE_ADDRINFO
+#  define HAVE_SOCKADDR_STORAGE
+#  define HAVE_GETADDRINFO
+#  define HAVE_GETNAMEINFO
+#  define ENABLE_IPV6
+# else
+typedef int socklen_t;
+# endif /* IPPROTO_IPV6 */
+#endif /* MS_WINDOWS */
 
 #ifdef HAVE_SYS_UN_H
 # include <sys/un.h>
diff --git a/PC/VC6/_socket.dsp b/PC/VC6/_socket.dsp
index 85d2bf0..4e84055 100644
--- a/PC/VC6/_socket.dsp
+++ b/PC/VC6/_socket.dsp
@@ -54,7 +54,7 @@
 # ADD BSC32 /nologo

 LINK32=link.exe

 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386

-# ADD LINK32 user32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /base:"0x1e1D0000" /subsystem:windows /dll /debug /machine:I386 /out:"./_socket.pyd"

+# ADD LINK32 user32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /base:"0x1e1D0000" /subsystem:windows /dll /debug /machine:I386 /out:"./_socket.pyd"

 # SUBTRACT LINK32 /pdb:none

 

 !ELSEIF  "$(CFG)" == "_socket - Win32 Debug"

@@ -82,7 +82,7 @@
 # ADD BSC32 /nologo

 LINK32=link.exe

 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept

-# ADD LINK32 user32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /base:"0x1e1D0000" /subsystem:windows /dll /debug /machine:I386 /out:"./_socket_d.pyd" /pdbtype:sept

+# ADD LINK32 user32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /base:"0x1e1D0000" /subsystem:windows /dll /debug /machine:I386 /out:"./_socket_d.pyd" /pdbtype:sept

 # SUBTRACT LINK32 /pdb:none

 

 !ENDIF 

diff --git a/PC/VC6/pythoncore.dsp b/PC/VC6/pythoncore.dsp
index 992f816..1fc2a38 100644
--- a/PC/VC6/pythoncore.dsp
+++ b/PC/VC6/pythoncore.dsp
@@ -97,6 +97,10 @@
 # End Source File

 # Begin Source File

 

+SOURCE=..\..\Modules\_bytesio.c

+# End Source File

+# Begin Source File

+

 SOURCE=..\..\Modules\cjkcodecs\_codecs_cn.c

 # End Source File

 # Begin Source File

diff --git a/PC/msvcrtmodule.c b/PC/msvcrtmodule.c
index e110ed8..95e369b 100755
--- a/PC/msvcrtmodule.c
+++ b/PC/msvcrtmodule.c
@@ -143,6 +143,7 @@
 	return PyString_FromStringAndSize(s, 1);
 }
 
+#ifdef _WCONIO_DEFINED
 static PyObject *
 msvcrt_getwch(PyObject *self, PyObject *args)
 {
@@ -158,6 +159,7 @@
 	u[0] = ch;
 	return PyUnicode_FromUnicode(u, 1);
 }
+#endif
 
 static PyObject *
 msvcrt_getche(PyObject *self, PyObject *args)
@@ -175,6 +177,7 @@
 	return PyString_FromStringAndSize(s, 1);
 }
 
+#ifdef _WCONIO_DEFINED
 static PyObject *
 msvcrt_getwche(PyObject *self, PyObject *args)
 {
@@ -190,6 +193,7 @@
 	s[0] = ch;
 	return PyUnicode_FromUnicode(s, 1);
 }
+#endif
 
 static PyObject *
 msvcrt_putch(PyObject *self, PyObject *args)
@@ -204,7 +208,7 @@
 	return Py_None;
 }
 
-
+#ifdef _WCONIO_DEFINED
 static PyObject *
 msvcrt_putwch(PyObject *self, PyObject *args)
 {
@@ -223,6 +227,7 @@
 	Py_RETURN_NONE;
 
 }
+#endif
 
 static PyObject *
 msvcrt_ungetch(PyObject *self, PyObject *args)
@@ -238,6 +243,7 @@
 	return Py_None;
 }
 
+#ifdef _WCONIO_DEFINED
 static PyObject *
 msvcrt_ungetwch(PyObject *self, PyObject *args)
 {
@@ -251,6 +257,7 @@
 	Py_INCREF(Py_None);
 	return Py_None;
 }
+#endif
 
 static void
 insertint(PyObject *d, char *name, int value)
@@ -279,11 +286,12 @@
 	{"getche",		msvcrt_getche, METH_VARARGS},
 	{"putch",		msvcrt_putch, METH_VARARGS},
 	{"ungetch",		msvcrt_ungetch, METH_VARARGS},
+#ifdef _WCONIO_DEFINED
 	{"getwch",		msvcrt_getwch, METH_VARARGS},
 	{"getwche",		msvcrt_getwche, METH_VARARGS},
 	{"putwch",		msvcrt_putwch, METH_VARARGS},
 	{"ungetwch",		msvcrt_ungetwch, METH_VARARGS},
-
+#endif
 	{NULL,			NULL}
 };
 
diff --git a/PC/pyconfig.h b/PC/pyconfig.h
index 98d79ad..93dbc09 100644
--- a/PC/pyconfig.h
+++ b/PC/pyconfig.h
@@ -467,13 +467,6 @@
 /* Define to `unsigned' if <sys/types.h> doesn't define.  */
 /* #undef size_t */
 
-/* Define to `int' if <sys/types.h> doesn't define.  */
-#if _MSC_VER + 0 >= 1300
-/* VC.NET typedefs socklen_t in ws2tcpip.h. */
-#else
-#define socklen_t int
-#endif
-
 /* Define if you have the ANSI C header files.  */
 #define STDC_HEADERS 1