| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 1 | /* Socket module header file */ | 
 | 2 |  | 
 | 3 | /* Includes needed for the sockaddr_* symbols below */ | 
 | 4 | #ifndef MS_WINDOWS | 
| Martin v. Löwis | c16f3bd | 2003-05-03 09:14:54 +0000 | [diff] [blame] | 5 | #ifdef __VMS | 
 | 6 | #   include <socket.h> | 
 | 7 | # else | 
 | 8 | #   include <sys/socket.h> | 
 | 9 | # endif | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 10 | # include <netinet/in.h> | 
| Christian Heimes | b5daaed | 2007-11-30 23:34:21 +0000 | [diff] [blame] | 11 | # if !(defined(__CYGWIN__) || (defined(PYOS_OS2) && defined(PYCC_VACPP))) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 12 | #  include <netinet/tcp.h> | 
 | 13 | # endif | 
 | 14 |  | 
 | 15 | #else /* MS_WINDOWS */ | 
| Martin v. Löwis | 272cb40 | 2002-03-01 08:31:07 +0000 | [diff] [blame] | 16 | # include <winsock2.h> | 
 | 17 | # include <ws2tcpip.h> | 
| Amaury Forgeot d'Arc | 3d17a5c | 2008-06-13 01:09:34 +0000 | [diff] [blame] | 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 | 
| Martin v. Löwis | b072cf2 | 2008-06-14 11:59:52 +0000 | [diff] [blame] | 20 |  * any version information.  | 
 | 21 |  * I use SIO_GET_MULTICAST_FILTER to detect a decent SDK. | 
| Amaury Forgeot d'Arc | 3d17a5c | 2008-06-13 01:09:34 +0000 | [diff] [blame] | 22 |  */ | 
| Martin v. Löwis | b072cf2 | 2008-06-14 11:59:52 +0000 | [diff] [blame] | 23 | # ifdef SIO_GET_MULTICAST_FILTER | 
| Amaury Forgeot d'Arc | 3d17a5c | 2008-06-13 01:09:34 +0000 | [diff] [blame] | 24 | #  include <MSTcpIP.h> /* for SIO_RCVALL */ | 
 | 25 | #  define HAVE_ADDRINFO | 
 | 26 | #  define HAVE_SOCKADDR_STORAGE | 
 | 27 | #  define HAVE_GETADDRINFO | 
 | 28 | #  define HAVE_GETNAMEINFO | 
 | 29 | #  define ENABLE_IPV6 | 
 | 30 | # else | 
 | 31 | typedef int socklen_t; | 
 | 32 | # endif /* IPPROTO_IPV6 */ | 
 | 33 | #endif /* MS_WINDOWS */ | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 34 |  | 
 | 35 | #ifdef HAVE_SYS_UN_H | 
 | 36 | # include <sys/un.h> | 
 | 37 | #else | 
 | 38 | # undef AF_UNIX | 
 | 39 | #endif | 
 | 40 |  | 
| Martin v. Löwis | 11017b1 | 2006-01-14 18:12:57 +0000 | [diff] [blame] | 41 | #ifdef HAVE_LINUX_NETLINK_H | 
| Neal Norwitz | 6585166 | 2006-01-16 04:31:40 +0000 | [diff] [blame] | 42 | # ifdef HAVE_ASM_TYPES_H | 
 | 43 | #  include <asm/types.h> | 
 | 44 | # endif | 
| Martin v. Löwis | 11017b1 | 2006-01-14 18:12:57 +0000 | [diff] [blame] | 45 | # include <linux/netlink.h> | 
 | 46 | #else | 
 | 47 | #  undef AF_NETLINK | 
 | 48 | #endif | 
 | 49 |  | 
| Martin v. Löwis | 12af048 | 2004-01-31 12:34:17 +0000 | [diff] [blame] | 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> | 
| Thomas Wouters | cf297e4 | 2007-02-23 15:07:44 +0000 | [diff] [blame] | 55 | #include <bluetooth/hci.h> | 
| Martin v. Löwis | 12af048 | 2004-01-31 12:34:17 +0000 | [diff] [blame] | 56 | #endif | 
 | 57 |  | 
| Hye-Shik Chang | 96c44658 | 2004-02-02 08:48:45 +0000 | [diff] [blame] | 58 | #ifdef HAVE_BLUETOOTH_H | 
 | 59 | #include <bluetooth.h> | 
 | 60 | #endif | 
 | 61 |  | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 62 | #ifdef HAVE_NETPACKET_PACKET_H | 
 | 63 | # include <sys/ioctl.h> | 
 | 64 | # include <net/if.h> | 
 | 65 | # include <netpacket/packet.h> | 
 | 66 | #endif | 
 | 67 |  | 
| Christian Heimes | 043d6f6 | 2008-01-07 17:19:16 +0000 | [diff] [blame] | 68 | #ifdef HAVE_LINUX_TIPC_H | 
 | 69 | # include <linux/tipc.h> | 
 | 70 | #endif | 
 | 71 |  | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 72 | #ifndef Py__SOCKET_H | 
 | 73 | #define Py__SOCKET_H | 
 | 74 | #ifdef __cplusplus | 
 | 75 | extern "C" { | 
 | 76 | #endif | 
 | 77 |  | 
 | 78 | /* Python module and C API name */ | 
 | 79 | #define PySocket_MODULE_NAME	"_socket" | 
 | 80 | #define PySocket_CAPI_NAME	"CAPI" | 
| Benjamin Peterson | b173f78 | 2009-05-05 22:31:58 +0000 | [diff] [blame] | 81 | #define PySocket_CAPSULE_NAME	PySocket_MODULE_NAME "." PySocket_CAPI_NAME | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 82 |  | 
 | 83 | /* Abstract the socket file descriptor type */ | 
 | 84 | #ifdef MS_WINDOWS | 
 | 85 | typedef SOCKET SOCKET_T; | 
 | 86 | #	ifdef MS_WIN64 | 
 | 87 | #		define SIZEOF_SOCKET_T 8 | 
 | 88 | #	else | 
 | 89 | #		define SIZEOF_SOCKET_T 4 | 
 | 90 | #	endif | 
 | 91 | #else | 
 | 92 | typedef int SOCKET_T; | 
 | 93 | #	define SIZEOF_SOCKET_T SIZEOF_INT | 
 | 94 | #endif | 
 | 95 |  | 
| Guido van Rossum | 8ee3e5a | 2005-09-14 18:09:42 +0000 | [diff] [blame] | 96 | /* Socket address */ | 
 | 97 | typedef union sock_addr { | 
 | 98 | 	struct sockaddr_in in; | 
 | 99 | #ifdef AF_UNIX | 
 | 100 | 	struct sockaddr_un un; | 
 | 101 | #endif | 
| Martin v. Löwis | 11017b1 | 2006-01-14 18:12:57 +0000 | [diff] [blame] | 102 | #ifdef AF_NETLINK | 
 | 103 | 	struct sockaddr_nl nl; | 
 | 104 | #endif | 
| Guido van Rossum | 8ee3e5a | 2005-09-14 18:09:42 +0000 | [diff] [blame] | 105 | #ifdef ENABLE_IPV6 | 
 | 106 | 	struct sockaddr_in6 in6; | 
 | 107 | 	struct sockaddr_storage storage; | 
 | 108 | #endif | 
 | 109 | #ifdef HAVE_BLUETOOTH_BLUETOOTH_H | 
 | 110 | 	struct sockaddr_l2 bt_l2; | 
 | 111 | 	struct sockaddr_rc bt_rc; | 
 | 112 | 	struct sockaddr_sco bt_sco; | 
| Thomas Wouters | cf297e4 | 2007-02-23 15:07:44 +0000 | [diff] [blame] | 113 | 	struct sockaddr_hci bt_hci; | 
| Guido van Rossum | 8ee3e5a | 2005-09-14 18:09:42 +0000 | [diff] [blame] | 114 | #endif | 
 | 115 | #ifdef HAVE_NETPACKET_PACKET_H | 
 | 116 | 	struct sockaddr_ll ll; | 
 | 117 | #endif | 
 | 118 | } sock_addr_t; | 
 | 119 |  | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 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. */ | 
 | 123 |  | 
 | 124 | typedef struct { | 
 | 125 | 	PyObject_HEAD | 
 | 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 */ | 
| Tim Peters | 6f5505a | 2002-02-17 03:58:51 +0000 | [diff] [blame] | 130 | 	PyObject *(*errorhandler)(void); /* Error handler; checks | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 131 | 					    errno, returns NULL and | 
 | 132 | 					    sets a Python exception */ | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 133 | 	double sock_timeout;		 /* Operation timeout in seconds; | 
 | 134 | 					    0.0 means non-blocking */ | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 135 | } PySocketSockObject; | 
 | 136 |  | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 137 | /* --- C API ----------------------------------------------------*/ | 
 | 138 |  | 
| Marc-André Lemburg | 666e70d | 2002-02-25 14:45:40 +0000 | [diff] [blame] | 139 | /* Short explanation of what this C API export mechanism does | 
 | 140 |    and how it works: | 
 | 141 |  | 
 | 142 |     The _ssl module needs access to the type object defined in  | 
 | 143 |     the _socket module. Since cross-DLL linking introduces a lot of | 
 | 144 |     problems on many platforms, the "trick" is to wrap the | 
 | 145 |     C API of a module in a struct which then gets exported to | 
| Benjamin Peterson | b173f78 | 2009-05-05 22:31:58 +0000 | [diff] [blame] | 146 |     other modules via a PyCapsule. | 
| Marc-André Lemburg | 666e70d | 2002-02-25 14:45:40 +0000 | [diff] [blame] | 147 |  | 
 | 148 |     The code in socketmodule.c defines this struct (which currently | 
 | 149 |     only contains the type object reference, but could very | 
 | 150 |     well also include other C APIs needed by other modules) | 
| Benjamin Peterson | b173f78 | 2009-05-05 22:31:58 +0000 | [diff] [blame] | 151 |     and exports it as PyCapsule via the module dictionary | 
| Marc-André Lemburg | 666e70d | 2002-02-25 14:45:40 +0000 | [diff] [blame] | 152 |     under the name "CAPI". | 
 | 153 |  | 
 | 154 |     Other modules can now include the socketmodule.h file | 
 | 155 |     which defines the needed C APIs to import and set up | 
 | 156 |     a static copy of this struct in the importing module. | 
 | 157 |  | 
 | 158 |     After initialization, the importing module can then | 
 | 159 |     access the C APIs from the _socket module by simply | 
 | 160 |     referring to the static struct, e.g. | 
 | 161 |  | 
 | 162 |     Load _socket module and its C API; this sets up the global | 
 | 163 |     PySocketModule: | 
 | 164 |      | 
 | 165 | 	if (PySocketModule_ImportModuleAndAPI()) | 
 | 166 | 	    return; | 
 | 167 |  | 
 | 168 |  | 
 | 169 |     Now use the C API as if it were defined in the using | 
 | 170 |     module: | 
 | 171 |  | 
 | 172 |         if (!PyArg_ParseTuple(args, "O!|zz:ssl", | 
 | 173 |  | 
 | 174 | 			      PySocketModule.Sock_Type, | 
 | 175 |  | 
 | 176 | 			      (PyObject*)&Sock, | 
 | 177 | 			      &key_file, &cert_file)) | 
 | 178 | 	    return NULL; | 
 | 179 |  | 
 | 180 |     Support could easily be extended to export more C APIs/symbols | 
 | 181 |     this way. Currently, only the type object is exported,  | 
 | 182 |     other candidates would be socket constructors and socket | 
 | 183 |     access functions. | 
 | 184 |  | 
 | 185 | */ | 
 | 186 |  | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 187 | /* C API for usage by other Python modules */ | 
 | 188 | typedef struct { | 
| Tim Peters | 6f5505a | 2002-02-17 03:58:51 +0000 | [diff] [blame] | 189 | 	PyTypeObject *Sock_Type; | 
| Brett Cannon | 06c3479 | 2004-03-23 23:16:54 +0000 | [diff] [blame] | 190 |         PyObject *error; | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 191 | } PySocketModule_APIObject; | 
| Tim Peters | 6f5505a | 2002-02-17 03:58:51 +0000 | [diff] [blame] | 192 |  | 
| Benjamin Peterson | 81c447f | 2009-05-06 02:43:58 +0000 | [diff] [blame] | 193 | #define PySocketModule_ImportModuleAndAPI() PyCapsule_Import(PySocket_CAPSULE_NAME, 1) | 
| Marc-André Lemburg | 666e70d | 2002-02-25 14:45:40 +0000 | [diff] [blame] | 194 |  | 
| Benjamin Peterson | 2349020 | 2009-08-12 18:11:03 +0000 | [diff] [blame] | 195 | #ifdef __cplusplus | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 196 | } | 
 | 197 | #endif | 
 | 198 | #endif /* !Py__SOCKET_H */ |