more changes for Windows, sigh

This commit is contained in:
Guido van Rossum 1996-06-12 04:04:22 +00:00
parent 601d332a3f
commit d639d4d6d6
1 changed files with 57 additions and 29 deletions

View File

@ -1090,7 +1090,12 @@ static PyObject *
BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args) BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
{ {
PySocketSockObject *s; PySocketSockObject *s;
int fd, family, type, proto; #ifdef _MSC_VER
SOCKET fd;
#else
int fd;
#endif
int family, type, proto;
proto = 0; proto = 0;
if (!PyArg_Parse(args, "(ii)", &family, &type)) { if (!PyArg_Parse(args, "(ii)", &family, &type)) {
PyErr_Clear(); PyErr_Clear();
@ -1100,7 +1105,11 @@ BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
fd = socket(family, type, proto); fd = socket(family, type, proto);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
#ifdef _MSC_VER
if (fd == INVALID_SOCKET)
#else
if (fd < 0) if (fd < 0)
#endif
return PySocket_Err(); return PySocket_Err();
s = PySocketSock_New(fd, family, type, proto); s = PySocketSock_New(fd, family, type, proto);
/* If the object can't be created, don't forget to close the /* If the object can't be created, don't forget to close the
@ -1146,6 +1155,50 @@ BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
} }
#endif /* NO_DUP */ #endif /* NO_DUP */
static PyObject * PySocket_WSAStartup(self, args)
PyObject *self, *args;
{
#ifdef _MSC_VER
WSADATA WSAData;
int ret;
if (!PyArg_NoArgs(args))
return NULL;
ret = WSAStartup(0x0101, &WSAData); /* request version 1.1 */
switch(ret){
case WSASYSNOTREADY:
PyErr_SetString(PySocket_Error,
"WSAStartup failed: Network not ready\n");
break;
case WSAVERNOTSUPPORTED:
case WSAEINVAL:
PyErr_SetString(PySocket_Error,
"WSAStartup failed: Requested version not supported");
break;
case 0: /* no error */
break;
default:
PyErr_SetString(PySocket_Error,
"WSAStartup failed");
break;
}
#endif
Py_INCREF(Py_None);
return Py_None;
}
static PyObject * PySocket_WSACleanup(self, args)
PyObject *self, *args;
{
if (!PyArg_NoArgs(args))
return NULL;
#ifdef _MSC_VER
WSACleanup();
#endif
Py_INCREF(Py_None);
return Py_None;
}
/* List of functions exported by this module. */ /* List of functions exported by this module. */
static PyMethodDef PySocket_methods[] = { static PyMethodDef PySocket_methods[] = {
@ -1154,6 +1207,8 @@ static PyMethodDef PySocket_methods[] = {
{"gethostname", PySocket_gethostname}, {"gethostname", PySocket_gethostname},
{"getservbyname", PySocket_getservbyname}, {"getservbyname", PySocket_getservbyname},
{"socket", PySocket_socket}, {"socket", PySocket_socket},
{"WSAStartup", PySocket_WSAStartup},
{"WSACleanup", PySocket_WSACleanup},
#ifndef NO_DUP #ifndef NO_DUP
{"fromfd", PySocket_fromfd}, {"fromfd", PySocket_fromfd},
#endif #endif
@ -1445,34 +1500,7 @@ initsocket()
#ifdef MS_WIN16 #ifdef MS_WIN16
/* All windows sockets require a successful WSAStartup() before use */ /* All windows sockets require a successful WSAStartup() before use */
{ Py_XDECREF(PySocket_WSAStartup(NULL, NULL));
const int opt = SO_SYNCHRONOUS_NONALERT;
WSADATA WSAData;
int ret;
ret = WSAStartup(0x0101, &WSAData); /* request version 1.1 */
switch(ret){
case WSASYSNOTREADY:
PyErr_SetString(PySocket_Error,
"WSAStartup failed: Network not ready\n");
break;
case WSAVERNOTSUPPORTED:
case WSAEINVAL:
PyErr_SetString(PySocket_Error,
"WSAStartup failed: Requested version not supported");
break;
case 0:
/* Setup sockets in non-overlapped mode by default */
if (setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,
(const char *)&opt,sizeof(opt)) != 0)
PyErr_SetString(PySocket_Error,
"setsockopt failed in initsocket");
break;
default:
PyErr_SetString(PySocket_Error,
"WSAStartup failed");
break;
}
}
#endif #endif
} }