blob: 25912a4e6bdbf6e6e46566efa29d8c351a91415c [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003/* SSL support based on patches by Brian E Gallew and Laszlo Kovacs */
4
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005/*
6This module provides an interface to Berkeley socket IPC.
7
8Limitations:
9
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000010- only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Jeremy Hylton22308652001-02-02 03:23:09 +000011 portable manner, though AF_PACKET is supported under Linux.
Guido van Rossum384ca9c2001-10-27 22:20:47 +000012- no read/write operations (use sendall/recv or makefile instead)
13- additional restrictions apply on Windows (compensated for by socket.py)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000014
Guido van Rossum27e177d1995-03-16 15:43:47 +000015Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000016
Guido van Rossum27e177d1995-03-16 15:43:47 +000017- socket.error: exception raised for socket specific errors
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000018- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
19 a subclass of socket.error
20- socket.herror: exception raised for gethostby* errors,
21 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000022- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000023- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000024- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000025- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000026- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000027- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000028- socket.ntohs(16 bit value) --> new int object
29- socket.ntohl(32 bit value) --> new int object
30- socket.htons(16 bit value) --> new int object
31- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000032- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
33 --> List of (family, socktype, proto, canonname, sockaddr)
34- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000035- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +000036- socket.inet_aton(IP address) -> 32-bit packed IP representation
37- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum09c8b6c1999-12-07 21:37:17 +000038- socket.ssl(socket, keyfile, certfile) -> new ssl object
Guido van Rossum6574b3e1991-06-25 21:36:08 +000039- an Internet socket address is a pair (hostname, port)
40 where hostname can be anything recognized by gethostbyname()
41 (including the dd.dd.dd.dd notation) and port is in host byte order
42- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000043- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000044- an AF_PACKET socket address is a tuple containing a string
45 specifying the ethernet interface and an integer specifying
46 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000047 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
48 specify packet-type and ha-type/addr -- these are ignored by
Jeremy Hylton22308652001-02-02 03:23:09 +000049 networking code, but accepted since they are returned by the
50 getsockname() method.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000051
Guido van Rossum30a685f1991-06-27 15:51:29 +000052Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000053
Guido van Rossum81194471991-07-27 21:42:02 +000054- s.accept() --> new socket object, sockaddr
Fred Drake728819a2000-07-01 03:40:12 +000055- s.bind(sockaddr) --> None
Guido van Rossum27e177d1995-03-16 15:43:47 +000056- s.close() --> None
Fred Drake728819a2000-07-01 03:40:12 +000057- s.connect(sockaddr) --> None
58- s.connect_ex(sockaddr) --> 0 or errno (handy for e.g. async connect)
Guido van Rossum27e177d1995-03-16 15:43:47 +000059- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000060- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000061- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000062- s.getsockname() --> sockaddr
63- s.getsockopt(level, optname[, buflen]) --> int or string
64- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000065- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000066- s.recv(buflen [,flags]) --> string
67- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000068- s.send(string [,flags]) --> nbytes
Guido van Rossum9f7a5392001-10-26 03:25:00 +000069- s.sendall(string [,flags]) # tries to send everything in a loop
Guido van Rossumb6775db1994-08-01 11:34:53 +000070- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000071- s.setblocking(0 | 1) --> None
72- s.setsockopt(level, optname, value) --> None
73- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000074- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000075
Guido van Rossum6574b3e1991-06-25 21:36:08 +000076*/
77
Guido van Rossum73624e91994-10-10 17:59:00 +000078#include "Python.h"
Guido van Rossum3baaa131999-03-22 21:44:51 +000079
Guido van Rossum384ca9c2001-10-27 22:20:47 +000080/* XXX This is a terrible mess of of platform-dependent preprocessor hacks.
81 I hope some day someone can clean this up please... */
82
Guido van Rossum9376b741999-09-15 22:01:40 +000083/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
84 script doesn't get this right, so we hardcode some platform checks below.
85 On the other hand, not all Linux versions agree, so there the settings
86 computed by the configure script are needed! */
87
88#ifndef linux
Guido van Rossume7de2061999-03-24 17:24:33 +000089#undef HAVE_GETHOSTBYNAME_R_3_ARG
90#undef HAVE_GETHOSTBYNAME_R_5_ARG
91#undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +000092#endif
Guido van Rossume7de2061999-03-24 17:24:33 +000093
Guido van Rossum7a122991999-04-13 04:07:32 +000094#ifndef WITH_THREAD
95#undef HAVE_GETHOSTBYNAME_R
96#endif
97
Guido van Rossume7de2061999-03-24 17:24:33 +000098#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +000099#if defined(_AIX) || defined(__osf__)
Guido van Rossume7de2061999-03-24 17:24:33 +0000100#define HAVE_GETHOSTBYNAME_R_3_ARG
Martin v. Löwis1c07b4b2001-10-13 09:00:42 +0000101#elif defined(__sun) || defined(__sgi)
Guido van Rossume7de2061999-03-24 17:24:33 +0000102#define HAVE_GETHOSTBYNAME_R_5_ARG
103#elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000104/* Rely on the configure script */
Guido van Rossume7de2061999-03-24 17:24:33 +0000105#else
106#undef HAVE_GETHOSTBYNAME_R
107#endif
108#endif
109
Guido van Rossum3baaa131999-03-22 21:44:51 +0000110#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
111#define USE_GETHOSTBYNAME_LOCK
112#endif
113
114#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum49b56061998-10-01 20:42:43 +0000115#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000116#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000117
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000118#if defined(PYCC_VACPP)
119#include <types.h>
120#include <io.h>
121#include <sys/ioctl.h>
122#include <utils.h>
123#include <ctype.h>
124#endif
125
126#if defined(PYOS_OS2)
127#define INCL_DOS
128#define INCL_DOSERRORS
129#define INCL_NOPMAPI
130#include <os2.h>
131#endif
132
Guido van Rossum48a680c2001-03-02 06:34:14 +0000133
Guido van Rossumb6775db1994-08-01 11:34:53 +0000134#include <sys/types.h>
Guido van Rossumed233a51992-06-23 09:07:03 +0000135
Guido van Rossum81194471991-07-27 21:42:02 +0000136#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000137#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000138#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000139#include <sys/socket.h>
140#include <netinet/in.h>
Tim Peters603c6832001-11-05 02:45:59 +0000141#if !(defined(__BEOS__) || defined(__CYGWIN__) || (defined(PYOS_OS2) && defined(PYCC_VACPP)))
Andrew M. Kuchling52a644c2000-03-31 17:24:30 +0000142#include <netinet/tcp.h>
Fred Drake11b09362000-05-16 13:30:12 +0000143#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000144
Guido van Rossum9376b741999-09-15 22:01:40 +0000145/* Headers needed for inet_ntoa() and inet_addr() */
146#ifdef __BEOS__
147#include <net/netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000148#elif defined(PYOS_OS2) && defined(PYCC_VACPP)
149#include <netdb.h>
150typedef size_t socklen_t;
Guido van Rossum9376b741999-09-15 22:01:40 +0000151#else
Guido van Rossumff3ab422000-04-24 15:16:03 +0000152#ifndef USE_GUSI1
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000153#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000154#endif
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000155#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000156
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000157#ifndef RISCOS
Guido van Rossume4485b01994-09-07 14:32:49 +0000158#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000159#else
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000160#include <sys/fcntl.h>
161#define NO_DUP
162int h_errno; /* not used */
163#endif
164#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000165#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000166#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000167#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000168
Guido van Rossum48a680c2001-03-02 06:34:14 +0000169
Guido van Rossumb6775db1994-08-01 11:34:53 +0000170#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000171#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000172#else
173#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000174#endif
175
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000176#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000177#include <sys/ioctl.h>
178#include <net/if.h>
179#include <netpacket/packet.h>
180#endif
181
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000182#ifdef HAVE_STDDEF_H
183#include <stddef.h>
184#endif
185
186#ifndef offsetof
187#define offsetof(type, member) ((size_t)(&((type *)0)->member))
188#endif
189
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000190#ifndef O_NDELAY
191#define O_NDELAY O_NONBLOCK /* For QNX only? */
192#endif
193
Guido van Rossumff3ab422000-04-24 15:16:03 +0000194#ifdef USE_GUSI1
Jack Jansen508537b1996-02-14 15:57:45 +0000195/* fdopen() isn't declared in stdio.h (sigh) */
196#include <GUSI.h>
197#endif
198
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000199#include "addrinfo.h"
200
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000201#ifdef USE_SSL
Andrew M. Kuchling697a0b02001-01-18 17:41:41 +0000202#include "openssl/rsa.h"
203#include "openssl/crypto.h"
204#include "openssl/x509.h"
205#include "openssl/pem.h"
206#include "openssl/ssl.h"
207#include "openssl/err.h"
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +0000208#include "openssl/rand.h"
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000209#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000210
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000211#ifndef HAVE_INET_PTON
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000212int inet_pton (int af, const char *src, void *dst);
213const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000214#endif
215
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000216#ifdef __APPLE__
217/* On OS X, getaddrinfo returns no error indication of lookup
218 failure, so we must use the emulation instead of the libinfo
219 implementation. Unfortunately, performing an autoconf test
220 for this bug would require DNS access for the machine performing
221 the configuration, which is not acceptable. Therefore, we
222 determine the bug just by checking for __APPLE__. If this bug
223 gets ever fixed, perhaps checking for sys/version.h would be
224 appropriate, which is 10/0 on the system with the bug. */
225#undef HAVE_GETADDRINFO
226/* avoid clashes with the C library definition of the symbol. */
227#define getaddrinfo fake_getaddrinfo
228#endif
229
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000230/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000231#if !defined(HAVE_GETADDRINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000232#include "getaddrinfo.c"
233#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000234#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000235#include "getnameinfo.c"
236#endif
237
Guido van Rossumbcc20741998-08-04 22:53:56 +0000238#if defined(MS_WINDOWS) || defined(__BEOS__)
239/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000240/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000241#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000242#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000243#endif
244
Fred Drakea04eaad2000-06-30 02:46:07 +0000245/* abstract the socket file descriptor type */
246#ifdef MS_WINDOWS
247typedef SOCKET SOCKET_T;
248# ifdef MS_WIN64
249# define SIZEOF_SOCKET_T 8
250# else
251# define SIZEOF_SOCKET_T 4
252# endif
253#else
254typedef int SOCKET_T;
255# define SIZEOF_SOCKET_T SIZEOF_INT
256#endif
257
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000258#ifdef MS_WIN32
259# define EAFNOSUPPORT WSAEAFNOSUPPORT
260# define snprintf _snprintf
261#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000262
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000263#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000264#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000265#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000266#endif
267
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000268#ifndef SOCKETCLOSE
269#define SOCKETCLOSE close
270#endif
271
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000272
273/* XXX There's a problem here: *static* functions are not supposed to have
274 a Py prefix (or use CapitalizedWords). Later... */
275
Guido van Rossum30a685f1991-06-27 15:51:29 +0000276/* Global variable holding the exception type for errors detected
277 by this module (but not argument type or memory errors, etc.). */
278
Guido van Rossum73624e91994-10-10 17:59:00 +0000279static PyObject *PySocket_Error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000280static PyObject *PyH_Error;
281static PyObject *PyGAI_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000282
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000283#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000284static PyObject *PySSLErrorObject;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000285#endif /* USE_SSL */
286
Guido van Rossum30a685f1991-06-27 15:51:29 +0000287
Guido van Rossum48a680c2001-03-02 06:34:14 +0000288#ifdef RISCOS
289/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
290static int taskwindow;
291#endif
292
293
Guido van Rossum30a685f1991-06-27 15:51:29 +0000294/* Convenience function to raise an error according to errno
295 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000296
Guido van Rossum73624e91994-10-10 17:59:00 +0000297static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000298PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000299{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000300#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000301 int err_no = WSAGetLastError();
302 if (err_no) {
303 static struct { int no; const char *msg; } *msgp, msgs[] = {
304 { WSAEINTR, "Interrupted system call" },
305 { WSAEBADF, "Bad file descriptor" },
306 { WSAEACCES, "Permission denied" },
307 { WSAEFAULT, "Bad address" },
308 { WSAEINVAL, "Invalid argument" },
309 { WSAEMFILE, "Too many open files" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000310 { WSAEWOULDBLOCK,
Mark Hammond46a733d2000-07-24 01:45:11 +0000311 "The socket operation could not complete "
312 "without blocking" },
313 { WSAEINPROGRESS, "Operation now in progress" },
314 { WSAEALREADY, "Operation already in progress" },
315 { WSAENOTSOCK, "Socket operation on non-socket" },
316 { WSAEDESTADDRREQ, "Destination address required" },
317 { WSAEMSGSIZE, "Message too long" },
318 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
319 { WSAENOPROTOOPT, "Protocol not available" },
320 { WSAEPROTONOSUPPORT, "Protocol not supported" },
321 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
322 { WSAEOPNOTSUPP, "Operation not supported" },
323 { WSAEPFNOSUPPORT, "Protocol family not supported" },
324 { WSAEAFNOSUPPORT, "Address family not supported" },
325 { WSAEADDRINUSE, "Address already in use" },
326 { WSAEADDRNOTAVAIL,
327 "Can't assign requested address" },
328 { WSAENETDOWN, "Network is down" },
329 { WSAENETUNREACH, "Network is unreachable" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000330 { WSAENETRESET,
Mark Hammond46a733d2000-07-24 01:45:11 +0000331 "Network dropped connection on reset" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000332 { WSAECONNABORTED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000333 "Software caused connection abort" },
334 { WSAECONNRESET, "Connection reset by peer" },
335 { WSAENOBUFS, "No buffer space available" },
336 { WSAEISCONN, "Socket is already connected" },
337 { WSAENOTCONN, "Socket is not connected" },
338 { WSAESHUTDOWN, "Can't send after socket shutdown" },
339 { WSAETOOMANYREFS,
340 "Too many references: can't splice" },
341 { WSAETIMEDOUT, "Operation timed out" },
342 { WSAECONNREFUSED, "Connection refused" },
343 { WSAELOOP, "Too many levels of symbolic links" },
344 { WSAENAMETOOLONG, "File name too long" },
345 { WSAEHOSTDOWN, "Host is down" },
346 { WSAEHOSTUNREACH, "No route to host" },
347 { WSAENOTEMPTY, "Directory not empty" },
348 { WSAEPROCLIM, "Too many processes" },
349 { WSAEUSERS, "Too many users" },
350 { WSAEDQUOT, "Disc quota exceeded" },
351 { WSAESTALE, "Stale NFS file handle" },
352 { WSAEREMOTE, "Too many levels of remote in path" },
353 { WSASYSNOTREADY,
354 "Network subsystem is unvailable" },
355 { WSAVERNOTSUPPORTED,
356 "WinSock version is not supported" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000357 { WSANOTINITIALISED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000358 "Successful WSAStartup() not yet performed" },
359 { WSAEDISCON, "Graceful shutdown in progress" },
360 /* Resolver errors */
361 { WSAHOST_NOT_FOUND, "No such host is known" },
362 { WSATRY_AGAIN, "Host not found, or server failed" },
363 { WSANO_RECOVERY,
364 "Unexpected server error encountered" },
365 { WSANO_DATA, "Valid name without requested data" },
366 { WSANO_ADDRESS, "No address, look for MX record" },
367 { 0, NULL }
368 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000369 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000370 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000371
Mark Hammond46a733d2000-07-24 01:45:11 +0000372 for (msgp = msgs; msgp->msg; msgp++) {
373 if (err_no == msgp->no) {
374 msg = msgp->msg;
375 break;
376 }
377 }
378
379 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000380 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000381 PyErr_SetObject(PySocket_Error, v);
382 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000383 }
384 return NULL;
385 }
386 else
387#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000388
389#if defined(PYOS_OS2)
390 if (sock_errno() != NO_ERROR) {
391 APIRET rc;
392 ULONG msglen;
393 char outbuf[100];
394 int myerrorcode = sock_errno();
395
396 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
397 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
398 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
399 if (rc == NO_ERROR) {
400 PyObject *v;
401
402 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
403 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
404 char *lastc = &outbuf[ strlen(outbuf)-1 ];
405 while (lastc > outbuf && isspace(*lastc))
406 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
407 }
408 v = Py_BuildValue("(is)", myerrorcode, outbuf);
409 if (v != NULL) {
410 PyErr_SetObject(PySocket_Error, v);
411 Py_DECREF(v);
412 }
413 return NULL;
414 }
415 }
416#endif
417
Guido van Rossum73624e91994-10-10 17:59:00 +0000418 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000419}
420
Guido van Rossum30a685f1991-06-27 15:51:29 +0000421
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000422static PyObject *
423PyH_Err(int h_error)
424{
425 PyObject *v;
426
427#ifdef HAVE_HSTRERROR
428 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
429#else
430 v = Py_BuildValue("(is)", h_error, "host not found");
431#endif
432 if (v != NULL) {
Martin v. Löwis864e9ff2001-08-04 22:32:03 +0000433 PyErr_SetObject(PyH_Error, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000434 Py_DECREF(v);
435 }
436
437 return NULL;
438}
439
440
441static PyObject *
442PyGAI_Err(int error)
443{
444 PyObject *v;
445
446 if (error == EAI_SYSTEM)
447 return PySocket_Err();
448
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000449#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000450 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000451#else
452 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
453#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000454 if (v != NULL) {
455 PyErr_SetObject(PyGAI_Error, v);
456 Py_DECREF(v);
457 }
458
459 return NULL;
460}
461
462
Guido van Rossum30a685f1991-06-27 15:51:29 +0000463/* The object holding a socket. It holds some extra information,
464 like the address family, which is used to decode socket address
465 arguments properly. */
466
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000467typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000468 PyObject_HEAD
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000469 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000470 int sock_family; /* Address family, e.g., AF_INET */
471 int sock_type; /* Socket type, e.g., SOCK_STREAM */
472 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000473 union sock_addr {
474 struct sockaddr_in in;
475#ifdef AF_UNIX
476 struct sockaddr_un un;
477#endif
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000478#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000479 struct sockaddr_in6 in6;
480 struct sockaddr_storage storage;
481#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000482#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000483 struct sockaddr_ll ll;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000484#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000485 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000486} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000487
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000488#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000489
Jeremy Hyltonba699362001-10-11 17:23:34 +0000490#define X509_NAME_MAXLEN 256
491
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000492typedef struct {
493 PyObject_HEAD
494 PySocketSockObject *Socket; /* Socket on which we're layered */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000495 SSL_CTX* ctx;
496 SSL* ssl;
497 X509* server_cert;
498 BIO* sbio;
Jeremy Hyltonba699362001-10-11 17:23:34 +0000499 char server[X509_NAME_MAXLEN];
500 char issuer[X509_NAME_MAXLEN];
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000501
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000502} PySSLObject;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000503
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000504staticforward PyTypeObject PySSL_Type;
505staticforward PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args);
506staticforward PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000507
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000508#define PySSLObject_Check(v) ((v)->ob_type == &PySSL_Type)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000509
510#endif /* USE_SSL */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000511
Guido van Rossum30a685f1991-06-27 15:51:29 +0000512/* A forward reference to the Socktype type object.
513 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000514 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000515 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000516
Guido van Rossum73624e91994-10-10 17:59:00 +0000517staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000518
Guido van Rossum30a685f1991-06-27 15:51:29 +0000519
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000520/* Initialize a new socket object. */
521
522static void
523init_sockobject(PySocketSockObject *s,
524 SOCKET_T fd, int family, int type, int proto)
525{
526#ifdef RISCOS
527 int block = 1;
528#endif
529 s->sock_fd = fd;
530 s->sock_family = family;
531 s->sock_type = type;
532 s->sock_proto = proto;
533#ifdef RISCOS
534 if(taskwindow) {
535 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
536 }
537#endif
538}
539
540
Guido van Rossum30a685f1991-06-27 15:51:29 +0000541/* Create a new socket object.
542 This just creates the object and initializes it.
543 If the creation fails, return NULL and set an exception (implicit
544 in NEWOBJ()). */
545
Guido van Rossum73624e91994-10-10 17:59:00 +0000546static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000547PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000548{
Guido van Rossum73624e91994-10-10 17:59:00 +0000549 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000550 s = (PySocketSockObject *)
551 PyType_GenericNew(&PySocketSock_Type, NULL, NULL);
552 if (s != NULL)
553 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000554 return s;
555}
556
Guido van Rossum30a685f1991-06-27 15:51:29 +0000557
Guido van Rossum48a680c2001-03-02 06:34:14 +0000558/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000559 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000560#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000561PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000562#endif
563
564
Guido van Rossum30a685f1991-06-27 15:51:29 +0000565/* Convert a string specifying a host name or one of a few symbolic
566 names to a numeric IP address. This usually calls gethostbyname()
567 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000568 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000569 an error occurred; then an exception is raised. */
570
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000571static int
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000572setipaddr(char* name, struct sockaddr * addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000573{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000574 struct addrinfo hints, *res;
575 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000576
Guido van Rossuma376cc51996-12-05 23:43:35 +0000577 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000578 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000579 int siz;
580 memset(&hints, 0, sizeof(hints));
581 hints.ai_family = af;
582 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
583 hints.ai_flags = AI_PASSIVE;
584 error = getaddrinfo(NULL, "0", &hints, &res);
585 if (error) {
586 PyGAI_Err(error);
587 return -1;
588 }
589 switch (res->ai_family) {
590 case AF_INET:
591 siz = 4;
592 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000593#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000594 case AF_INET6:
595 siz = 16;
596 break;
597#endif
598 default:
599 freeaddrinfo(res);
600 PyErr_SetString(PySocket_Error,
601 "unsupported address family");
602 return -1;
603 }
604 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000605 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000606 PyErr_SetString(PySocket_Error,
607 "wildcard resolved to multiple address");
608 return -1;
609 }
610 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
611 freeaddrinfo(res);
612 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000613 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000614 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000615 struct sockaddr_in *sin;
616 if (af != PF_INET && af != PF_UNSPEC) {
617 PyErr_SetString(PySocket_Error,
618 "address family mismatched");
619 return -1;
620 }
621 sin = (struct sockaddr_in *)addr_ret;
622 memset((void *) sin, '\0', sizeof(*sin));
623 sin->sin_family = AF_INET;
624#ifdef HAVE_SOCKADDR_SA_LEN
625 sin->sin_len = sizeof(*sin);
626#endif
627 sin->sin_addr.s_addr = INADDR_BROADCAST;
628 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000629 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000630 memset(&hints, 0, sizeof(hints));
631 hints.ai_family = af;
632 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000633#if defined(__digital__) && defined(__unix__)
Martin v. Löwisb8fc9722001-10-24 17:35:46 +0000634 if (error == EAI_NONAME && af == AF_UNSPEC) {
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000635 /* On Tru64 V5.1, numeric-to-addr conversion
Martin v. Löwis861a65b2001-10-24 14:36:00 +0000636 fails if no address family is given. Assume IPv4 for now.*/
637 hints.ai_family = AF_INET;
638 error = getaddrinfo(name, NULL, &hints, &res);
639 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000640#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000641 if (error) {
642 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000643 return -1;
644 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000645 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
646 freeaddrinfo(res);
647 switch (addr_ret->sa_family) {
648 case AF_INET:
649 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000650#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000651 case AF_INET6:
652 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000653#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000654 default:
655 PyErr_SetString(PySocket_Error, "unknown address family");
656 return -1;
657 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000658}
659
Guido van Rossum30a685f1991-06-27 15:51:29 +0000660
Guido van Rossum30a685f1991-06-27 15:51:29 +0000661/* Create a string object representing an IP address.
662 This is always a string of the form 'dd.dd.dd.dd' (with variable
663 size numbers). */
664
Guido van Rossum73624e91994-10-10 17:59:00 +0000665static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000666makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000667{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000668 char buf[NI_MAXHOST];
669 int error;
670
671 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
672 NI_NUMERICHOST);
673 if (error) {
674 PyGAI_Err(error);
675 return NULL;
676 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000677 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000678}
679
680
681/* Create an object representing the given socket address,
682 suitable for passing it back to bind(), connect() etc.
683 The family field of the sockaddr structure is inspected
684 to determine what kind of address it really is. */
685
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000686/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000687static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000688makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000689{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000690 if (addrlen == 0) {
691 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000692 Py_INCREF(Py_None);
693 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000694 }
695
Guido van Rossumbcc20741998-08-04 22:53:56 +0000696#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000697 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000698 addr->sa_family = AF_INET;
699#endif
700
Guido van Rossum30a685f1991-06-27 15:51:29 +0000701 switch (addr->sa_family) {
702
703 case AF_INET:
704 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000705 struct sockaddr_in *a;
706 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000707 PyObject *ret = NULL;
708 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000709 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000710 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
711 Py_DECREF(addrobj);
712 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000713 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000714 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000715
Guido van Rossumb6775db1994-08-01 11:34:53 +0000716#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000717 case AF_UNIX:
718 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000719 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000720 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000721 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000722#endif /* AF_UNIX */
723
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000724#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000725 case AF_INET6:
726 {
727 struct sockaddr_in6 *a;
728 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
729 PyObject *ret = NULL;
730 if (addrobj) {
731 a = (struct sockaddr_in6 *)addr;
732 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
733 a->sin6_flowinfo, a->sin6_scope_id);
734 Py_DECREF(addrobj);
735 }
736 return ret;
737 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000738#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000739
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000740#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000741 case AF_PACKET:
742 {
743 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
744 char *ifname = "";
745 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000746 /* need to look up interface name give index */
747 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000748 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000749 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000750 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000751 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000752 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000753 a->sll_pkttype, a->sll_hatype,
754 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000755 }
756#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000757
Guido van Rossum30a685f1991-06-27 15:51:29 +0000758 /* More cases here... */
759
760 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000761 /* If we don't know the address family, don't raise an
762 exception -- return it as a tuple. */
763 return Py_BuildValue("is#",
764 addr->sa_family,
765 addr->sa_data,
766 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000767
Guido van Rossum30a685f1991-06-27 15:51:29 +0000768 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000769}
770
Guido van Rossum30a685f1991-06-27 15:51:29 +0000771
772/* Parse a socket address argument according to the socket object's
773 address family. Return 1 if the address was in the proper format,
774 0 of not. The address is returned through addr_ret, its length
775 through len_ret. */
776
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000777static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000778getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000779 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000780{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000781 switch (s->sock_family) {
782
Guido van Rossumb6775db1994-08-01 11:34:53 +0000783#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000784 case AF_UNIX:
785 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000786 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000787 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000788 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000789 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000790 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000791 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000792 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000793 PyErr_SetString(PySocket_Error,
794 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000795 return 0;
796 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000797 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000798 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000799 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000800 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000801 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000802 return 1;
803 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000804#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000805
Guido van Rossum30a685f1991-06-27 15:51:29 +0000806 case AF_INET:
807 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000808 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000809 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000810 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000811 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000812 if (!PyTuple_Check(args)) {
813 PyErr_Format(PyExc_TypeError,
814 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
815 args->ob_type->tp_name);
816 return 0;
817 }
818 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000819 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000820 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000821 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000822 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000823 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000824 *addr_ret = (struct sockaddr *) addr;
825 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000826 return 1;
827 }
828
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000829#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000830 case AF_INET6:
831 {
832 struct sockaddr_in6* addr;
833 char *host;
834 int port, flowinfo, scope_id;
835 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
836 flowinfo = scope_id = 0;
837 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
838 &scope_id)) {
839 return 0;
840 }
841 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
842 return 0;
843 addr->sin6_family = s->sock_family;
844 addr->sin6_port = htons((short)port);
845 addr->sin6_flowinfo = flowinfo;
846 addr->sin6_scope_id = scope_id;
847 *addr_ret = (struct sockaddr *) addr;
848 *len_ret = sizeof *addr;
849 return 1;
850 }
851#endif
852
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000853#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000854 case AF_PACKET:
855 {
856 struct sockaddr_ll* addr;
857 struct ifreq ifr;
858 char *interfaceName;
859 int protoNumber;
860 int hatype = 0;
861 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000862 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000863
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000864 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
865 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000866 return 0;
867 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
868 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000869 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +0000870 PySocket_Err();
Jeremy Hylton22308652001-02-02 03:23:09 +0000871 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000872 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000873 addr = &(s->sock_addr.ll);
874 addr->sll_family = AF_PACKET;
875 addr->sll_protocol = htons((short)protoNumber);
876 addr->sll_ifindex = ifr.ifr_ifindex;
877 addr->sll_pkttype = pkttype;
878 addr->sll_hatype = hatype;
879 *addr_ret = (struct sockaddr *) addr;
880 *len_ret = sizeof *addr;
881 return 1;
882 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000883#endif
884
Guido van Rossum30a685f1991-06-27 15:51:29 +0000885 /* More cases here... */
886
887 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000888 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000889 return 0;
890
891 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000892}
893
Guido van Rossum30a685f1991-06-27 15:51:29 +0000894
Guido van Rossum48a680c2001-03-02 06:34:14 +0000895/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000896 Return 1 if the family is known, 0 otherwise. The length is returned
897 through len_ret. */
898
899static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000900getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000901{
902 switch (s->sock_family) {
903
Guido van Rossumb6775db1994-08-01 11:34:53 +0000904#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000905 case AF_UNIX:
906 {
907 *len_ret = sizeof (struct sockaddr_un);
908 return 1;
909 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000910#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000911
912 case AF_INET:
913 {
914 *len_ret = sizeof (struct sockaddr_in);
915 return 1;
916 }
917
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000918#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000919 case AF_INET6:
920 {
921 *len_ret = sizeof (struct sockaddr_in6);
922 return 1;
923 }
924#endif
925
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000926#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000927 case AF_PACKET:
928 {
929 *len_ret = sizeof (struct sockaddr_ll);
930 return 1;
931 }
932#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000933
Guido van Rossum710e1df1992-06-12 10:39:36 +0000934 /* More cases here... */
935
936 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000937 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000938 return 0;
939
940 }
941}
942
943
Guido van Rossum30a685f1991-06-27 15:51:29 +0000944/* s.accept() method */
945
Guido van Rossum73624e91994-10-10 17:59:00 +0000946static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000947PySocketSock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000948{
949 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000950 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000951 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000952 PyObject *sock = NULL;
953 PyObject *addr = NULL;
954 PyObject *res = NULL;
955
Guido van Rossum710e1df1992-06-12 10:39:36 +0000956 if (!getsockaddrlen(s, &addrlen))
957 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000958 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000959 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000960 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000961 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000962#ifdef MS_WINDOWS
963 if (newfd == INVALID_SOCKET)
964#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000965 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000966#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000967 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000968
Guido van Rossum30a685f1991-06-27 15:51:29 +0000969 /* Create the new object with unspecified family,
970 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000971 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000972 s->sock_family,
973 s->sock_type,
974 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000975 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000976 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000977 goto finally;
978 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000979 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000980 addrlen);
981 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000982 goto finally;
983
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000984 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000985
986 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000987 Py_XDECREF(sock);
988 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000989 return res;
990}
991
Guido van Rossum82a5c661998-07-07 20:45:43 +0000992static char accept_doc[] =
993"accept() -> (socket object, address info)\n\
994\n\
995Wait for an incoming connection. Return a new socket representing the\n\
996connection, and the address of the client. For IP sockets, the address\n\
997info is a pair (hostaddr, port).";
998
Guido van Rossum30a685f1991-06-27 15:51:29 +0000999
Guido van Rossume4485b01994-09-07 14:32:49 +00001000/* s.setblocking(1 | 0) method */
1001
Guido van Rossum73624e91994-10-10 17:59:00 +00001002static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001003PySocketSock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001004{
1005 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001006#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +00001007#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +00001008 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +00001009#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001010#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001011 block = PyInt_AsLong(arg);
1012 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001013 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001014 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +00001015#ifdef __BEOS__
1016 block = !block;
1017 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
1018 (void *)(&block), sizeof( int ) );
1019#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001020#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001021#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001022#ifdef PYOS_OS2
1023 block = !block;
1024 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
1025#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +00001026 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
1027 if (block)
1028 delay_flag &= (~O_NDELAY);
1029 else
1030 delay_flag |= O_NDELAY;
1031 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001032#endif /* !PYOS_OS2 */
1033#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001034 block = !block;
1035 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001036#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +00001037#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001038#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001039 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +00001040
Guido van Rossum73624e91994-10-10 17:59:00 +00001041 Py_INCREF(Py_None);
1042 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001043}
Guido van Rossume4485b01994-09-07 14:32:49 +00001044
Guido van Rossum82a5c661998-07-07 20:45:43 +00001045static char setblocking_doc[] =
1046"setblocking(flag)\n\
1047\n\
1048Set the socket to blocking (flag is true) or non-blocking (false).\n\
1049This uses the FIONBIO ioctl with the O_NDELAY flag.";
1050
Guido van Rossume4485b01994-09-07 14:32:49 +00001051
Guido van Rossum48a680c2001-03-02 06:34:14 +00001052#ifdef RISCOS
1053/* s.sleeptaskw(1 | 0) method */
1054
1055static PyObject *
1056PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
1057{
1058 int block;
1059 int delay_flag;
1060 if (!PyArg_GetInt(args, &block))
1061 return NULL;
1062 Py_BEGIN_ALLOW_THREADS
1063 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1064 Py_END_ALLOW_THREADS
1065
1066 Py_INCREF(Py_None);
1067 return Py_None;
1068}
1069static char sleeptaskw_doc[] =
1070"sleeptaskw(flag)\n\
1071\n\
1072Allow sleeps in taskwindows.";
1073#endif
1074
1075
Guido van Rossumaee08791992-09-08 09:05:33 +00001076/* s.setsockopt() method.
1077 With an integer third argument, sets an integer option.
1078 With a string third argument, sets an option from a buffer;
1079 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001080
Guido van Rossum73624e91994-10-10 17:59:00 +00001081static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001082PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001083{
1084 int level;
1085 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001086 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001087 char *buf;
1088 int buflen;
1089 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001090
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001091 if (PyArg_ParseTuple(args, "iii:setsockopt",
1092 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001093 buf = (char *) &flag;
1094 buflen = sizeof flag;
1095 }
1096 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001097 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001098 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1099 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001100 return NULL;
1101 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001102 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001103 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001104 return PySocket_Err();
1105 Py_INCREF(Py_None);
1106 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001107}
1108
Guido van Rossum82a5c661998-07-07 20:45:43 +00001109static char setsockopt_doc[] =
1110"setsockopt(level, option, value)\n\
1111\n\
1112Set a socket option. See the Unix manual for level and option.\n\
1113The value argument can either be an integer or a string.";
1114
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001115
Guido van Rossumaee08791992-09-08 09:05:33 +00001116/* s.getsockopt() method.
1117 With two arguments, retrieves an integer option.
1118 With a third integer argument, retrieves a string buffer of that size;
1119 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001120
Guido van Rossum73624e91994-10-10 17:59:00 +00001121static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001122PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001123{
1124 int level;
1125 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001126 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001127 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001128 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001129
Guido van Rossumbcc20741998-08-04 22:53:56 +00001130#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001131 /* We have incomplete socket support. */
1132 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001133 return NULL;
1134#else
1135
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001136 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1137 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001138 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001139
Guido van Rossumbe32c891996-06-20 16:25:29 +00001140 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001141 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001142 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001143 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001144 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001145 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001146 return PySocket_Err();
1147 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001148 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001149 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001150 PyErr_SetString(PySocket_Error,
1151 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001152 return NULL;
1153 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001154 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001155 if (buf == NULL)
1156 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001157 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001158 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001159 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001160 Py_DECREF(buf);
1161 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +00001162 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001163 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001164 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001165#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001166}
1167
Guido van Rossum82a5c661998-07-07 20:45:43 +00001168static char getsockopt_doc[] =
1169"getsockopt(level, option[, buffersize]) -> value\n\
1170\n\
1171Get a socket option. See the Unix manual for level and option.\n\
1172If a nonzero buffersize argument is given, the return value is a\n\
1173string of that length; otherwise it is an integer.";
1174
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001175
Fred Drake728819a2000-07-01 03:40:12 +00001176/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001177
Guido van Rossum73624e91994-10-10 17:59:00 +00001178static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001179PySocketSock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001180{
1181 struct sockaddr *addr;
1182 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001183 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001184
Fred Drake728819a2000-07-01 03:40:12 +00001185 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001186 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001187 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001188 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001189 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001190 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001191 return PySocket_Err();
1192 Py_INCREF(Py_None);
1193 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001194}
1195
Guido van Rossum82a5c661998-07-07 20:45:43 +00001196static char bind_doc[] =
1197"bind(address)\n\
1198\n\
1199Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001200pair (host, port); the host must refer to the local host. For raw packet\n\
1201sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001202
Guido van Rossum30a685f1991-06-27 15:51:29 +00001203
1204/* s.close() method.
1205 Set the file descriptor to -1 so operations tried subsequently
1206 will surely fail. */
1207
Guido van Rossum73624e91994-10-10 17:59:00 +00001208static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001209PySocketSock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001210{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001211 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001212
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001213 if ((fd = s->sock_fd) != -1) {
1214 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001215 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001216 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001217 Py_END_ALLOW_THREADS
1218 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001219 Py_INCREF(Py_None);
1220 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001221}
1222
Guido van Rossum82a5c661998-07-07 20:45:43 +00001223static char close_doc[] =
1224"close()\n\
1225\n\
1226Close the socket. It cannot be used after this call.";
1227
Guido van Rossum30a685f1991-06-27 15:51:29 +00001228
Fred Drake728819a2000-07-01 03:40:12 +00001229/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001230
Guido van Rossum73624e91994-10-10 17:59:00 +00001231static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001232PySocketSock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001233{
1234 struct sockaddr *addr;
1235 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001236 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001237
Fred Drake728819a2000-07-01 03:40:12 +00001238 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001239 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001240 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001241 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001242 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001243 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001244 return PySocket_Err();
1245 Py_INCREF(Py_None);
1246 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001247}
1248
Guido van Rossum82a5c661998-07-07 20:45:43 +00001249static char connect_doc[] =
1250"connect(address)\n\
1251\n\
1252Connect the socket to a remote address. For IP sockets, the address\n\
1253is a pair (host, port).";
1254
Guido van Rossum30a685f1991-06-27 15:51:29 +00001255
Fred Drake728819a2000-07-01 03:40:12 +00001256/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001257
1258static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001259PySocketSock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001260{
1261 struct sockaddr *addr;
1262 int addrlen;
1263 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001264
Fred Drake728819a2000-07-01 03:40:12 +00001265 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001266 return NULL;
1267 Py_BEGIN_ALLOW_THREADS
1268 res = connect(s->sock_fd, addr, addrlen);
1269 Py_END_ALLOW_THREADS
Tim Petersc32410a2001-10-30 01:26:49 +00001270 if (res != 0) {
1271#ifdef MS_WINDOWS
1272 res = WSAGetLastError();
1273#else
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001274 res = errno;
Tim Petersc32410a2001-10-30 01:26:49 +00001275#endif
1276 }
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001277 return PyInt_FromLong((long) res);
1278}
1279
Guido van Rossum82a5c661998-07-07 20:45:43 +00001280static char connect_ex_doc[] =
1281"connect_ex(address)\n\
1282\n\
1283This is like connect(address), but returns an error code (the errno value)\n\
1284instead of raising an exception when an error occurs.";
1285
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001286
Guido van Rossumed233a51992-06-23 09:07:03 +00001287/* s.fileno() method */
1288
Guido van Rossum73624e91994-10-10 17:59:00 +00001289static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001290PySocketSock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001291{
Fred Drakea04eaad2000-06-30 02:46:07 +00001292#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001293 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001294#else
1295 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1296#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001297}
1298
Guido van Rossum82a5c661998-07-07 20:45:43 +00001299static char fileno_doc[] =
1300"fileno() -> integer\n\
1301\n\
1302Return the integer file descriptor of the socket.";
1303
Guido van Rossumed233a51992-06-23 09:07:03 +00001304
Guido van Rossumbe32c891996-06-20 16:25:29 +00001305#ifndef NO_DUP
1306/* s.dup() method */
1307
1308static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001309PySocketSock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001310{
Fred Drakea04eaad2000-06-30 02:46:07 +00001311 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001312 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001313
Guido van Rossumbe32c891996-06-20 16:25:29 +00001314 newfd = dup(s->sock_fd);
1315 if (newfd < 0)
1316 return PySocket_Err();
1317 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001318 s->sock_family,
1319 s->sock_type,
1320 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001321 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001322 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001323 return sock;
1324}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001325
1326static char dup_doc[] =
1327"dup() -> socket object\n\
1328\n\
1329Return a new socket object connected to the same system resource.";
1330
Guido van Rossumbe32c891996-06-20 16:25:29 +00001331#endif
1332
1333
Guido van Rossumc89705d1992-11-26 08:54:07 +00001334/* s.getsockname() method */
1335
Guido van Rossum73624e91994-10-10 17:59:00 +00001336static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001337PySocketSock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001338{
1339 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001340 int res;
1341 socklen_t addrlen;
1342
Guido van Rossumc89705d1992-11-26 08:54:07 +00001343 if (!getsockaddrlen(s, &addrlen))
1344 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001345 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001346 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001347 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001348 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001349 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001350 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001351 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001352}
1353
Guido van Rossum82a5c661998-07-07 20:45:43 +00001354static char getsockname_doc[] =
1355"getsockname() -> address info\n\
1356\n\
1357Return the address of the local endpoint. For IP sockets, the address\n\
1358info is a pair (hostaddr, port).";
1359
Guido van Rossumc89705d1992-11-26 08:54:07 +00001360
Guido van Rossumb6775db1994-08-01 11:34:53 +00001361#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001362/* s.getpeername() method */
1363
Guido van Rossum73624e91994-10-10 17:59:00 +00001364static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001365PySocketSock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001366{
1367 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001368 int res;
1369 socklen_t addrlen;
1370
Guido van Rossumc89705d1992-11-26 08:54:07 +00001371 if (!getsockaddrlen(s, &addrlen))
1372 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001373 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001374 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001375 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001376 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001377 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001378 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001379 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001380}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001381
1382static char getpeername_doc[] =
1383"getpeername() -> address info\n\
1384\n\
1385Return the address of the remote endpoint. For IP sockets, the address\n\
1386info is a pair (hostaddr, port).";
1387
Guido van Rossumb6775db1994-08-01 11:34:53 +00001388#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001389
1390
Guido van Rossum30a685f1991-06-27 15:51:29 +00001391/* s.listen(n) method */
1392
Guido van Rossum73624e91994-10-10 17:59:00 +00001393static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001394PySocketSock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001395{
1396 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001397 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001398
1399 backlog = PyInt_AsLong(arg);
1400 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001401 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001402 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001403 if (backlog < 1)
1404 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001405 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001406 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001407 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001408 return PySocket_Err();
1409 Py_INCREF(Py_None);
1410 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001411}
1412
Guido van Rossum82a5c661998-07-07 20:45:43 +00001413static char listen_doc[] =
1414"listen(backlog)\n\
1415\n\
1416Enable a server to accept connections. The backlog argument must be at\n\
1417least 1; it specifies the number of unaccepted connection that the system\n\
1418will allow before refusing new connections.";
1419
1420
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001421#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001422/* s.makefile(mode) method.
1423 Create a new open file object referring to a dupped version of
1424 the socket's file descriptor. (The dup() call is necessary so
1425 that the open file and socket objects may be closed independent
1426 of each other.)
1427 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1428
Guido van Rossum73624e91994-10-10 17:59:00 +00001429static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001430PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001431{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001432 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001433 char *mode = "r";
1434 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001435#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001436 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001437#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001438 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001439#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001440 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001441 PyObject *f;
1442
Guido van Rossum43713e52000-02-29 13:59:29 +00001443 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001444 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001445#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001446 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1447 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001448#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001449 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001450#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001451 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001452 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001453 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001454 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001455 }
1456 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1457 if (f != NULL)
1458 PyFile_SetBufSize(f, bufsize);
1459 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001460}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001461
1462static char makefile_doc[] =
1463"makefile([mode[, buffersize]]) -> file object\n\
1464\n\
1465Return a regular file object corresponding to the socket.\n\
1466The mode and buffersize arguments are as for the built-in open() function.";
1467
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001468#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001469
Guido van Rossum48a680c2001-03-02 06:34:14 +00001470
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001471/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001472
Guido van Rossum73624e91994-10-10 17:59:00 +00001473static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001474PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001475{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001476 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001477 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001478 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001479 return NULL;
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001480 if (len < 0) {
1481 PyErr_SetString(PyExc_ValueError,
1482 "negative buffersize in connect");
1483 return NULL;
1484 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001485 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001486 if (buf == NULL)
1487 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001488 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001489 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001490 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001491 if (n < 0) {
1492 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001493 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001494 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001495 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001496 return NULL;
1497 return buf;
1498}
1499
Guido van Rossum82a5c661998-07-07 20:45:43 +00001500static char recv_doc[] =
1501"recv(buffersize[, flags]) -> data\n\
1502\n\
1503Receive up to buffersize bytes from the socket. For the optional flags\n\
1504argument, see the Unix manual. When no data is available, block until\n\
1505at least one byte is available or until the remote end is closed. When\n\
1506the remote end is closed and all data is read, return the empty string.";
1507
Guido van Rossum30a685f1991-06-27 15:51:29 +00001508
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001509/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001510
Guido van Rossum73624e91994-10-10 17:59:00 +00001511static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001512PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001513{
1514 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001515 PyObject *buf = NULL;
1516 PyObject *addr = NULL;
1517 PyObject *ret = NULL;
1518
Guido van Rossumff3ab422000-04-24 15:16:03 +00001519 int len, n, flags = 0;
1520 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001521 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001522 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001523 if (!getsockaddrlen(s, &addrlen))
1524 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001525 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001526 if (buf == NULL)
1527 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001528 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001529 memset(addrbuf, 0, addrlen);
1530 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001531#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001532#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001533 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001534#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001535 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001536#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001537#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001538 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001539#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001540 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001541 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001542 if (n < 0) {
1543 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001544 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001545 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001546 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001547 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001548
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001549 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001550 goto finally;
1551
Guido van Rossum73624e91994-10-10 17:59:00 +00001552 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001553 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001554 Py_XDECREF(addr);
1555 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001556 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001557}
1558
Guido van Rossum82a5c661998-07-07 20:45:43 +00001559static char recvfrom_doc[] =
1560"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1561\n\
1562Like recv(buffersize, flags) but also return the sender's address info.";
1563
Guido van Rossum30a685f1991-06-27 15:51:29 +00001564
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001565/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001566
Guido van Rossum73624e91994-10-10 17:59:00 +00001567static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001568PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001569{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001570 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001571 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001572 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001573 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001574 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001575 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001576 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001577 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001578 return PySocket_Err();
1579 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001580}
1581
Guido van Rossum82a5c661998-07-07 20:45:43 +00001582static char send_doc[] =
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001583"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001584\n\
1585Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001586argument, see the Unix manual. Return the number of bytes\n\
1587sent; this may be less than len(data) if the network is busy.";
1588
1589
1590/* s.sendall(data [,flags]) method */
1591
1592static PyObject *
1593PySocketSock_sendall(PySocketSockObject *s, PyObject *args)
1594{
1595 char *buf;
1596 int len, n, flags = 0, total = 0;
1597 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1598 return NULL;
1599 Py_BEGIN_ALLOW_THREADS
1600 do {
1601 n = send(s->sock_fd, buf, len, flags);
1602 if (n < 0)
1603 break;
1604 total += n;
1605 buf += n;
1606 len -= n;
1607 } while (len > 0);
1608 Py_END_ALLOW_THREADS
1609 if (n < 0)
1610 return PySocket_Err();
1611 Py_INCREF(Py_None);
1612 return Py_None;
1613}
1614
1615static char sendall_doc[] =
1616"sendall(data[, flags])\n\
1617\n\
1618Send a data string to the socket. For the optional flags\n\
1619argument, see the Unix manual. This calls send() repeatedly\n\
1620until all data is sent. If an error occurs, it's impossible\n\
1621to tell how much data has been sent.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001622
Guido van Rossum30a685f1991-06-27 15:51:29 +00001623
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001624/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001625
Guido van Rossum73624e91994-10-10 17:59:00 +00001626static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001627PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001628{
Guido van Rossum73624e91994-10-10 17:59:00 +00001629 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001630 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001631 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001632 int addrlen, len, n, flags;
1633 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001634 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001635 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001636 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1637 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001638 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001639 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001640 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001641 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001642 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001643 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001644 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001645 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001646 return PySocket_Err();
1647 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001648}
1649
Guido van Rossum82a5c661998-07-07 20:45:43 +00001650static char sendto_doc[] =
1651"sendto(data[, flags], address)\n\
1652\n\
1653Like send(data, flags) but allows specifying the destination address.\n\
1654For IP sockets, the address is a pair (hostaddr, port).";
1655
Guido van Rossum30a685f1991-06-27 15:51:29 +00001656
1657/* s.shutdown(how) method */
1658
Guido van Rossum73624e91994-10-10 17:59:00 +00001659static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001660PySocketSock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001661{
1662 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001663 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001664
1665 how = PyInt_AsLong(arg);
1666 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001667 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001668 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001669 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001670 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001671 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001672 return PySocket_Err();
1673 Py_INCREF(Py_None);
1674 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001675}
1676
Guido van Rossum82a5c661998-07-07 20:45:43 +00001677static char shutdown_doc[] =
1678"shutdown(flag)\n\
1679\n\
1680Shut down the reading side of the socket (flag == 0), the writing side\n\
1681of the socket (flag == 1), or both ends (flag == 2).";
1682
Guido van Rossum30a685f1991-06-27 15:51:29 +00001683
1684/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001685
Guido van Rossum73624e91994-10-10 17:59:00 +00001686static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum17209fc2001-10-15 21:12:54 +00001687 {"accept", (PyCFunction)PySocketSock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001688 accept_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001689 {"bind", (PyCFunction)PySocketSock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001690 bind_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00001691 {"close", (PyCFunction)PySocketSock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001692 close_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001693 {"connect", (PyCFunction)PySocketSock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001694 connect_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001695 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001696 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001697#ifndef NO_DUP
Guido van Rossum17209fc2001-10-15 21:12:54 +00001698 {"dup", (PyCFunction)PySocketSock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001699 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001700#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001701 {"fileno", (PyCFunction)PySocketSock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001702 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001703#ifdef HAVE_GETPEERNAME
Guido van Rossum17209fc2001-10-15 21:12:54 +00001704 {"getpeername", (PyCFunction)PySocketSock_getpeername,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001705 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001706#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001707 {"getsockname", (PyCFunction)PySocketSock_getsockname,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001708 METH_NOARGS, getsockname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001709 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1710 getsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001711 {"listen", (PyCFunction)PySocketSock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001712 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001713#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001714 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1715 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001716#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001717 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1718 recv_doc},
1719 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1720 recvfrom_doc},
1721 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1722 send_doc},
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001723 {"sendall", (PyCFunction)PySocketSock_sendall, METH_VARARGS,
1724 sendall_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001725 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1726 sendto_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001727 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001728 setblocking_doc},
1729 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1730 setsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001731 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001732 shutdown_doc},
1733#ifdef RISCOS
1734 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1735 sleeptaskw_doc},
1736#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001737 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001738};
1739
Guido van Rossum30a685f1991-06-27 15:51:29 +00001740
Guido van Rossum73624e91994-10-10 17:59:00 +00001741/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001742 First close the file description. */
1743
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001744static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001745PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001746{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001747 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001748 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001749 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001750}
1751
Guido van Rossum30a685f1991-06-27 15:51:29 +00001752
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001753static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001754PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001755{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001756 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001757#if SIZEOF_SOCKET_T > SIZEOF_LONG
1758 if (s->sock_fd > LONG_MAX) {
1759 /* this can occur on Win64, and actually there is a special
1760 ugly printf formatter for decimal pointer length integer
1761 printing, only bother if necessary*/
1762 PyErr_SetString(PyExc_OverflowError,
1763 "no printf formatter to display the socket descriptor in decimal");
1764 return NULL;
1765 }
1766#endif
Tim Peters885d4572001-11-28 20:27:42 +00001767 PyOS_snprintf(buf, sizeof(buf),
1768 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1769 (long)s->sock_fd, s->sock_family,
1770 s->sock_type,
1771 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001772 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001773}
1774
1775
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001776/* Create a new, uninitialized socket object. */
1777
1778static PyObject *
1779PySocketSock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1780{
1781 PyObject *new;
1782
1783 new = type->tp_alloc(type, 0);
1784 if (new != NULL)
1785 ((PySocketSockObject *)new)->sock_fd = -1;
1786 return new;
1787}
1788
1789
1790/* Initialize a new socket object. */
1791
1792/*ARGSUSED*/
1793static int
1794PySocketSock_init(PyObject *self, PyObject *args, PyObject *kwds)
1795{
1796 PySocketSockObject *s = (PySocketSockObject *)self;
1797 SOCKET_T fd;
1798 int family = AF_INET, type = SOCK_STREAM, proto = 0;
1799 static char *keywords[] = {"family", "type", "proto", 0};
1800
1801 if (!PyArg_ParseTupleAndKeywords(args, kwds,
1802 "|iii:socket", keywords,
1803 &family, &type, &proto))
1804 return -1;
1805 Py_BEGIN_ALLOW_THREADS
1806 fd = socket(family, type, proto);
1807 Py_END_ALLOW_THREADS
1808#ifdef MS_WINDOWS
1809 if (fd == INVALID_SOCKET)
1810#else
1811 if (fd < 0)
1812#endif
1813 {
1814 PySocket_Err();
1815 return -1;
1816 }
1817 init_sockobject(s, fd, family, type, proto);
1818 /* From now on, ignore SIGPIPE and let the error checking
1819 do the work. */
1820#ifdef SIGPIPE
1821 (void) signal(SIGPIPE, SIG_IGN);
1822#endif
1823 return 0;
1824}
1825
1826
Guido van Rossumb6775db1994-08-01 11:34:53 +00001827/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001828
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001829static char socket_doc[] =
1830"socket([family[, type[, proto]]]) -> socket object\n\
1831\n\
1832Open a socket of the given type. The family argument specifies the\n\
1833address family; it defaults to AF_INET. The type argument specifies\n\
1834whether this is a stream (SOCK_STREAM, this is the default)\n\
1835or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1836specifying the default protocol.\n\
1837\n\
1838A socket represents one endpoint of a network connection.\n\
1839\n\
1840Methods:\n\
1841\n\
1842accept() -- accept a connection, returning new socket and client address\n\
1843bind() -- bind the socket to a local address\n\
1844close() -- close the socket\n\
1845connect() -- connect the socket to a remote address\n\
1846connect_ex() -- connect, return an error code instead of an exception \n\
1847dup() -- return a new socket object identical to the current one (*)\n\
1848fileno() -- return underlying file descriptor\n\
1849getpeername() -- return remote address (*)\n\
1850getsockname() -- return local address\n\
1851getsockopt() -- get socket options\n\
1852listen() -- start listening for incoming connections\n\
Andrew M. Kuchling3072ecd2001-11-28 04:28:31 +00001853makefile() -- return a file object corresponding to the socket (*)\n\
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001854recv() -- receive data\n\
1855recvfrom() -- receive data and sender's address\n\
1856send() -- send data, may not send all of it\n\
1857sendall() -- send all data\n\
1858sendto() -- send data to a given address\n\
1859setblocking() -- set or clear the blocking I/O flag\n\
1860setsockopt() -- set socket options\n\
1861shutdown() -- shut down traffic in one or both directions\n\
1862\n\
1863(*) not available on all platforms!)";
1864
Guido van Rossum73624e91994-10-10 17:59:00 +00001865static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001866 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001867 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00001868 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001869 sizeof(PySocketSockObject), /* tp_basicsize */
1870 0, /* tp_itemsize */
1871 (destructor)PySocketSock_dealloc, /* tp_dealloc */
1872 0, /* tp_print */
1873 0, /* tp_getattr */
1874 0, /* tp_setattr */
1875 0, /* tp_compare */
1876 (reprfunc)PySocketSock_repr, /* tp_repr */
1877 0, /* tp_as_number */
1878 0, /* tp_as_sequence */
1879 0, /* tp_as_mapping */
1880 0, /* tp_hash */
1881 0, /* tp_call */
1882 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001883 0, /* set below */ /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001884 0, /* tp_setattro */
1885 0, /* tp_as_buffer */
1886 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1887 socket_doc, /* tp_doc */
1888 0, /* tp_traverse */
1889 0, /* tp_clear */
1890 0, /* tp_richcompare */
1891 0, /* tp_weaklistoffset */
1892 0, /* tp_iter */
1893 0, /* tp_iternext */
1894 PySocketSock_methods, /* tp_methods */
1895 0, /* tp_members */
1896 0, /* tp_getset */
1897 0, /* tp_base */
1898 0, /* tp_dict */
1899 0, /* tp_descr_get */
1900 0, /* tp_descr_set */
1901 0, /* tp_dictoffset */
1902 PySocketSock_init, /* tp_init */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001903 0, /* set below */ /* tp_alloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001904 PySocketSock_new, /* tp_new */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001905 0, /* set below */ /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001906};
1907
Guido van Rossum30a685f1991-06-27 15:51:29 +00001908
Guido van Rossum81194471991-07-27 21:42:02 +00001909/* Python interface to gethostname(). */
1910
1911/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001912static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001913PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001914{
1915 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001916 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001917 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001918 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001919 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001920 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001921 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001922 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001923 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001924 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001925 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001926}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001927
Guido van Rossum82a5c661998-07-07 20:45:43 +00001928static char gethostname_doc[] =
1929"gethostname() -> string\n\
1930\n\
1931Return the current host name.";
1932
Guido van Rossumff4949e1992-08-05 19:58:53 +00001933
Guido van Rossum30a685f1991-06-27 15:51:29 +00001934/* Python interface to gethostbyname(name). */
1935
1936/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001937static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001938PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001939{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001940 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001941 struct sockaddr_storage addrbuf;
1942
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001943 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001944 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001945 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001946 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001947 return makeipaddr((struct sockaddr *)&addrbuf,
1948 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001949}
1950
Guido van Rossum82a5c661998-07-07 20:45:43 +00001951static char gethostbyname_doc[] =
1952"gethostbyname(host) -> address\n\
1953\n\
1954Return the IP address (a string of the form '255.255.255.255') for a host.";
1955
1956
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001957/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1958
1959static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001960gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001961{
1962 char **pch;
1963 PyObject *rtn_tuple = (PyObject *)NULL;
1964 PyObject *name_list = (PyObject *)NULL;
1965 PyObject *addr_list = (PyObject *)NULL;
1966 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001967
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001968 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001969 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001970#ifndef RISCOS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001971 PyH_Err(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001972#else
1973 PyErr_SetString(PySocket_Error, "host not found");
1974#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001975 return NULL;
1976 }
1977 if (h->h_addrtype != af) {
1978#ifdef HAVE_STRERROR
1979 /* Let's get real error message to return */
1980 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001981#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001982 PyErr_SetString(PySocket_Error,
1983 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001984#endif
1985 return NULL;
1986 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001987 switch (af) {
1988 case AF_INET:
1989 if (alen < sizeof(struct sockaddr_in))
1990 return NULL;
1991 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001992#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001993 case AF_INET6:
1994 if (alen < sizeof(struct sockaddr_in6))
1995 return NULL;
1996 break;
1997#endif
1998 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001999 if ((name_list = PyList_New(0)) == NULL)
2000 goto err;
2001 if ((addr_list = PyList_New(0)) == NULL)
2002 goto err;
2003 for (pch = h->h_aliases; *pch != NULL; pch++) {
2004 int status;
2005 tmp = PyString_FromString(*pch);
2006 if (tmp == NULL)
2007 goto err;
2008 status = PyList_Append(name_list, tmp);
2009 Py_DECREF(tmp);
2010 if (status)
2011 goto err;
2012 }
2013 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2014 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002015 switch (af) {
2016 case AF_INET:
2017 {
2018 struct sockaddr_in sin;
2019 memset(&sin, 0, sizeof(sin));
2020 sin.sin_family = af;
2021#ifdef HAVE_SOCKADDR_SA_LEN
2022 sin.sin_len = sizeof(sin);
2023#endif
2024 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2025 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
2026 if (pch == h->h_addr_list && alen >= sizeof(sin))
2027 memcpy((char *) addr, &sin, sizeof(sin));
2028 break;
2029 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002030#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002031 case AF_INET6:
2032 {
2033 struct sockaddr_in6 sin6;
2034 memset(&sin6, 0, sizeof(sin6));
2035 sin6.sin6_family = af;
2036#ifdef HAVE_SOCKADDR_SA_LEN
2037 sin6.sin6_len = sizeof(sin6);
2038#endif
2039 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2040 tmp = makeipaddr((struct sockaddr *)&sin6,
2041 sizeof(sin6));
2042 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2043 memcpy((char *) addr, &sin6, sizeof(sin6));
2044 break;
2045 }
2046#endif
2047 default: /* can't happen */
2048 PyErr_SetString(PySocket_Error,
2049 "unsupported address family");
2050 return NULL;
2051 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002052 if (tmp == NULL)
2053 goto err;
2054 status = PyList_Append(addr_list, tmp);
2055 Py_DECREF(tmp);
2056 if (status)
2057 goto err;
2058 }
2059 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
2060 err:
2061 Py_XDECREF(name_list);
2062 Py_XDECREF(addr_list);
2063 return rtn_tuple;
2064}
2065
2066
2067/* Python interface to gethostbyname_ex(name). */
2068
2069/*ARGSUSED*/
2070static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002071PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002072{
2073 char *name;
2074 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002075 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002076 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002077 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002078#ifdef HAVE_GETHOSTBYNAME_R
2079 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002080#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2081 struct hostent_data data;
2082#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002083 char buf[16384];
2084 int buf_len = (sizeof buf) - 1;
2085 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002086#endif
2087#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002088 int result;
2089#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002090#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002091
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002092 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002093 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002094 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002095 return NULL;
2096 Py_BEGIN_ALLOW_THREADS
2097#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002098#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002099 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002100#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002101 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002102#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002103 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002104 result = gethostbyname_r(name, &hp_allocated, &data);
2105 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002106#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002107#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002108#ifdef USE_GETHOSTBYNAME_LOCK
2109 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002110#endif
2111 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002112#endif /* HAVE_GETHOSTBYNAME_R */
2113 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002114 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
2115 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
2116 sa = (struct sockaddr*)&addr;
2117 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002118#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002119 PyThread_release_lock(gethostbyname_lock);
2120#endif
2121 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002122}
2123
2124static char ghbn_ex_doc[] =
2125"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2126\n\
2127Return the true host name, a list of aliases, and a list of IP addresses,\n\
2128for a host. The host argument is a string giving a host name or IP number.";
2129
2130
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002131/* Python interface to gethostbyaddr(IP). */
2132
2133/*ARGSUSED*/
2134static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002135PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002136{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002137#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002138 struct sockaddr_storage addr;
2139#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002140 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002141#endif
2142 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002143 char *ip_num;
2144 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002145 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002146#ifdef HAVE_GETHOSTBYNAME_R
2147 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002148#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2149 struct hostent_data data;
2150#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002151 char buf[16384];
2152 int buf_len = (sizeof buf) - 1;
2153 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002154#endif
2155#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002156 int result;
2157#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002158#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002159 char *ap;
2160 int al;
2161 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002162
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002163 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002164 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002165 af = PF_UNSPEC;
2166 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002167 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002168 af = sa->sa_family;
2169 ap = NULL;
2170 al = 0;
2171 switch (af) {
2172 case AF_INET:
2173 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2174 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2175 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002176#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002177 case AF_INET6:
2178 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2179 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2180 break;
2181#endif
2182 default:
2183 PyErr_SetString(PySocket_Error, "unsupported address family");
2184 return NULL;
2185 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002186 Py_BEGIN_ALLOW_THREADS
2187#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002188#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002189 result = gethostbyaddr_r(ap, al, af,
2190 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002191 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002192#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002193 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002194 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002195#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002196 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002197 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002198 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002199#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002200#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002201#ifdef USE_GETHOSTBYNAME_LOCK
2202 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002203#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002204 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002205#endif /* HAVE_GETHOSTBYNAME_R */
2206 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002207 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002208#ifdef USE_GETHOSTBYNAME_LOCK
2209 PyThread_release_lock(gethostbyname_lock);
2210#endif
2211 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002212}
2213
Guido van Rossum82a5c661998-07-07 20:45:43 +00002214static char gethostbyaddr_doc[] =
2215"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2216\n\
2217Return the true host name, a list of aliases, and a list of IP addresses,\n\
2218for a host. The host argument is a string giving a host name or IP number.";
2219
Guido van Rossum30a685f1991-06-27 15:51:29 +00002220
2221/* Python interface to getservbyname(name).
2222 This only returns the port number, since the other info is already
2223 known or not useful (like the list of aliases). */
2224
2225/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002226static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002227PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002228{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002229 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002230 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002231 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002232 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002233 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002234 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002235 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002236 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002237 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002238 return NULL;
2239 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002240 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002241}
2242
Guido van Rossum82a5c661998-07-07 20:45:43 +00002243static char getservbyname_doc[] =
2244"getservbyname(servicename, protocolname) -> integer\n\
2245\n\
2246Return a port number from a service name and protocol name.\n\
2247The protocol name should be 'tcp' or 'udp'.";
2248
Guido van Rossum30a685f1991-06-27 15:51:29 +00002249
Guido van Rossum3901d851996-12-19 16:35:04 +00002250/* Python interface to getprotobyname(name).
2251 This only returns the protocol number, since the other info is
2252 already known or not useful (like the list of aliases). */
2253
2254/*ARGSUSED*/
2255static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002256PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002257{
2258 char *name;
2259 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002260#ifdef __BEOS__
2261/* Not available in BeOS yet. - [cjh] */
2262 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2263 return NULL;
2264#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002265 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002266 return NULL;
2267 Py_BEGIN_ALLOW_THREADS
2268 sp = getprotobyname(name);
2269 Py_END_ALLOW_THREADS
2270 if (sp == NULL) {
2271 PyErr_SetString(PySocket_Error, "protocol not found");
2272 return NULL;
2273 }
2274 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002275#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002276}
2277
Guido van Rossum82a5c661998-07-07 20:45:43 +00002278static char getprotobyname_doc[] =
2279"getprotobyname(name) -> integer\n\
2280\n\
2281Return the protocol number for the named protocol. (Rarely used.)";
2282
Guido van Rossum3901d851996-12-19 16:35:04 +00002283
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002284#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002285/* Create a socket object from a numeric file description.
2286 Useful e.g. if stdin is a socket.
2287 Additional arguments as for socket(). */
2288
2289/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002290static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002291PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002292{
Guido van Rossum73624e91994-10-10 17:59:00 +00002293 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002294 SOCKET_T fd;
2295 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002296 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2297 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002298 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002299 /* Dup the fd so it and the socket can be closed independently */
2300 fd = dup(fd);
2301 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002302 return PySocket_Err();
2303 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002304 /* From now on, ignore SIGPIPE and let the error checking
2305 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002306#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002307 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002308#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002309 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002310}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002311
2312static char fromfd_doc[] =
2313"fromfd(fd, family, type[, proto]) -> socket object\n\
2314\n\
2315Create a socket object from the given file descriptor.\n\
2316The remaining arguments are the same as for socket().";
2317
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002318#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002319
Guido van Rossum82a5c661998-07-07 20:45:43 +00002320
Guido van Rossum006bf911996-06-12 04:04:55 +00002321static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002322PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002323{
2324 int x1, x2;
2325
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002326 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002327 return NULL;
2328 }
2329 x2 = (int)ntohs((short)x1);
2330 return PyInt_FromLong(x2);
2331}
2332
Guido van Rossum82a5c661998-07-07 20:45:43 +00002333static char ntohs_doc[] =
2334"ntohs(integer) -> integer\n\
2335\n\
2336Convert a 16-bit integer from network to host byte order.";
2337
2338
Guido van Rossum006bf911996-06-12 04:04:55 +00002339static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002340PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002341{
2342 int x1, x2;
2343
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002344 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002345 return NULL;
2346 }
2347 x2 = ntohl(x1);
2348 return PyInt_FromLong(x2);
2349}
2350
Guido van Rossum82a5c661998-07-07 20:45:43 +00002351static char ntohl_doc[] =
2352"ntohl(integer) -> integer\n\
2353\n\
2354Convert a 32-bit integer from network to host byte order.";
2355
2356
Guido van Rossum006bf911996-06-12 04:04:55 +00002357static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002358PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002359{
2360 int x1, x2;
2361
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002362 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002363 return NULL;
2364 }
2365 x2 = (int)htons((short)x1);
2366 return PyInt_FromLong(x2);
2367}
2368
Guido van Rossum82a5c661998-07-07 20:45:43 +00002369static char htons_doc[] =
2370"htons(integer) -> integer\n\
2371\n\
2372Convert a 16-bit integer from host to network byte order.";
2373
2374
Guido van Rossum006bf911996-06-12 04:04:55 +00002375static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002376PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002377{
2378 int x1, x2;
2379
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002380 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002381 return NULL;
2382 }
2383 x2 = htonl(x1);
2384 return PyInt_FromLong(x2);
2385}
2386
Guido van Rossum82a5c661998-07-07 20:45:43 +00002387static char htonl_doc[] =
2388"htonl(integer) -> integer\n\
2389\n\
2390Convert a 32-bit integer from host to network byte order.";
2391
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002392/*
2393 * socket.inet_aton() and socket.inet_ntoa() functions
2394 *
2395 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2396 *
2397 */
2398
Guido van Rossum48a680c2001-03-02 06:34:14 +00002399static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002400"inet_aton(string) -> packed 32-bit IP representation\n\
2401\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002402Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002403binary format used in low-level network functions.";
2404
2405static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002406PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002407{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002408#ifndef INADDR_NONE
2409#define INADDR_NONE (-1)
2410#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002411
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002412 /* Have to use inet_addr() instead */
2413 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002414 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002415
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002416 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002417 return NULL;
2418 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002419#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002420 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002421#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002422 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002423#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002424
2425 if (packed_addr == INADDR_NONE) { /* invalid address */
2426 PyErr_SetString(PySocket_Error,
2427 "illegal IP address string passed to inet_aton");
2428 return NULL;
2429 }
2430
2431 return PyString_FromStringAndSize((char *) &packed_addr,
2432 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002433}
2434
Guido van Rossum48a680c2001-03-02 06:34:14 +00002435static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002436"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002437\n\
2438Convert an IP address from 32-bit packed binary format to string format";
2439
2440static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002441PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002442{
2443 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002444 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002445 struct in_addr packed_addr;
2446
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002447 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002448 return NULL;
2449 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002450
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002451 if (addr_len != sizeof(packed_addr)) {
2452 PyErr_SetString(PySocket_Error,
2453 "packed IP wrong length for inet_ntoa");
2454 return NULL;
2455 }
2456
2457 memcpy(&packed_addr, packed_str, addr_len);
2458
2459 return PyString_FromString(inet_ntoa(packed_addr));
2460}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002461
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002462/* Python interface to getaddrinfo(host, port). */
2463
2464/*ARGSUSED*/
2465static PyObject *
2466PySocket_getaddrinfo(PyObject *self, PyObject *args)
2467{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002468 struct addrinfo hints, *res;
2469 struct addrinfo *res0 = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002470 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002471 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002472 char *hptr, *pptr;
2473 int family, socktype, protocol, flags;
2474 int error;
2475 PyObject *all = (PyObject *)NULL;
2476 PyObject *single = (PyObject *)NULL;
2477
2478 family = socktype = protocol = flags = 0;
2479 family = PF_UNSPEC;
2480 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2481 &hptr, &pobj, &family, &socktype,
2482 &protocol, &flags)) {
2483 return NULL;
2484 }
2485 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002486 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002487 pptr = pbuf;
2488 } else if (PyString_Check(pobj)) {
2489 pptr = PyString_AsString(pobj);
2490 } else if (pobj == Py_None) {
2491 pptr = (char *)NULL;
2492 } else {
2493 PyErr_SetString(PySocket_Error, "Int or String expected");
2494 return NULL;
2495 }
2496 memset(&hints, 0, sizeof(hints));
2497 hints.ai_family = family;
2498 hints.ai_socktype = socktype;
2499 hints.ai_protocol = protocol;
2500 hints.ai_flags = flags;
2501 error = getaddrinfo(hptr, pptr, &hints, &res0);
2502 if (error) {
2503 PyGAI_Err(error);
2504 return NULL;
2505 }
2506
2507 if ((all = PyList_New(0)) == NULL)
2508 goto err;
2509 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002510 PyObject *addr =
2511 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2512 if (addr == NULL)
2513 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002514 single = Py_BuildValue("iiisO", res->ai_family,
2515 res->ai_socktype, res->ai_protocol,
2516 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002517 addr);
2518 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002519 if (single == NULL)
2520 goto err;
2521
2522 if (PyList_Append(all, single))
2523 goto err;
2524 Py_XDECREF(single);
2525 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002526 return all;
2527 err:
2528 Py_XDECREF(single);
2529 Py_XDECREF(all);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002530 if (res0)
2531 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002532 return (PyObject *)NULL;
2533}
2534
2535static char getaddrinfo_doc[] =
2536"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2537 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2538\n\
2539Resolve host and port into addrinfo struct.";
2540
2541/* Python interface to getnameinfo(sa, flags). */
2542
2543/*ARGSUSED*/
2544static PyObject *
2545PySocket_getnameinfo(PyObject *self, PyObject *args)
2546{
2547 PyObject *sa = (PyObject *)NULL;
2548 int flags;
2549 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002550 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002551 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2552 struct addrinfo hints, *res = NULL;
2553 int error;
2554 PyObject *ret = (PyObject *)NULL;
2555
2556 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002557 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002558 return NULL;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002559 if (!PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, &scope_id))
2560 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002561 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002562 memset(&hints, 0, sizeof(hints));
2563 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002564 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002565 error = getaddrinfo(hostp, pbuf, &hints, &res);
2566 if (error) {
2567 PyGAI_Err(error);
2568 goto fail;
2569 }
2570 if (res->ai_next) {
2571 PyErr_SetString(PySocket_Error,
2572 "sockaddr resolved to multiple addresses");
2573 goto fail;
2574 }
2575 switch (res->ai_family) {
2576 case AF_INET:
2577 {
2578 char *t1;
2579 int t2;
2580 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2581 PyErr_SetString(PySocket_Error,
2582 "IPv4 sockaddr must be 2 tuple");
2583 goto fail;
2584 }
2585 break;
2586 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002587#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002588 case AF_INET6:
2589 {
2590 struct sockaddr_in6 *sin6;
2591 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2592 sin6->sin6_flowinfo = flowinfo;
2593 sin6->sin6_scope_id = scope_id;
2594 break;
2595 }
2596#endif
2597 }
2598 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2599 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2600 if (error) {
2601 PyGAI_Err(error);
2602 goto fail;
2603 }
2604 ret = Py_BuildValue("ss", hbuf, pbuf);
2605
2606fail:
2607 if (res)
2608 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002609 return ret;
2610}
2611
2612static char getnameinfo_doc[] =
2613"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2614\n\
2615Get host and port for a sockaddr.";
2616
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002617/* XXX It might be helpful to augment the error message generated
2618 below with the name of the SSL function that generated the error.
2619 I expect it's obvious most of the time.
2620*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002621
2622#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002623static PyObject *
2624PySSL_SetError(SSL *ssl, int ret)
2625{
2626 PyObject *v, *n, *s;
2627 char *errstr;
2628 int err;
2629
2630 assert(ret <= 0);
2631
2632 err = SSL_get_error(ssl, ret);
2633 n = PyInt_FromLong(err);
2634 if (n == NULL)
2635 return NULL;
2636 v = PyTuple_New(2);
2637 if (v == NULL) {
2638 Py_DECREF(n);
2639 return NULL;
2640 }
2641
2642 switch (SSL_get_error(ssl, ret)) {
2643 case SSL_ERROR_ZERO_RETURN:
2644 errstr = "TLS/SSL connection has been closed";
2645 break;
2646 case SSL_ERROR_WANT_READ:
2647 errstr = "The operation did not complete (read)";
2648 break;
2649 case SSL_ERROR_WANT_WRITE:
2650 errstr = "The operation did not complete (write)";
2651 break;
2652 case SSL_ERROR_WANT_X509_LOOKUP:
2653 errstr = "The operation did not complete (X509 lookup)";
2654 break;
2655 case SSL_ERROR_SYSCALL:
2656 case SSL_ERROR_SSL:
2657 {
2658 unsigned long e = ERR_get_error();
2659 if (e == 0) {
2660 /* an EOF was observed that violates the protocol */
2661 errstr = "EOF occurred in violation of protocol";
2662 } else if (e == -1) {
2663 /* the underlying BIO reported an I/O error */
2664 Py_DECREF(v);
2665 Py_DECREF(n);
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +00002666 return PySocket_Err();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002667 } else {
2668 /* XXX Protected by global interpreter lock */
2669 errstr = ERR_error_string(e, NULL);
2670 }
2671 break;
2672 }
2673 default:
2674 errstr = "Invalid error code";
2675 }
2676 s = PyString_FromString(errstr);
2677 if (s == NULL) {
2678 Py_DECREF(v);
2679 Py_DECREF(n);
2680 }
2681 PyTuple_SET_ITEM(v, 0, n);
2682 PyTuple_SET_ITEM(v, 1, s);
2683 PyErr_SetObject(PySSLErrorObject, v);
2684 return NULL;
2685}
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002686
2687/* This is a C function to be called for new object initialization */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002688static PySSLObject *
2689newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002690{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002691 PySSLObject *self;
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002692 char *errstr = NULL;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002693 int ret;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002694
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002695 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002696 if (self == NULL){
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002697 errstr = "newPySSLObject error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002698 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002699 }
Jeremy Hyltonba699362001-10-11 17:23:34 +00002700 memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
2701 memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002702 self->server_cert = NULL;
2703 self->ssl = NULL;
2704 self->ctx = NULL;
2705 self->Socket = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002706
Jeremy Hylton22738b92001-10-10 22:37:48 +00002707 if ((key_file && !cert_file) || (!key_file && cert_file)) {
2708 errstr = "Both the key & certificate files must be specified";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002709 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002710 }
2711
Jeremy Hylton22738b92001-10-10 22:37:48 +00002712 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2713 if (self->ctx == NULL) {
2714 errstr = "SSL_CTX_new error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002715 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002716 }
2717
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002718 if (key_file) {
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002719 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002720 SSL_FILETYPE_PEM) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002721 errstr = "SSL_CTX_use_PrivateKey_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002722 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002723 }
2724
2725 if (SSL_CTX_use_certificate_chain_file(self->ctx,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002726 cert_file) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002727 errstr = "SSL_CTX_use_certificate_chain_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002728 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002729 }
2730 }
2731
2732 SSL_CTX_set_verify(self->ctx,
2733 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2734 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2735 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2736 SSL_set_connect_state(self->ssl);
2737
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002738 /* Actually negotiate SSL connection */
2739 /* XXX If SSL_connect() returns 0, it's also a failure. */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002740 ret = SSL_connect(self->ssl);
2741 if (ret <= 0) {
2742 PySSL_SetError(self->ssl, ret);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002743 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002744 }
2745 self->ssl->debug = 1;
2746
2747 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2748 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002749 self->server, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002750 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002751 self->issuer, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002752 }
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002753 self->Socket = Sock;
2754 Py_INCREF(self->Socket);
2755 return self;
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002756 fail:
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002757 if (errstr)
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002758 PyErr_SetString(PySSLErrorObject, errstr);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002759 Py_DECREF(self);
2760 return NULL;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002761}
2762
2763/* This is the Python function called for new object initialization */
2764static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002765PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002766{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002767 PySSLObject *rv;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002768 PySocketSockObject *Sock;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002769 char *key_file = NULL;
2770 char *cert_file = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002771
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002772 if (!PyArg_ParseTuple(args, "O!|zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002773 &PySocketSock_Type, (PyObject*)&Sock,
Jeremy Hyltonab006452001-10-10 03:33:24 +00002774 &key_file, &cert_file))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002775 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002776
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002777 rv = newPySSLObject(Sock, key_file, cert_file);
Jeremy Hyltonab006452001-10-10 03:33:24 +00002778 if (rv == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002779 return NULL;
2780 return (PyObject *)rv;
2781}
2782
2783static char ssl_doc[] =
Jeremy Hyltonba699362001-10-11 17:23:34 +00002784"ssl(socket, [keyfile, certfile]) -> sslobject";
2785
2786/* SSL object methods */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002787
2788static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002789PySSL_server(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002790{
2791 return PyString_FromString(self->server);
2792}
2793
2794static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002795PySSL_issuer(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002796{
2797 return PyString_FromString(self->issuer);
2798}
2799
2800
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002801static void PySSL_dealloc(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002802{
2803 if (self->server_cert) /* Possible not to have one? */
2804 X509_free (self->server_cert);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002805 if (self->ssl)
2806 SSL_free(self->ssl);
2807 if (self->ctx)
2808 SSL_CTX_free(self->ctx);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002809 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002810 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002811}
2812
Jeremy Hyltonba699362001-10-11 17:23:34 +00002813static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
2814{
2815 char *data;
2816 int len;
2817
2818 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
2819 return NULL;
2820
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002821 Py_BEGIN_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002822 len = SSL_write(self->ssl, data, len);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002823 Py_END_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002824 if (len > 0)
2825 return PyInt_FromLong(len);
2826 else
2827 return PySSL_SetError(self->ssl, len);
2828}
2829
2830static char PySSL_SSLwrite_doc[] =
2831"write(s) -> len\n\
2832\n\
2833Writes the string s into the SSL object. Returns the number\n\
2834of bytes written.";
2835
2836static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
2837{
2838 PyObject *buf;
2839 int count = 0;
2840 int len = 1024;
2841
2842 if (!PyArg_ParseTuple(args, "|i:read", &len))
2843 return NULL;
2844
2845 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2846 return NULL;
2847
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002848 Py_BEGIN_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002849 count = SSL_read(self->ssl, PyString_AsString(buf), len);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002850 Py_END_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002851 if (count <= 0) {
2852 Py_DECREF(buf);
2853 return PySSL_SetError(self->ssl, count);
2854 }
2855 if (count != len && _PyString_Resize(&buf, count) < 0)
2856 return NULL;
2857 return buf;
2858}
2859
2860static char PySSL_SSLread_doc[] =
2861"read([len]) -> string\n\
2862\n\
2863Read up to len bytes from the SSL socket.";
2864
2865static PyMethodDef PySSLMethods[] = {
2866 {"write", (PyCFunction)PySSL_SSLwrite, 1,
2867 PySSL_SSLwrite_doc},
2868 {"read", (PyCFunction)PySSL_SSLread, 1,
2869 PySSL_SSLread_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00002870 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
2871 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Jeremy Hyltonba699362001-10-11 17:23:34 +00002872 {NULL, NULL}
2873};
2874
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002875static PyObject *PySSL_getattr(PySSLObject *self, char *name)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002876{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002877 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002878}
2879
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002880staticforward PyTypeObject PySSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002881 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002882 0, /*ob_size*/
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002883 "_socket.SSL", /*tp_name*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002884 sizeof(PySSLObject), /*tp_basicsize*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002885 0, /*tp_itemsize*/
2886 /* methods */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002887 (destructor)PySSL_dealloc, /*tp_dealloc*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002888 0, /*tp_print*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002889 (getattrfunc)PySSL_getattr, /*tp_getattr*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002890 0, /*tp_setattr*/
2891 0, /*tp_compare*/
2892 0, /*tp_repr*/
2893 0, /*tp_as_number*/
2894 0, /*tp_as_sequence*/
2895 0, /*tp_as_mapping*/
2896 0, /*tp_hash*/
2897};
2898
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002899/* helper routines for seeding the SSL PRNG */
2900static PyObject *
2901PySSL_RAND_add(PyObject *self, PyObject *args)
2902{
2903 char *buf;
2904 int len;
2905 double entropy;
2906
2907 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
2908 return NULL;
2909 RAND_add(buf, len, entropy);
2910 Py_INCREF(Py_None);
2911 return Py_None;
2912}
2913
2914static char PySSL_RAND_add_doc[] =
2915"RAND_add(string, entropy)\n\
2916\n\
2917Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
2918bound on the entropy contained in string.";
2919
2920static PyObject *
2921PySSL_RAND_status(PyObject *self)
2922{
2923 return PyInt_FromLong(RAND_status());
2924}
2925
2926static char PySSL_RAND_status_doc[] =
2927"RAND_status() -> 0 or 1\n\
2928\n\
2929Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
2930It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
2931using the ssl() function.";
2932
2933static PyObject *
2934PySSL_RAND_egd(PyObject *self, PyObject *arg)
2935{
2936 int bytes;
2937
2938 if (!PyString_Check(arg))
2939 return PyErr_Format(PyExc_TypeError,
2940 "RAND_egd() expected string, found %s",
2941 arg->ob_type->tp_name);
2942 bytes = RAND_egd(PyString_AS_STRING(arg));
2943 if (bytes == -1) {
2944 PyErr_SetString(PySSLErrorObject,
2945 "EGD connection failed or EGD did not return "
2946 "enough data to seed the PRNG");
2947 return NULL;
2948 }
2949 return PyInt_FromLong(bytes);
2950}
2951
2952static char PySSL_RAND_egd_doc[] =
Guido van Rossumcad8fa12001-10-19 12:40:40 +00002953"RAND_egd(path) -> bytes\n\
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002954\n\
2955Queries the entropy gather daemon (EGD) on socket path. Returns number\n\
2956of bytes read. Raises socket.sslerror if connection to EGD fails or\n\
2957if it does provide enough data to seed PRNG.";
2958
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002959#endif /* USE_SSL */
2960
2961
Guido van Rossum30a685f1991-06-27 15:51:29 +00002962/* List of functions exported by this module. */
2963
Guido van Rossum73624e91994-10-10 17:59:00 +00002964static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002965 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002966 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002967 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002968 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002969 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002970 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002971 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002972 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002973 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002974 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002975 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002976 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002977#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002978 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002979 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002980#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002981 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002982 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002983 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002984 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002985 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002986 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002987 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002988 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002989 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002990 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002991 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002992 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002993 {"getaddrinfo", PySocket_getaddrinfo,
2994 METH_VARARGS, getaddrinfo_doc},
2995 {"getnameinfo", PySocket_getnameinfo,
2996 METH_VARARGS, getnameinfo_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002997#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002998 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002999 METH_VARARGS, ssl_doc},
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00003000 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
3001 PySSL_RAND_add_doc},
3002 {"RAND_egd", PySSL_RAND_egd, METH_O,
3003 PySSL_RAND_egd_doc},
3004 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
3005 PySSL_RAND_status_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003006#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003007 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003008};
3009
Guido van Rossum30a685f1991-06-27 15:51:29 +00003010
3011/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00003012 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003013 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00003014 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003015static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00003016insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003017{
Guido van Rossum73624e91994-10-10 17:59:00 +00003018 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00003019 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003020 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00003021
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003022 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003023}
3024
Guido van Rossum30a685f1991-06-27 15:51:29 +00003025
Guido van Rossum8d665e61996-06-26 18:22:49 +00003026#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00003027
3028/* Additional initialization and cleanup for NT/Windows */
3029
3030static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003031NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003032{
3033 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003034}
3035
3036static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003037NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003038{
3039 WSADATA WSAData;
3040 int ret;
3041 char buf[100];
3042 ret = WSAStartup(0x0101, &WSAData);
3043 switch (ret) {
3044 case 0: /* no error */
3045 atexit(NTcleanup);
3046 return 1;
3047 case WSASYSNOTREADY:
3048 PyErr_SetString(PyExc_ImportError,
3049 "WSAStartup failed: network not ready");
3050 break;
3051 case WSAVERNOTSUPPORTED:
3052 case WSAEINVAL:
3053 PyErr_SetString(PyExc_ImportError,
3054 "WSAStartup failed: requested version not supported");
3055 break;
3056 default:
Tim Peters885d4572001-11-28 20:27:42 +00003057 PyOS_snprintf(buf, sizeof(buf),
3058 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003059 PyErr_SetString(PyExc_ImportError, buf);
3060 break;
3061 }
3062 return 0;
3063}
3064
Guido van Rossum8d665e61996-06-26 18:22:49 +00003065#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003066
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003067#if defined(PYOS_OS2)
3068
3069/* Additional initialization and cleanup for OS/2 */
3070
3071static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003072OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003073{
3074 /* No cleanup is necessary for OS/2 Sockets */
3075}
3076
3077static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003078OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003079{
3080 char reason[64];
3081 int rc = sock_init();
3082
3083 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00003084 atexit(OS2cleanup);
3085 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003086 }
3087
Tim Peters75cdad52001-11-28 22:07:30 +00003088 PyOS_snprintf(reason, sizeof(reason),
3089 "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003090 PyErr_SetString(PyExc_ImportError, reason);
3091
Guido van Rossum32c575d1997-12-02 20:37:32 +00003092 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003093}
3094
3095#endif /* PYOS_OS2 */
3096
Guido van Rossum30a685f1991-06-27 15:51:29 +00003097/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003098 * This is called when the first 'import socket' is done,
3099 * via a table in config.c, if config.c is compiled with USE_SOCKET
3100 * defined.
3101 *
3102 * For MS_WINDOWS (which means any Windows variant), this module
3103 * is actually called "_socket", and there's a wrapper "socket.py"
3104 * which implements some missing functionality (such as makefile(),
3105 * dup() and fromfd()). The import of "_socket" may fail with an
3106 * ImportError exception if initialization of WINSOCK fails. When
3107 * WINSOCK is initialized succesfully, a call to WSACleanup() is
3108 * scheduled to be made at exit time.
3109 *
3110 * For OS/2, this module is also called "_socket" and uses a wrapper
3111 * "socket.py" which implements that functionality that is missing
3112 * when PC operating systems don't put socket descriptors in the
3113 * operating system's filesystem layer.
3114 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003115
Guido van Rossum82a5c661998-07-07 20:45:43 +00003116static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00003117"Implementation module for socket operations. See the socket module\n\
3118for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00003119
Guido van Rossum3886bb61998-12-04 18:50:17 +00003120DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003121init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003122{
Guido van Rossum73624e91994-10-10 17:59:00 +00003123 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003124#ifdef RISCOS
3125 _kernel_swi_regs r;
3126 r.r[0]=0;
3127 _kernel_swi(0x43380, &r, &r);
3128 taskwindow = r.r[0];
3129#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00003130#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00003131 if (!NTinit())
3132 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00003133#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00003134#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003135 if (!OS2init())
3136 return;
Fred Drakea136d492000-08-16 14:18:30 +00003137#endif /* __TOS_OS2__ */
3138#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00003139#endif /* RISCOS */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003140 PySocketSock_Type.ob_type = &PyType_Type;
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00003141 PySocketSock_Type.tp_getattro = PyObject_GenericGetAttr;
3142 PySocketSock_Type.tp_alloc = PyType_GenericAlloc;
3143 PySocketSock_Type.tp_free = _PyObject_Del;
Guido van Rossuma120ffc2001-01-22 15:29:14 +00003144#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003145 PySSL_Type.ob_type = &PyType_Type;
Guido van Rossuma120ffc2001-01-22 15:29:14 +00003146#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00003147 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00003148 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003149 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
3150 if (PySocket_Error == NULL)
3151 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003152 PyDict_SetItemString(d, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003153 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
3154 if (PyH_Error == NULL)
3155 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003156 PyDict_SetItemString(d, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003157 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
3158 NULL);
3159 if (PyGAI_Error == NULL)
3160 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003161 PyDict_SetItemString(d, "gaierror", PyGAI_Error);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003162#ifdef USE_SSL
3163 SSL_load_error_strings();
3164 SSLeay_add_ssl_algorithms();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003165 PySSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
3166 if (PySSLErrorObject == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003167 return;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003168 PyDict_SetItemString(d, "sslerror", PySSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003169 if (PyDict_SetItemString(d, "SSLType",
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003170 (PyObject *)&PySSL_Type) != 0)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003171 return;
Jeremy Hylton57ca8732001-10-11 00:00:17 +00003172 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
3173 SSL_ERROR_ZERO_RETURN);
3174 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
3175 SSL_ERROR_WANT_READ);
3176 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
3177 SSL_ERROR_WANT_WRITE);
3178 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
3179 SSL_ERROR_WANT_X509_LOOKUP);
3180 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
3181 SSL_ERROR_SYSCALL);
3182 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
3183 SSL_ERROR_SSL);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003184#endif /* USE_SSL */
Guido van Rossum91ba64d1997-06-02 22:18:09 +00003185 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00003186 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003187 return;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003188 if (PyDict_SetItemString(d, "socket",
3189 (PyObject *)&PySocketSock_Type) != 0)
3190 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003191
3192 /* Address families (we only support AF_INET and AF_UNIX) */
3193#ifdef AF_UNSPEC
3194 insint(d, "AF_UNSPEC", AF_UNSPEC);
3195#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003196 insint(d, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003197#ifdef AF_INET6
3198 insint(d, "AF_INET6", AF_INET6);
3199#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003200#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003201 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003202#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003203#ifdef AF_AX25
3204 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
3205#endif
3206#ifdef AF_IPX
3207 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
3208#endif
3209#ifdef AF_APPLETALK
3210 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
3211#endif
3212#ifdef AF_NETROM
3213 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
3214#endif
3215#ifdef AF_BRIDGE
3216 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
3217#endif
3218#ifdef AF_AAL5
3219 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
3220#endif
3221#ifdef AF_X25
3222 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
3223#endif
3224#ifdef AF_INET6
3225 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
3226#endif
3227#ifdef AF_ROSE
3228 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
3229#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003230#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00003231 insint(d, "AF_PACKET", AF_PACKET);
3232 insint(d, "PF_PACKET", PF_PACKET);
3233 insint(d, "PACKET_HOST", PACKET_HOST);
3234 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
3235 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
3236 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3237 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
3238 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3239 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003240#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003241
3242 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003243 insint(d, "SOCK_STREAM", SOCK_STREAM);
3244 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003245#ifndef __BEOS__
3246/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003247 insint(d, "SOCK_RAW", SOCK_RAW);
3248 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3249 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003250#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003251
3252#ifdef SO_DEBUG
3253 insint(d, "SO_DEBUG", SO_DEBUG);
3254#endif
3255#ifdef SO_ACCEPTCONN
3256 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
3257#endif
3258#ifdef SO_REUSEADDR
3259 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
3260#endif
3261#ifdef SO_KEEPALIVE
3262 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
3263#endif
3264#ifdef SO_DONTROUTE
3265 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
3266#endif
3267#ifdef SO_BROADCAST
3268 insint(d, "SO_BROADCAST", SO_BROADCAST);
3269#endif
3270#ifdef SO_USELOOPBACK
3271 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
3272#endif
3273#ifdef SO_LINGER
3274 insint(d, "SO_LINGER", SO_LINGER);
3275#endif
3276#ifdef SO_OOBINLINE
3277 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
3278#endif
3279#ifdef SO_REUSEPORT
3280 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
3281#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003282#ifdef SO_SNDBUF
3283 insint(d, "SO_SNDBUF", SO_SNDBUF);
3284#endif
3285#ifdef SO_RCVBUF
3286 insint(d, "SO_RCVBUF", SO_RCVBUF);
3287#endif
3288#ifdef SO_SNDLOWAT
3289 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
3290#endif
3291#ifdef SO_RCVLOWAT
3292 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
3293#endif
3294#ifdef SO_SNDTIMEO
3295 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
3296#endif
3297#ifdef SO_RCVTIMEO
3298 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
3299#endif
3300#ifdef SO_ERROR
3301 insint(d, "SO_ERROR", SO_ERROR);
3302#endif
3303#ifdef SO_TYPE
3304 insint(d, "SO_TYPE", SO_TYPE);
3305#endif
3306
3307 /* Maximum number of connections for "listen" */
3308#ifdef SOMAXCONN
3309 insint(d, "SOMAXCONN", SOMAXCONN);
3310#else
3311 insint(d, "SOMAXCONN", 5); /* Common value */
3312#endif
3313
3314 /* Flags for send, recv */
3315#ifdef MSG_OOB
3316 insint(d, "MSG_OOB", MSG_OOB);
3317#endif
3318#ifdef MSG_PEEK
3319 insint(d, "MSG_PEEK", MSG_PEEK);
3320#endif
3321#ifdef MSG_DONTROUTE
3322 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
3323#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003324#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00003325 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003326#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003327#ifdef MSG_EOR
3328 insint(d, "MSG_EOR", MSG_EOR);
3329#endif
3330#ifdef MSG_TRUNC
3331 insint(d, "MSG_TRUNC", MSG_TRUNC);
3332#endif
3333#ifdef MSG_CTRUNC
3334 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
3335#endif
3336#ifdef MSG_WAITALL
3337 insint(d, "MSG_WAITALL", MSG_WAITALL);
3338#endif
3339#ifdef MSG_BTAG
3340 insint(d, "MSG_BTAG", MSG_BTAG);
3341#endif
3342#ifdef MSG_ETAG
3343 insint(d, "MSG_ETAG", MSG_ETAG);
3344#endif
3345
3346 /* Protocol level and numbers, usable for [gs]etsockopt */
3347#ifdef SOL_SOCKET
3348 insint(d, "SOL_SOCKET", SOL_SOCKET);
3349#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003350#ifdef SOL_IP
3351 insint(d, "SOL_IP", SOL_IP);
3352#else
3353 insint(d, "SOL_IP", 0);
3354#endif
3355#ifdef SOL_IPX
3356 insint(d, "SOL_IPX", SOL_IPX);
3357#endif
3358#ifdef SOL_AX25
3359 insint(d, "SOL_AX25", SOL_AX25);
3360#endif
3361#ifdef SOL_ATALK
3362 insint(d, "SOL_ATALK", SOL_ATALK);
3363#endif
3364#ifdef SOL_NETROM
3365 insint(d, "SOL_NETROM", SOL_NETROM);
3366#endif
3367#ifdef SOL_ROSE
3368 insint(d, "SOL_ROSE", SOL_ROSE);
3369#endif
3370#ifdef SOL_TCP
3371 insint(d, "SOL_TCP", SOL_TCP);
3372#else
3373 insint(d, "SOL_TCP", 6);
3374#endif
3375#ifdef SOL_UDP
3376 insint(d, "SOL_UDP", SOL_UDP);
3377#else
3378 insint(d, "SOL_UDP", 17);
3379#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003380#ifdef IPPROTO_IP
3381 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003382#else
3383 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003384#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003385#ifdef IPPROTO_HOPOPTS
3386 insint(d, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
3387#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003388#ifdef IPPROTO_ICMP
3389 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003390#else
3391 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003392#endif
3393#ifdef IPPROTO_IGMP
3394 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
3395#endif
3396#ifdef IPPROTO_GGP
3397 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
3398#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003399#ifdef IPPROTO_IPV4
3400 insint(d, "IPPROTO_IPV4", IPPROTO_IPV4);
3401#endif
3402#ifdef IPPROTO_IPIP
3403 insint(d, "IPPROTO_IPIP", IPPROTO_IPIP);
3404#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003405#ifdef IPPROTO_TCP
3406 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003407#else
3408 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003409#endif
3410#ifdef IPPROTO_EGP
3411 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
3412#endif
3413#ifdef IPPROTO_PUP
3414 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
3415#endif
3416#ifdef IPPROTO_UDP
3417 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003418#else
3419 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003420#endif
3421#ifdef IPPROTO_IDP
3422 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
3423#endif
3424#ifdef IPPROTO_HELLO
3425 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
3426#endif
3427#ifdef IPPROTO_ND
3428 insint(d, "IPPROTO_ND", IPPROTO_ND);
3429#endif
3430#ifdef IPPROTO_TP
3431 insint(d, "IPPROTO_TP", IPPROTO_TP);
3432#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003433#ifdef IPPROTO_IPV6
3434 insint(d, "IPPROTO_IPV6", IPPROTO_IPV6);
3435#endif
3436#ifdef IPPROTO_ROUTING
3437 insint(d, "IPPROTO_ROUTING", IPPROTO_ROUTING);
3438#endif
3439#ifdef IPPROTO_FRAGMENT
3440 insint(d, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
3441#endif
3442#ifdef IPPROTO_RSVP
3443 insint(d, "IPPROTO_RSVP", IPPROTO_RSVP);
3444#endif
3445#ifdef IPPROTO_GRE
3446 insint(d, "IPPROTO_GRE", IPPROTO_GRE);
3447#endif
3448#ifdef IPPROTO_ESP
3449 insint(d, "IPPROTO_ESP", IPPROTO_ESP);
3450#endif
3451#ifdef IPPROTO_AH
3452 insint(d, "IPPROTO_AH", IPPROTO_AH);
3453#endif
3454#ifdef IPPROTO_MOBILE
3455 insint(d, "IPPROTO_MOBILE", IPPROTO_MOBILE);
3456#endif
3457#ifdef IPPROTO_ICMPV6
3458 insint(d, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
3459#endif
3460#ifdef IPPROTO_NONE
3461 insint(d, "IPPROTO_NONE", IPPROTO_NONE);
3462#endif
3463#ifdef IPPROTO_DSTOPTS
3464 insint(d, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
3465#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003466#ifdef IPPROTO_XTP
3467 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
3468#endif
3469#ifdef IPPROTO_EON
3470 insint(d, "IPPROTO_EON", IPPROTO_EON);
3471#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003472#ifdef IPPROTO_PIM
3473 insint(d, "IPPROTO_PIM", IPPROTO_PIM);
3474#endif
3475#ifdef IPPROTO_IPCOMP
3476 insint(d, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
3477#endif
3478#ifdef IPPROTO_VRRP
3479 insint(d, "IPPROTO_VRRP", IPPROTO_VRRP);
3480#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003481#ifdef IPPROTO_BIP
3482 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
3483#endif
3484/**/
3485#ifdef IPPROTO_RAW
3486 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003487#else
3488 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003489#endif
3490#ifdef IPPROTO_MAX
3491 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
3492#endif
3493
3494 /* Some port configuration */
3495#ifdef IPPORT_RESERVED
3496 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
3497#else
3498 insint(d, "IPPORT_RESERVED", 1024);
3499#endif
3500#ifdef IPPORT_USERRESERVED
3501 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
3502#else
3503 insint(d, "IPPORT_USERRESERVED", 5000);
3504#endif
3505
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003506 /* Some reserved IP v.4 addresses */
3507#ifdef INADDR_ANY
3508 insint(d, "INADDR_ANY", INADDR_ANY);
3509#else
3510 insint(d, "INADDR_ANY", 0x00000000);
3511#endif
3512#ifdef INADDR_BROADCAST
3513 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
3514#else
3515 insint(d, "INADDR_BROADCAST", 0xffffffff);
3516#endif
3517#ifdef INADDR_LOOPBACK
3518 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
3519#else
3520 insint(d, "INADDR_LOOPBACK", 0x7F000001);
3521#endif
3522#ifdef INADDR_UNSPEC_GROUP
3523 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
3524#else
3525 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
3526#endif
3527#ifdef INADDR_ALLHOSTS_GROUP
3528 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
3529#else
3530 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
3531#endif
3532#ifdef INADDR_MAX_LOCAL_GROUP
3533 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
3534#else
3535 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
3536#endif
3537#ifdef INADDR_NONE
3538 insint(d, "INADDR_NONE", INADDR_NONE);
3539#else
3540 insint(d, "INADDR_NONE", 0xffffffff);
3541#endif
3542
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003543 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003544#ifdef IP_OPTIONS
3545 insint(d, "IP_OPTIONS", IP_OPTIONS);
3546#endif
3547#ifdef IP_HDRINCL
3548 insint(d, "IP_HDRINCL", IP_HDRINCL);
3549#endif
3550#ifdef IP_TOS
3551 insint(d, "IP_TOS", IP_TOS);
3552#endif
3553#ifdef IP_TTL
3554 insint(d, "IP_TTL", IP_TTL);
3555#endif
3556#ifdef IP_RECVOPTS
3557 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
3558#endif
3559#ifdef IP_RECVRETOPTS
3560 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
3561#endif
3562#ifdef IP_RECVDSTADDR
3563 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
3564#endif
3565#ifdef IP_RETOPTS
3566 insint(d, "IP_RETOPTS", IP_RETOPTS);
3567#endif
3568#ifdef IP_MULTICAST_IF
3569 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
3570#endif
3571#ifdef IP_MULTICAST_TTL
3572 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
3573#endif
3574#ifdef IP_MULTICAST_LOOP
3575 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
3576#endif
3577#ifdef IP_ADD_MEMBERSHIP
3578 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
3579#endif
3580#ifdef IP_DROP_MEMBERSHIP
3581 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
3582#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003583#ifdef IP_DEFAULT_MULTICAST_TTL
3584 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
3585#endif
3586#ifdef IP_DEFAULT_MULTICAST_LOOP
3587 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
3588#endif
3589#ifdef IP_MAX_MEMBERSHIPS
3590 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
3591#endif
3592
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003593 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3594#ifdef IPV6_JOIN_GROUP
3595 insint(d, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
3596#endif
3597#ifdef IPV6_LEAVE_GROUP
3598 insint(d, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
3599#endif
3600#ifdef IPV6_MULTICAST_HOPS
3601 insint(d, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
3602#endif
3603#ifdef IPV6_MULTICAST_IF
3604 insint(d, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
3605#endif
3606#ifdef IPV6_MULTICAST_LOOP
3607 insint(d, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
3608#endif
3609#ifdef IPV6_UNICAST_HOPS
3610 insint(d, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
3611#endif
3612
Guido van Rossum09be4091999-08-09 14:40:40 +00003613 /* TCP options */
3614#ifdef TCP_NODELAY
3615 insint(d, "TCP_NODELAY", TCP_NODELAY);
3616#endif
3617#ifdef TCP_MAXSEG
3618 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
3619#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003620#ifdef TCP_CORK
3621 insint(d, "TCP_CORK", TCP_CORK);
3622#endif
3623#ifdef TCP_KEEPIDLE
3624 insint(d, "TCP_KEEPIDLE", TCP_KEEPIDLE);
3625#endif
3626#ifdef TCP_KEEPINTVL
3627 insint(d, "TCP_KEEPINTVL", TCP_KEEPINTVL);
3628#endif
3629#ifdef TCP_KEEPCNT
3630 insint(d, "TCP_KEEPCNT", TCP_KEEPCNT);
3631#endif
3632#ifdef TCP_SYNCNT
3633 insint(d, "TCP_SYNCNT", TCP_SYNCNT);
3634#endif
3635#ifdef TCP_LINGER2
3636 insint(d, "TCP_LINGER2", TCP_LINGER2);
3637#endif
3638#ifdef TCP_DEFER_ACCEPT
3639 insint(d, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
3640#endif
3641#ifdef TCP_WINDOW_CLAMP
3642 insint(d, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
3643#endif
3644#ifdef TCP_INFO
3645 insint(d, "TCP_INFO", TCP_INFO);
3646#endif
3647#ifdef TCP_QUICKACK
3648 insint(d, "TCP_QUICKACK", TCP_QUICKACK);
3649#endif
3650
Guido van Rossum09be4091999-08-09 14:40:40 +00003651
3652 /* IPX options */
3653#ifdef IPX_TYPE
3654 insint(d, "IPX_TYPE", IPX_TYPE);
3655#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003656
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003657 /* get{addr,name}info parameters */
3658#ifdef EAI_ADDRFAMILY
3659 insint(d, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
3660#endif
3661#ifdef EAI_AGAIN
3662 insint(d, "EAI_AGAIN", EAI_AGAIN);
3663#endif
3664#ifdef EAI_BADFLAGS
3665 insint(d, "EAI_BADFLAGS", EAI_BADFLAGS);
3666#endif
3667#ifdef EAI_FAIL
3668 insint(d, "EAI_FAIL", EAI_FAIL);
3669#endif
3670#ifdef EAI_FAMILY
3671 insint(d, "EAI_FAMILY", EAI_FAMILY);
3672#endif
3673#ifdef EAI_MEMORY
3674 insint(d, "EAI_MEMORY", EAI_MEMORY);
3675#endif
3676#ifdef EAI_NODATA
3677 insint(d, "EAI_NODATA", EAI_NODATA);
3678#endif
3679#ifdef EAI_NONAME
3680 insint(d, "EAI_NONAME", EAI_NONAME);
3681#endif
3682#ifdef EAI_SERVICE
3683 insint(d, "EAI_SERVICE", EAI_SERVICE);
3684#endif
3685#ifdef EAI_SOCKTYPE
3686 insint(d, "EAI_SOCKTYPE", EAI_SOCKTYPE);
3687#endif
3688#ifdef EAI_SYSTEM
3689 insint(d, "EAI_SYSTEM", EAI_SYSTEM);
3690#endif
3691#ifdef EAI_BADHINTS
3692 insint(d, "EAI_BADHINTS", EAI_BADHINTS);
3693#endif
3694#ifdef EAI_PROTOCOL
3695 insint(d, "EAI_PROTOCOL", EAI_PROTOCOL);
3696#endif
3697#ifdef EAI_MAX
3698 insint(d, "EAI_MAX", EAI_MAX);
3699#endif
3700#ifdef AI_PASSIVE
3701 insint(d, "AI_PASSIVE", AI_PASSIVE);
3702#endif
3703#ifdef AI_CANONNAME
3704 insint(d, "AI_CANONNAME", AI_CANONNAME);
3705#endif
3706#ifdef AI_NUMERICHOST
3707 insint(d, "AI_NUMERICHOST", AI_NUMERICHOST);
3708#endif
3709#ifdef AI_MASK
3710 insint(d, "AI_MASK", AI_MASK);
3711#endif
3712#ifdef AI_ALL
3713 insint(d, "AI_ALL", AI_ALL);
3714#endif
3715#ifdef AI_V4MAPPED_CFG
3716 insint(d, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
3717#endif
3718#ifdef AI_ADDRCONFIG
3719 insint(d, "AI_ADDRCONFIG", AI_ADDRCONFIG);
3720#endif
3721#ifdef AI_V4MAPPED
3722 insint(d, "AI_V4MAPPED", AI_V4MAPPED);
3723#endif
3724#ifdef AI_DEFAULT
3725 insint(d, "AI_DEFAULT", AI_DEFAULT);
3726#endif
3727#ifdef NI_MAXHOST
3728 insint(d, "NI_MAXHOST", NI_MAXHOST);
3729#endif
3730#ifdef NI_MAXSERV
3731 insint(d, "NI_MAXSERV", NI_MAXSERV);
3732#endif
3733#ifdef NI_NOFQDN
3734 insint(d, "NI_NOFQDN", NI_NOFQDN);
3735#endif
3736#ifdef NI_NUMERICHOST
3737 insint(d, "NI_NUMERICHOST", NI_NUMERICHOST);
3738#endif
3739#ifdef NI_NAMEREQD
3740 insint(d, "NI_NAMEREQD", NI_NAMEREQD);
3741#endif
3742#ifdef NI_NUMERICSERV
3743 insint(d, "NI_NUMERICSERV", NI_NUMERICSERV);
3744#endif
3745#ifdef NI_DGRAM
3746 insint(d, "NI_DGRAM", NI_DGRAM);
3747#endif
3748
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003749 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003750#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003751 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003752#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003753}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003754
3755/* Simplistic emulation code for inet_pton that only works for IPv4 */
3756#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003757int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003758inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003759{
3760 if(af == AF_INET){
3761 long packed_addr;
3762#ifdef USE_GUSI1
3763 packed_addr = (long)inet_addr(src).s_addr;
3764#else
3765 packed_addr = inet_addr(src);
3766#endif
3767 if (packed_addr == INADDR_NONE)
3768 return 0;
3769 memcpy(dst, &packed_addr, 4);
3770 return 1;
3771 }
3772 /* Should set errno to EAFNOSUPPORT */
3773 return -1;
3774}
3775
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003776const char *
3777inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003778{
3779 if (af == AF_INET) {
3780 struct in_addr packed_addr;
3781 if (size < 16)
3782 /* Should set errno to ENOSPC. */
3783 return NULL;
3784 memcpy(&packed_addr, src, sizeof(packed_addr));
3785 return strncpy(dst, inet_ntoa(packed_addr), size);
3786 }
3787 /* Should set errno to EAFNOSUPPORT */
3788 return NULL;
3789}
3790#endif