1 /* Socket module header file */
3 /* Includes needed for the sockaddr_* symbols below */
8 # include <sys/socket.h>
10 # include <netinet/in.h>
11 # if !(defined(__BEOS__) || defined(__CYGWIN__) || (defined(PYOS_OS2) && defined(PYCC_VACPP)))
12 # include <netinet/tcp.h>
15 #else /* MS_WINDOWS */
16 # include <winsock2.h>
17 # include <ws2tcpip.h>
18 /* VC6 is shipped with old platform headers, and does not have MSTcpIP.h
19 * Separate SDKs have all the functions we want, but older ones don't have
20 * any version information.
21 * I use SIO_GET_MULTICAST_FILTER to detect a decent SDK.
23 # ifdef SIO_GET_MULTICAST_FILTER
24 # include <MSTcpIP.h> /* for SIO_RCVALL */
25 # define HAVE_ADDRINFO
26 # define HAVE_SOCKADDR_STORAGE
27 # define HAVE_GETADDRINFO
28 # define HAVE_GETNAMEINFO
31 typedef int socklen_t
;
32 # endif /* IPPROTO_IPV6 */
33 #endif /* MS_WINDOWS */
41 #ifdef HAVE_LINUX_NETLINK_H
42 # ifdef HAVE_ASM_TYPES_H
43 # include <asm/types.h>
45 # include <linux/netlink.h>
50 #ifdef HAVE_BLUETOOTH_BLUETOOTH_H
51 #include <bluetooth/bluetooth.h>
52 #include <bluetooth/rfcomm.h>
53 #include <bluetooth/l2cap.h>
54 #include <bluetooth/sco.h>
55 #include <bluetooth/hci.h>
58 #ifdef HAVE_BLUETOOTH_H
59 #include <bluetooth.h>
62 #ifdef HAVE_NETPACKET_PACKET_H
63 # include <sys/ioctl.h>
65 # include <netpacket/packet.h>
68 #ifdef HAVE_LINUX_TIPC_H
69 # include <linux/tipc.h>
78 /* Python module and C API name */
79 #define PySocket_MODULE_NAME "_socket"
80 #define PySocket_CAPI_NAME "CAPI"
81 #define PySocket_CAPSULE_NAME (PySocket_MODULE_NAME "." PySocket_CAPI_NAME)
83 /* Abstract the socket file descriptor type */
85 typedef SOCKET SOCKET_T
;
87 # define SIZEOF_SOCKET_T 8
89 # define SIZEOF_SOCKET_T 4
93 # define SIZEOF_SOCKET_T SIZEOF_INT
97 typedef union sock_addr
{
98 struct sockaddr_in in
;
100 struct sockaddr_un un
;
103 struct sockaddr_nl nl
;
106 struct sockaddr_in6 in6
;
107 struct sockaddr_storage storage
;
109 #ifdef HAVE_BLUETOOTH_BLUETOOTH_H
110 struct sockaddr_l2 bt_l2
;
111 struct sockaddr_rc bt_rc
;
112 struct sockaddr_sco bt_sco
;
113 struct sockaddr_hci bt_hci
;
115 #ifdef HAVE_NETPACKET_PACKET_H
116 struct sockaddr_ll ll
;
120 /* The object holding a socket. It holds some extra information,
121 like the address family, which is used to decode socket address
122 arguments properly. */
126 SOCKET_T sock_fd
; /* Socket file descriptor */
127 int sock_family
; /* Address family, e.g., AF_INET */
128 int sock_type
; /* Socket type, e.g., SOCK_STREAM */
129 int sock_proto
; /* Protocol type, usually 0 */
130 PyObject
*(*errorhandler
)(void); /* Error handler; checks
131 errno, returns NULL and
132 sets a Python exception */
133 double sock_timeout
; /* Operation timeout in seconds;
134 0.0 means non-blocking */
135 PyObject
*weakreflist
;
136 } PySocketSockObject
;
138 /* --- C API ----------------------------------------------------*/
140 /* Short explanation of what this C API export mechanism does
143 The _ssl module needs access to the type object defined in
144 the _socket module. Since cross-DLL linking introduces a lot of
145 problems on many platforms, the "trick" is to wrap the
146 C API of a module in a struct which then gets exported to
147 other modules via a PyCapsule.
149 The code in socketmodule.c defines this struct (which currently
150 only contains the type object reference, but could very
151 well also include other C APIs needed by other modules)
152 and exports it as PyCapsule via the module dictionary
153 under the name "CAPI".
155 Other modules can now include the socketmodule.h file
156 which defines the needed C APIs to import and set up
157 a static copy of this struct in the importing module.
159 After initialization, the importing module can then
160 access the C APIs from the _socket module by simply
161 referring to the static struct, e.g.
163 Load _socket module and its C API; this sets up the global
166 if (PySocketModule_ImportModuleAndAPI())
170 Now use the C API as if it were defined in the using
173 if (!PyArg_ParseTuple(args, "O!|zz:ssl",
175 PySocketModule.Sock_Type,
178 &key_file, &cert_file))
181 Support could easily be extended to export more C APIs/symbols
182 this way. Currently, only the type object is exported,
183 other candidates would be socket constructors and socket
188 /* C API for usage by other Python modules */
190 PyTypeObject
*Sock_Type
;
192 } PySocketModule_APIObject
;
194 /* XXX The net effect of the following appears to be to define a function
195 XXX named PySocketModule_APIObject in _ssl.c. It's unclear why it isn't
196 XXX defined there directly.
198 >>> It's defined here because other modules might also want to use
202 #ifndef PySocket_BUILDING_SOCKET
204 /* --- C API ----------------------------------------------------*/
206 /* Interfacestructure to C API for other modules.
207 Call PySocketModule_ImportModuleAndAPI() to initialize this
208 structure. After that usage is simple:
210 if (!PyArg_ParseTuple(args, "O!|zz:ssl",
211 &PySocketModule.Sock_Type, (PyObject*)&Sock,
212 &key_file, &cert_file))
218 PySocketModule_APIObject PySocketModule
;
220 /* You *must* call this before using any of the functions in
221 PySocketModule and check its outcome; otherwise all accesses will
222 result in a segfault. Returns 0 on success. */
225 # define DPRINTF if (0) printf
229 int PySocketModule_ImportModuleAndAPI(void)
233 DPRINTF(" Loading capsule %s\n", PySocket_CAPSULE_NAME
);
234 api
= PyCapsule_Import(PySocket_CAPSULE_NAME
, 1);
237 memcpy(&PySocketModule
, api
, sizeof(PySocketModule
));
238 DPRINTF(" API object loaded and initialized.\n");
242 DPRINTF(" not found.\n");
246 #endif /* !PySocket_BUILDING_SOCKET */
251 #endif /* !Py__SOCKET_H */