mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Break SSL support out of _socket module and place it into a new
helper module _ssl. The support for the RAND_* APIs in _ssl is now only enabled for OpenSSL 0.9.5 and up since they were added in that release. Note that socketmodule.* should really be renamed to _socket.* -- unfortunately, this seems to lose the CVS history of the file. Please review and test... I was only able to test the header file chaos in socketmodule.c/h on Linux. The test run through fine and compiles don't give errors or warnings. WARNING: This patch does *not* include changes to the various non-Unix build process files.
This commit is contained in:
parent
e4418609f7
commit
a5d2b4cb18
7 changed files with 747 additions and 577 deletions
159
Modules/socketmodule.h
Normal file
159
Modules/socketmodule.h
Normal file
|
@ -0,0 +1,159 @@
|
|||
/* Socket module header file */
|
||||
|
||||
/* Includes needed for the sockaddr_* symbols below */
|
||||
#ifndef MS_WINDOWS
|
||||
# include <sys/socket.h>
|
||||
# include <netinet/in.h>
|
||||
# if !(defined(__BEOS__) || defined(__CYGWIN__) || (defined(PYOS_OS2) && defined(PYCC_VACPP)))
|
||||
# include <netinet/tcp.h>
|
||||
# endif
|
||||
|
||||
#else /* MS_WINDOWS */
|
||||
# include <winsock.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_UN_H
|
||||
# include <sys/un.h>
|
||||
#else
|
||||
# undef AF_UNIX
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_NETPACKET_PACKET_H
|
||||
# include <sys/ioctl.h>
|
||||
# include <net/if.h>
|
||||
# include <netpacket/packet.h>
|
||||
#endif
|
||||
|
||||
#ifndef Py__SOCKET_H
|
||||
#define Py__SOCKET_H
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Python module and C API name */
|
||||
#define PySocket_MODULE_NAME "_socket"
|
||||
#define PySocket_CAPI_NAME "CAPI"
|
||||
|
||||
/* Abstract the socket file descriptor type */
|
||||
#ifdef MS_WINDOWS
|
||||
typedef SOCKET SOCKET_T;
|
||||
# ifdef MS_WIN64
|
||||
# define SIZEOF_SOCKET_T 8
|
||||
# else
|
||||
# define SIZEOF_SOCKET_T 4
|
||||
# endif
|
||||
#else
|
||||
typedef int SOCKET_T;
|
||||
# define SIZEOF_SOCKET_T SIZEOF_INT
|
||||
#endif
|
||||
|
||||
/* The object holding a socket. It holds some extra information,
|
||||
like the address family, which is used to decode socket address
|
||||
arguments properly. */
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
SOCKET_T sock_fd; /* Socket file descriptor */
|
||||
int sock_family; /* Address family, e.g., AF_INET */
|
||||
int sock_type; /* Socket type, e.g., SOCK_STREAM */
|
||||
int sock_proto; /* Protocol type, usually 0 */
|
||||
union sock_addr {
|
||||
struct sockaddr_in in;
|
||||
#ifdef AF_UNIX
|
||||
struct sockaddr_un un;
|
||||
#endif
|
||||
#ifdef ENABLE_IPV6
|
||||
struct sockaddr_in6 in6;
|
||||
struct sockaddr_storage storage;
|
||||
#endif
|
||||
#ifdef HAVE_NETPACKET_PACKET_H
|
||||
struct sockaddr_ll ll;
|
||||
#endif
|
||||
} sock_addr;
|
||||
PyObject *(*errorhandler)(void); /* Error handler; checks
|
||||
errno, returns NULL and
|
||||
sets a Python exception */
|
||||
} PySocketSockObject;
|
||||
|
||||
/* A forward reference to the Socktype type object.
|
||||
The Socktype variable contains pointers to various functions,
|
||||
some of which call newsockobject(), which uses Socktype, so
|
||||
there has to be a circular reference. */
|
||||
|
||||
extern DL_IMPORT(PyTypeObject) PySocketSock_Type;
|
||||
|
||||
/* --- C API ----------------------------------------------------*/
|
||||
|
||||
/* C API for usage by other Python modules */
|
||||
typedef struct {
|
||||
|
||||
PyTypeObject *Sock_Type;
|
||||
|
||||
} PySocketModule_APIObject;
|
||||
|
||||
#ifndef PySocket_BUILDING_SOCKET
|
||||
|
||||
/* --- C API ----------------------------------------------------*/
|
||||
|
||||
/* Interfacestructure to C API for other modules.
|
||||
Call PySocket_ImportModuleAPI() to initialize this
|
||||
structure. After that usage is simple:
|
||||
|
||||
if (!PyArg_ParseTuple(args, "O!|zz:ssl",
|
||||
&PySocketModule.Sock_Type, (PyObject*)&Sock,
|
||||
&key_file, &cert_file))
|
||||
return NULL;
|
||||
...
|
||||
|
||||
*/
|
||||
|
||||
static
|
||||
PySocketModule_APIObject PySocketModule;
|
||||
|
||||
/* You *must* call this before using any of the functions in
|
||||
PySocketModule and check its outcome; otherwise all accesses will
|
||||
result in a segfault. Returns 0 on success. */
|
||||
|
||||
#ifndef DPRINTF
|
||||
# define DPRINTF if (0) printf
|
||||
#endif
|
||||
|
||||
static
|
||||
int PySocketModule_ImportModuleAndAPI(void)
|
||||
{
|
||||
PyObject *mod = 0, *v = 0;
|
||||
char *apimodule = PySocket_MODULE_NAME;
|
||||
char *apiname = PySocket_CAPI_NAME;
|
||||
void *api;
|
||||
|
||||
DPRINTF("Importing the %s C API...\n",apimodule);
|
||||
mod = PyImport_ImportModule(apimodule);
|
||||
if (mod == NULL)
|
||||
goto onError;
|
||||
DPRINTF(" %s package found\n",apimodule);
|
||||
v = PyObject_GetAttrString(mod,apiname);
|
||||
if (v == NULL)
|
||||
goto onError;
|
||||
Py_DECREF(mod);
|
||||
DPRINTF(" API object %s found\n",apiname);
|
||||
api = PyCObject_AsVoidPtr(v);
|
||||
if (api == NULL)
|
||||
goto onError;
|
||||
Py_DECREF(v);
|
||||
memcpy(&PySocketModule, api, sizeof(PySocketModule));
|
||||
DPRINTF(" API object loaded and initialized.\n");
|
||||
return 0;
|
||||
|
||||
onError:
|
||||
DPRINTF(" not found.\n");
|
||||
Py_XDECREF(mod);
|
||||
Py_XDECREF(v);
|
||||
return -1;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* !Py__SOCKET_H */
|
Loading…
Add table
Add a link
Reference in a new issue