annotate Modules/socketmodule.h @ 45837:c5241069fffd legacy-trunk

Speed up test_dict by about 10x by only checking selected dict literal sizes, instead of every integer from 0 to 400. Exhaustive testing wastes time without providing enough more assurance that the code is correct.
author Jeffrey Yasskin <jyasskin@gmail.com>
date Tue, 18 Mar 2008 05:12:41 +0000
parents ac51cfe5c5c6
children fcfe10f3dc14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
1 /* Socket module header file */
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
2
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
3 /* Includes needed for the sockaddr_* symbols below */
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
4 #ifndef MS_WINDOWS
28949
ac487a7f7f2c Patch #708495: Port more stuff to OpenVMS.
Martin v. Löwis <martin@v.loewis.de>
parents: 23815
diff changeset
5 #ifdef __VMS
ac487a7f7f2c Patch #708495: Port more stuff to OpenVMS.
Martin v. Löwis <martin@v.loewis.de>
parents: 23815
diff changeset
6 # include <socket.h>
ac487a7f7f2c Patch #708495: Port more stuff to OpenVMS.
Martin v. Löwis <martin@v.loewis.de>
parents: 23815
diff changeset
7 # else
ac487a7f7f2c Patch #708495: Port more stuff to OpenVMS.
Martin v. Löwis <martin@v.loewis.de>
parents: 23815
diff changeset
8 # include <sys/socket.h>
ac487a7f7f2c Patch #708495: Port more stuff to OpenVMS.
Martin v. Löwis <martin@v.loewis.de>
parents: 23815
diff changeset
9 # endif
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
10 # include <netinet/in.h>
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
11 # if !(defined(__BEOS__) || defined(__CYGWIN__) || (defined(PYOS_OS2) && defined(PYCC_VACPP)))
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
12 # include <netinet/tcp.h>
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
13 # endif
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
14
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
15 #else /* MS_WINDOWS */
22096
9e5ff6747437 Patch #520062: Support IPv6 with VC.NET.
Martin v. Löwis <martin@v.loewis.de>
parents: 22041
diff changeset
16 #if _MSC_VER >= 1300
9e5ff6747437 Patch #520062: Support IPv6 with VC.NET.
Martin v. Löwis <martin@v.loewis.de>
parents: 22041
diff changeset
17 # include <winsock2.h>
9e5ff6747437 Patch #520062: Support IPv6 with VC.NET.
Martin v. Löwis <martin@v.loewis.de>
parents: 22041
diff changeset
18 # include <ws2tcpip.h>
44474
bfed70277ab3 Added interface to Windows' WSAIoctl and a simple example for a network sniffer.
Christian Heimes <christian@cheimes.de>
parents: 44439
diff changeset
19 # include <MSTcpIP.h> /* for SIO_RCVALL */
22096
9e5ff6747437 Patch #520062: Support IPv6 with VC.NET.
Martin v. Löwis <martin@v.loewis.de>
parents: 22041
diff changeset
20 # define HAVE_ADDRINFO
9e5ff6747437 Patch #520062: Support IPv6 with VC.NET.
Martin v. Löwis <martin@v.loewis.de>
parents: 22041
diff changeset
21 # define HAVE_SOCKADDR_STORAGE
9e5ff6747437 Patch #520062: Support IPv6 with VC.NET.
Martin v. Löwis <martin@v.loewis.de>
parents: 22041
diff changeset
22 # define HAVE_GETADDRINFO
9e5ff6747437 Patch #520062: Support IPv6 with VC.NET.
Martin v. Löwis <martin@v.loewis.de>
parents: 22041
diff changeset
23 # define HAVE_GETNAMEINFO
9e5ff6747437 Patch #520062: Support IPv6 with VC.NET.
Martin v. Löwis <martin@v.loewis.de>
parents: 22041
diff changeset
24 # define ENABLE_IPV6
9e5ff6747437 Patch #520062: Support IPv6 with VC.NET.
Martin v. Löwis <martin@v.loewis.de>
parents: 22041
diff changeset
25 #else
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
26 # include <winsock.h>
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
27 #endif
22096
9e5ff6747437 Patch #520062: Support IPv6 with VC.NET.
Martin v. Löwis <martin@v.loewis.de>
parents: 22041
diff changeset
28 #endif
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
29
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
30 #ifdef HAVE_SYS_UN_H
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
31 # include <sys/un.h>
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
32 #else
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
33 # undef AF_UNIX
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
34 #endif
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
35
36286
ae4480935016 Patch #1103116: AF_NETLINK sockets basic support.
Martin v. Löwis <martin@v.loewis.de>
parents: 35551
diff changeset
36 #ifdef HAVE_LINUX_NETLINK_H
36298
9eeaa33f9640 Get socketmodule to build after adding netlink support.
Neal Norwitz <nnorwitz@gmail.com>
parents: 36286
diff changeset
37 # ifdef HAVE_ASM_TYPES_H
9eeaa33f9640 Get socketmodule to build after adding netlink support.
Neal Norwitz <nnorwitz@gmail.com>
parents: 36286
diff changeset
38 # include <asm/types.h>
9eeaa33f9640 Get socketmodule to build after adding netlink support.
Neal Norwitz <nnorwitz@gmail.com>
parents: 36286
diff changeset
39 # endif
36286
ae4480935016 Patch #1103116: AF_NETLINK sockets basic support.
Martin v. Löwis <martin@v.loewis.de>
parents: 35551
diff changeset
40 # include <linux/netlink.h>
ae4480935016 Patch #1103116: AF_NETLINK sockets basic support.
Martin v. Löwis <martin@v.loewis.de>
parents: 35551
diff changeset
41 #else
ae4480935016 Patch #1103116: AF_NETLINK sockets basic support.
Martin v. Löwis <martin@v.loewis.de>
parents: 35551
diff changeset
42 # undef AF_NETLINK
ae4480935016 Patch #1103116: AF_NETLINK sockets basic support.
Martin v. Löwis <martin@v.loewis.de>
parents: 35551
diff changeset
43 #endif
ae4480935016 Patch #1103116: AF_NETLINK sockets basic support.
Martin v. Löwis <martin@v.loewis.de>
parents: 35551
diff changeset
44
31441
493707692671 Patch #874083: Bluetooth support for socket module.
Martin v. Löwis <martin@v.loewis.de>
parents: 28949
diff changeset
45 #ifdef HAVE_BLUETOOTH_BLUETOOTH_H
493707692671 Patch #874083: Bluetooth support for socket module.
Martin v. Löwis <martin@v.loewis.de>
parents: 28949
diff changeset
46 #include <bluetooth/bluetooth.h>
493707692671 Patch #874083: Bluetooth support for socket module.
Martin v. Löwis <martin@v.loewis.de>
parents: 28949
diff changeset
47 #include <bluetooth/rfcomm.h>
493707692671 Patch #874083: Bluetooth support for socket module.
Martin v. Löwis <martin@v.loewis.de>
parents: 28949
diff changeset
48 #include <bluetooth/l2cap.h>
493707692671 Patch #874083: Bluetooth support for socket module.
Martin v. Löwis <martin@v.loewis.de>
parents: 28949
diff changeset
49 #include <bluetooth/sco.h>
40842
90e22fea8363 Patch #1432399: Add HCI sockets.
Martin v. Löwis <martin@v.loewis.de>
parents: 40416
diff changeset
50 #include <bluetooth/hci.h>
31441
493707692671 Patch #874083: Bluetooth support for socket module.
Martin v. Löwis <martin@v.loewis.de>
parents: 28949
diff changeset
51 #endif
493707692671 Patch #874083: Bluetooth support for socket module.
Martin v. Löwis <martin@v.loewis.de>
parents: 28949
diff changeset
52
31444
a282801b06b6 Add FreeBSD support for bluetooth sockets. (SF Patch #888148)
Hye-Shik Chang <hyeshik@gmail.com>
parents: 31441
diff changeset
53 #ifdef HAVE_BLUETOOTH_H
a282801b06b6 Add FreeBSD support for bluetooth sockets. (SF Patch #888148)
Hye-Shik Chang <hyeshik@gmail.com>
parents: 31441
diff changeset
54 #include <bluetooth.h>
a282801b06b6 Add FreeBSD support for bluetooth sockets. (SF Patch #888148)
Hye-Shik Chang <hyeshik@gmail.com>
parents: 31441
diff changeset
55 #endif
a282801b06b6 Add FreeBSD support for bluetooth sockets. (SF Patch #888148)
Hye-Shik Chang <hyeshik@gmail.com>
parents: 31441
diff changeset
56
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
57 #ifdef HAVE_NETPACKET_PACKET_H
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
58 # include <sys/ioctl.h>
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
59 # include <net/if.h>
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
60 # include <netpacket/packet.h>
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
61 #endif
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
62
44561
ac51cfe5c5c6 Issue #1646: Make socket support TIPC. The socket module now has support
Christian Heimes <christian@cheimes.de>
parents: 44474
diff changeset
63 #ifdef HAVE_LINUX_TIPC_H
ac51cfe5c5c6 Issue #1646: Make socket support TIPC. The socket module now has support
Christian Heimes <christian@cheimes.de>
parents: 44474
diff changeset
64 # include <linux/tipc.h>
ac51cfe5c5c6 Issue #1646: Make socket support TIPC. The socket module now has support
Christian Heimes <christian@cheimes.de>
parents: 44474
diff changeset
65 #endif
ac51cfe5c5c6 Issue #1646: Make socket support TIPC. The socket module now has support
Christian Heimes <christian@cheimes.de>
parents: 44474
diff changeset
66
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
67 #ifndef Py__SOCKET_H
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
68 #define Py__SOCKET_H
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
69 #ifdef __cplusplus
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
70 extern "C" {
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
71 #endif
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
72
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
73 /* Python module and C API name */
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
74 #define PySocket_MODULE_NAME "_socket"
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
75 #define PySocket_CAPI_NAME "CAPI"
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
76
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
77 /* Abstract the socket file descriptor type */
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
78 #ifdef MS_WINDOWS
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
79 typedef SOCKET SOCKET_T;
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
80 # ifdef MS_WIN64
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
81 # define SIZEOF_SOCKET_T 8
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
82 # else
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
83 # define SIZEOF_SOCKET_T 4
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
84 # endif
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
85 #else
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
86 typedef int SOCKET_T;
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
87 # define SIZEOF_SOCKET_T SIZEOF_INT
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
88 #endif
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
89
35551
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
90 /* Socket address */
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
91 typedef union sock_addr {
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
92 struct sockaddr_in in;
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
93 #ifdef AF_UNIX
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
94 struct sockaddr_un un;
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
95 #endif
36286
ae4480935016 Patch #1103116: AF_NETLINK sockets basic support.
Martin v. Löwis <martin@v.loewis.de>
parents: 35551
diff changeset
96 #ifdef AF_NETLINK
ae4480935016 Patch #1103116: AF_NETLINK sockets basic support.
Martin v. Löwis <martin@v.loewis.de>
parents: 35551
diff changeset
97 struct sockaddr_nl nl;
ae4480935016 Patch #1103116: AF_NETLINK sockets basic support.
Martin v. Löwis <martin@v.loewis.de>
parents: 35551
diff changeset
98 #endif
35551
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
99 #ifdef ENABLE_IPV6
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
100 struct sockaddr_in6 in6;
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
101 struct sockaddr_storage storage;
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
102 #endif
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
103 #ifdef HAVE_BLUETOOTH_BLUETOOTH_H
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
104 struct sockaddr_l2 bt_l2;
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
105 struct sockaddr_rc bt_rc;
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
106 struct sockaddr_sco bt_sco;
40842
90e22fea8363 Patch #1432399: Add HCI sockets.
Martin v. Löwis <martin@v.loewis.de>
parents: 40416
diff changeset
107 struct sockaddr_hci bt_hci;
35551
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
108 #endif
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
109 #ifdef HAVE_NETPACKET_PACKET_H
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
110 struct sockaddr_ll ll;
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
111 #endif
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
112 } sock_addr_t;
57f630a9de26 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 31790
diff changeset
113
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
114 /* The object holding a socket. It holds some extra information,
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
115 like the address family, which is used to decode socket address
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
116 arguments properly. */
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
117
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
118 typedef struct {
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
119 PyObject_HEAD
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
120 SOCKET_T sock_fd; /* Socket file descriptor */
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
121 int sock_family; /* Address family, e.g., AF_INET */
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
122 int sock_type; /* Socket type, e.g., SOCK_STREAM */
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
123 int sock_proto; /* Protocol type, usually 0 */
21969
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
124 PyObject *(*errorhandler)(void); /* Error handler; checks
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
125 errno, returns NULL and
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
126 sets a Python exception */
23815
203d1412a7e8 Major overhaul of timeout sockets:
Guido van Rossum <guido@python.org>
parents: 23724
diff changeset
127 double sock_timeout; /* Operation timeout in seconds;
203d1412a7e8 Major overhaul of timeout sockets:
Guido van Rossum <guido@python.org>
parents: 23724
diff changeset
128 0.0 means non-blocking */
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
129 } PySocketSockObject;
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
130
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
131 /* --- C API ----------------------------------------------------*/
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
132
22041
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
133 /* Short explanation of what this C API export mechanism does
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
134 and how it works:
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
135
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
136 The _ssl module needs access to the type object defined in
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
137 the _socket module. Since cross-DLL linking introduces a lot of
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
138 problems on many platforms, the "trick" is to wrap the
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
139 C API of a module in a struct which then gets exported to
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
140 other modules via a PyCObject.
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
141
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
142 The code in socketmodule.c defines this struct (which currently
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
143 only contains the type object reference, but could very
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
144 well also include other C APIs needed by other modules)
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
145 and exports it as PyCObject via the module dictionary
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
146 under the name "CAPI".
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
147
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
148 Other modules can now include the socketmodule.h file
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
149 which defines the needed C APIs to import and set up
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
150 a static copy of this struct in the importing module.
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
151
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
152 After initialization, the importing module can then
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
153 access the C APIs from the _socket module by simply
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
154 referring to the static struct, e.g.
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
155
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
156 Load _socket module and its C API; this sets up the global
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
157 PySocketModule:
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
158
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
159 if (PySocketModule_ImportModuleAndAPI())
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
160 return;
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
161
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
162
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
163 Now use the C API as if it were defined in the using
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
164 module:
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
165
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
166 if (!PyArg_ParseTuple(args, "O!|zz:ssl",
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
167
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
168 PySocketModule.Sock_Type,
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
169
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
170 (PyObject*)&Sock,
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
171 &key_file, &cert_file))
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
172 return NULL;
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
173
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
174 Support could easily be extended to export more C APIs/symbols
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
175 this way. Currently, only the type object is exported,
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
176 other candidates would be socket constructors and socket
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
177 access functions.
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
178
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
179 */
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
180
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
181 /* C API for usage by other Python modules */
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
182 typedef struct {
21969
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
183 PyTypeObject *Sock_Type;
31790
29da8bdfeb4e Make socket.sslerror a subclass of socket.error .
Brett Cannon <bcannon@gmail.com>
parents: 31444
diff changeset
184 PyObject *error;
21969
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
185 } PySocketModule_APIObject;
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
186
21969
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
187 /* XXX The net effect of the following appears to be to define a function
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
188 XXX named PySocketModule_APIObject in _ssl.c. It's unclear why it isn't
22041
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
189 XXX defined there directly.
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
190
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
191 >>> It's defined here because other modules might also want to use
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
192 >>> the C API.
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
193
e0a288db022d Add documentation about how the inter-module linking works.
Marc-André Lemburg <mal@egenix.com>
parents: 21970
diff changeset
194 */
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
195 #ifndef PySocket_BUILDING_SOCKET
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
196
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
197 /* --- C API ----------------------------------------------------*/
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
198
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
199 /* Interfacestructure to C API for other modules.
23724
db239ec307e0 Repair a comment.
Guido van Rossum <guido@python.org>
parents: 23715
diff changeset
200 Call PySocketModule_ImportModuleAndAPI() to initialize this
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
201 structure. After that usage is simple:
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
202
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
203 if (!PyArg_ParseTuple(args, "O!|zz:ssl",
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
204 &PySocketModule.Sock_Type, (PyObject*)&Sock,
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
205 &key_file, &cert_file))
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
206 return NULL;
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
207 ...
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
208 */
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
209
21969
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
210 static
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
211 PySocketModule_APIObject PySocketModule;
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
212
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
213 /* You *must* call this before using any of the functions in
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
214 PySocketModule and check its outcome; otherwise all accesses will
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
215 result in a segfault. Returns 0 on success. */
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
216
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
217 #ifndef DPRINTF
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
218 # define DPRINTF if (0) printf
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
219 #endif
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
220
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
221 static
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
222 int PySocketModule_ImportModuleAndAPI(void)
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
223 {
21969
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
224 PyObject *mod = 0, *v = 0;
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
225 char *apimodule = PySocket_MODULE_NAME;
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
226 char *apiname = PySocket_CAPI_NAME;
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
227 void *api;
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
228
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
229 DPRINTF("Importing the %s C API...\n", apimodule);
44439
0cbe94bea2c7 Modified PyImport_Import and PyImport_ImportModule to always use absolute imports by calling __import__ with an explicit level of 0
Christian Heimes <christian@cheimes.de>
parents: 40842
diff changeset
230 mod = PyImport_ImportModuleNoBlock(apimodule);
21969
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
231 if (mod == NULL)
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
232 goto onError;
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
233 DPRINTF(" %s package found\n", apimodule);
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
234 v = PyObject_GetAttrString(mod, apiname);
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
235 if (v == NULL)
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
236 goto onError;
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
237 Py_DECREF(mod);
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
238 DPRINTF(" API object %s found\n", apiname);
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
239 api = PyCObject_AsVoidPtr(v);
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
240 if (api == NULL)
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
241 goto onError;
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
242 Py_DECREF(v);
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
243 memcpy(&PySocketModule, api, sizeof(PySocketModule));
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
244 DPRINTF(" API object loaded and initialized.\n");
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
245 return 0;
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
246
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
247 onError:
21969
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
248 DPRINTF(" not found.\n");
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
249 Py_XDECREF(mod);
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
250 Py_XDECREF(v);
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
251 return -1;
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
252 }
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
253
21969
72c95448ee4b For readability, switch to tab indents; was using a mix of tab indents,
Tim Peters <tim.peters@gmail.com>
parents: 21959
diff changeset
254 #endif /* !PySocket_BUILDING_SOCKET */
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
255
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
256 #ifdef __cplusplus
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
257 }
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
258 #endif
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents:
diff changeset
259 #endif /* !Py__SOCKET_H */