summaryrefslogtreecommitdiffstats
path: root/Modules/socketmodule.h
diff options
context:
space:
mode:
authorMarc-André Lemburg <mal@egenix.com>2002-02-16 18:23:30 (GMT)
committerMarc-André Lemburg <mal@egenix.com>2002-02-16 18:23:30 (GMT)
commita5d2b4cb180ec87d006d63f838860fba785bcad0 (patch)
treef1ddd4ab82b92077aa8a316639cbdce9ff3370b5 /Modules/socketmodule.h
parente4418609f79b94b91bda2621b5e6f067fb6a31d5 (diff)
downloadcpython-a5d2b4cb180ec87d006d63f838860fba785bcad0.zip
cpython-a5d2b4cb180ec87d006d63f838860fba785bcad0.tar.gz
cpython-a5d2b4cb180ec87d006d63f838860fba785bcad0.tar.bz2
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.
Diffstat (limited to 'Modules/socketmodule.h')
-rw-r--r--Modules/socketmodule.h159
1 files changed, 159 insertions, 0 deletions
diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h
new file mode 100644
index 0000000..606db3d
--- /dev/null
+++ b/Modules/socketmodule.h
@@ -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 */