blob: 124353ef913497f45f54c306a01b229c2c3d9fd9 [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 Rossuma376cc51996-12-05 23:43:35 +0000118#ifdef HAVE_UNISTD_H
119#include <unistd.h>
120#endif
121
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000122#if defined(PYCC_VACPP)
123#include <types.h>
124#include <io.h>
125#include <sys/ioctl.h>
126#include <utils.h>
127#include <ctype.h>
128#endif
129
130#if defined(PYOS_OS2)
131#define INCL_DOS
132#define INCL_DOSERRORS
133#define INCL_NOPMAPI
134#include <os2.h>
135#endif
136
Guido van Rossum48a680c2001-03-02 06:34:14 +0000137
Guido van Rossumb6775db1994-08-01 11:34:53 +0000138#include <sys/types.h>
Guido van Rossumed233a51992-06-23 09:07:03 +0000139
Guido van Rossum81194471991-07-27 21:42:02 +0000140#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000141#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000142#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000143#include <sys/socket.h>
144#include <netinet/in.h>
Tim Peters603c6832001-11-05 02:45:59 +0000145#if !(defined(__BEOS__) || defined(__CYGWIN__) || (defined(PYOS_OS2) && defined(PYCC_VACPP)))
Andrew M. Kuchling52a644c2000-03-31 17:24:30 +0000146#include <netinet/tcp.h>
Fred Drake11b09362000-05-16 13:30:12 +0000147#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000148
Guido van Rossum9376b741999-09-15 22:01:40 +0000149/* Headers needed for inet_ntoa() and inet_addr() */
150#ifdef __BEOS__
151#include <net/netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000152#elif defined(PYOS_OS2) && defined(PYCC_VACPP)
153#include <netdb.h>
154typedef size_t socklen_t;
Guido van Rossum9376b741999-09-15 22:01:40 +0000155#else
Guido van Rossumff3ab422000-04-24 15:16:03 +0000156#ifndef USE_GUSI1
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000157#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000158#endif
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000159#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000160
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000161#ifndef RISCOS
Guido van Rossume4485b01994-09-07 14:32:49 +0000162#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000163#else
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000164#include <sys/fcntl.h>
165#define NO_DUP
166int h_errno; /* not used */
167#endif
168#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000169#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000170#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000171#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000172
Guido van Rossum48a680c2001-03-02 06:34:14 +0000173
Guido van Rossumb6775db1994-08-01 11:34:53 +0000174#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000175#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000176#else
177#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000178#endif
179
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000180#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000181#include <sys/ioctl.h>
182#include <net/if.h>
183#include <netpacket/packet.h>
184#endif
185
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000186#ifdef HAVE_STDDEF_H
187#include <stddef.h>
188#endif
189
190#ifndef offsetof
191#define offsetof(type, member) ((size_t)(&((type *)0)->member))
192#endif
193
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000194#ifndef O_NDELAY
195#define O_NDELAY O_NONBLOCK /* For QNX only? */
196#endif
197
Guido van Rossumff3ab422000-04-24 15:16:03 +0000198#ifdef USE_GUSI1
Jack Jansen508537b1996-02-14 15:57:45 +0000199/* fdopen() isn't declared in stdio.h (sigh) */
200#include <GUSI.h>
201#endif
202
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000203#include "addrinfo.h"
204
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000205#ifdef USE_SSL
Andrew M. Kuchling697a0b02001-01-18 17:41:41 +0000206#include "openssl/rsa.h"
207#include "openssl/crypto.h"
208#include "openssl/x509.h"
209#include "openssl/pem.h"
210#include "openssl/ssl.h"
211#include "openssl/err.h"
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +0000212#include "openssl/rand.h"
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000213#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000214
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000215#ifndef HAVE_INET_PTON
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000216int inet_pton (int af, const char *src, void *dst);
217const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000218#endif
219
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000220#ifdef __APPLE__
221/* On OS X, getaddrinfo returns no error indication of lookup
222 failure, so we must use the emulation instead of the libinfo
223 implementation. Unfortunately, performing an autoconf test
224 for this bug would require DNS access for the machine performing
225 the configuration, which is not acceptable. Therefore, we
226 determine the bug just by checking for __APPLE__. If this bug
227 gets ever fixed, perhaps checking for sys/version.h would be
228 appropriate, which is 10/0 on the system with the bug. */
229#undef HAVE_GETADDRINFO
230/* avoid clashes with the C library definition of the symbol. */
231#define getaddrinfo fake_getaddrinfo
232#endif
233
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000234/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000235#if !defined(HAVE_GETADDRINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000236#include "getaddrinfo.c"
237#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000238#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000239#include "getnameinfo.c"
240#endif
241
Guido van Rossumbcc20741998-08-04 22:53:56 +0000242#if defined(MS_WINDOWS) || defined(__BEOS__)
243/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000244/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000245#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000246#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000247#endif
248
Fred Drakea04eaad2000-06-30 02:46:07 +0000249/* abstract the socket file descriptor type */
250#ifdef MS_WINDOWS
251typedef SOCKET SOCKET_T;
252# ifdef MS_WIN64
253# define SIZEOF_SOCKET_T 8
254# else
255# define SIZEOF_SOCKET_T 4
256# endif
257#else
258typedef int SOCKET_T;
259# define SIZEOF_SOCKET_T SIZEOF_INT
260#endif
261
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000262#ifdef MS_WIN32
263# define EAFNOSUPPORT WSAEAFNOSUPPORT
264# define snprintf _snprintf
265#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000266
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000267#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000268#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000269#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000270#endif
271
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000272#ifndef SOCKETCLOSE
273#define SOCKETCLOSE close
274#endif
275
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000276
277/* XXX There's a problem here: *static* functions are not supposed to have
278 a Py prefix (or use CapitalizedWords). Later... */
279
Guido van Rossum30a685f1991-06-27 15:51:29 +0000280/* Global variable holding the exception type for errors detected
281 by this module (but not argument type or memory errors, etc.). */
282
Guido van Rossum73624e91994-10-10 17:59:00 +0000283static PyObject *PySocket_Error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000284static PyObject *PyH_Error;
285static PyObject *PyGAI_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000286
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000287#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000288static PyObject *PySSLErrorObject;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000289#endif /* USE_SSL */
290
Guido van Rossum30a685f1991-06-27 15:51:29 +0000291
Guido van Rossum48a680c2001-03-02 06:34:14 +0000292#ifdef RISCOS
293/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
294static int taskwindow;
295#endif
296
297
Guido van Rossum30a685f1991-06-27 15:51:29 +0000298/* Convenience function to raise an error according to errno
299 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000300
Guido van Rossum73624e91994-10-10 17:59:00 +0000301static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000302PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000303{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000304#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000305 int err_no = WSAGetLastError();
306 if (err_no) {
307 static struct { int no; const char *msg; } *msgp, msgs[] = {
308 { WSAEINTR, "Interrupted system call" },
309 { WSAEBADF, "Bad file descriptor" },
310 { WSAEACCES, "Permission denied" },
311 { WSAEFAULT, "Bad address" },
312 { WSAEINVAL, "Invalid argument" },
313 { WSAEMFILE, "Too many open files" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000314 { WSAEWOULDBLOCK,
Mark Hammond46a733d2000-07-24 01:45:11 +0000315 "The socket operation could not complete "
316 "without blocking" },
317 { WSAEINPROGRESS, "Operation now in progress" },
318 { WSAEALREADY, "Operation already in progress" },
319 { WSAENOTSOCK, "Socket operation on non-socket" },
320 { WSAEDESTADDRREQ, "Destination address required" },
321 { WSAEMSGSIZE, "Message too long" },
322 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
323 { WSAENOPROTOOPT, "Protocol not available" },
324 { WSAEPROTONOSUPPORT, "Protocol not supported" },
325 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
326 { WSAEOPNOTSUPP, "Operation not supported" },
327 { WSAEPFNOSUPPORT, "Protocol family not supported" },
328 { WSAEAFNOSUPPORT, "Address family not supported" },
329 { WSAEADDRINUSE, "Address already in use" },
330 { WSAEADDRNOTAVAIL,
331 "Can't assign requested address" },
332 { WSAENETDOWN, "Network is down" },
333 { WSAENETUNREACH, "Network is unreachable" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000334 { WSAENETRESET,
Mark Hammond46a733d2000-07-24 01:45:11 +0000335 "Network dropped connection on reset" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000336 { WSAECONNABORTED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000337 "Software caused connection abort" },
338 { WSAECONNRESET, "Connection reset by peer" },
339 { WSAENOBUFS, "No buffer space available" },
340 { WSAEISCONN, "Socket is already connected" },
341 { WSAENOTCONN, "Socket is not connected" },
342 { WSAESHUTDOWN, "Can't send after socket shutdown" },
343 { WSAETOOMANYREFS,
344 "Too many references: can't splice" },
345 { WSAETIMEDOUT, "Operation timed out" },
346 { WSAECONNREFUSED, "Connection refused" },
347 { WSAELOOP, "Too many levels of symbolic links" },
348 { WSAENAMETOOLONG, "File name too long" },
349 { WSAEHOSTDOWN, "Host is down" },
350 { WSAEHOSTUNREACH, "No route to host" },
351 { WSAENOTEMPTY, "Directory not empty" },
352 { WSAEPROCLIM, "Too many processes" },
353 { WSAEUSERS, "Too many users" },
354 { WSAEDQUOT, "Disc quota exceeded" },
355 { WSAESTALE, "Stale NFS file handle" },
356 { WSAEREMOTE, "Too many levels of remote in path" },
357 { WSASYSNOTREADY,
358 "Network subsystem is unvailable" },
359 { WSAVERNOTSUPPORTED,
360 "WinSock version is not supported" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000361 { WSANOTINITIALISED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000362 "Successful WSAStartup() not yet performed" },
363 { WSAEDISCON, "Graceful shutdown in progress" },
364 /* Resolver errors */
365 { WSAHOST_NOT_FOUND, "No such host is known" },
366 { WSATRY_AGAIN, "Host not found, or server failed" },
367 { WSANO_RECOVERY,
368 "Unexpected server error encountered" },
369 { WSANO_DATA, "Valid name without requested data" },
370 { WSANO_ADDRESS, "No address, look for MX record" },
371 { 0, NULL }
372 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000373 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000374 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000375
Mark Hammond46a733d2000-07-24 01:45:11 +0000376 for (msgp = msgs; msgp->msg; msgp++) {
377 if (err_no == msgp->no) {
378 msg = msgp->msg;
379 break;
380 }
381 }
382
383 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000384 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000385 PyErr_SetObject(PySocket_Error, v);
386 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000387 }
388 return NULL;
389 }
390 else
391#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000392
393#if defined(PYOS_OS2)
394 if (sock_errno() != NO_ERROR) {
395 APIRET rc;
396 ULONG msglen;
397 char outbuf[100];
398 int myerrorcode = sock_errno();
399
400 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
401 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
402 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
403 if (rc == NO_ERROR) {
404 PyObject *v;
405
406 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
407 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
408 char *lastc = &outbuf[ strlen(outbuf)-1 ];
409 while (lastc > outbuf && isspace(*lastc))
410 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
411 }
412 v = Py_BuildValue("(is)", myerrorcode, outbuf);
413 if (v != NULL) {
414 PyErr_SetObject(PySocket_Error, v);
415 Py_DECREF(v);
416 }
417 return NULL;
418 }
419 }
420#endif
421
Guido van Rossum73624e91994-10-10 17:59:00 +0000422 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000423}
424
Guido van Rossum30a685f1991-06-27 15:51:29 +0000425
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000426static PyObject *
427PyH_Err(int h_error)
428{
429 PyObject *v;
430
431#ifdef HAVE_HSTRERROR
432 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
433#else
434 v = Py_BuildValue("(is)", h_error, "host not found");
435#endif
436 if (v != NULL) {
Martin v. Löwis864e9ff2001-08-04 22:32:03 +0000437 PyErr_SetObject(PyH_Error, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000438 Py_DECREF(v);
439 }
440
441 return NULL;
442}
443
444
445static PyObject *
446PyGAI_Err(int error)
447{
448 PyObject *v;
449
450 if (error == EAI_SYSTEM)
451 return PySocket_Err();
452
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000453#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000454 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000455#else
456 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
457#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000458 if (v != NULL) {
459 PyErr_SetObject(PyGAI_Error, v);
460 Py_DECREF(v);
461 }
462
463 return NULL;
464}
465
466
Guido van Rossum30a685f1991-06-27 15:51:29 +0000467/* The object holding a socket. It holds some extra information,
468 like the address family, which is used to decode socket address
469 arguments properly. */
470
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000471typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000472 PyObject_HEAD
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000473 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000474 int sock_family; /* Address family, e.g., AF_INET */
475 int sock_type; /* Socket type, e.g., SOCK_STREAM */
476 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000477 union sock_addr {
478 struct sockaddr_in in;
479#ifdef AF_UNIX
480 struct sockaddr_un un;
481#endif
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000482#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000483 struct sockaddr_in6 in6;
484 struct sockaddr_storage storage;
485#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000486#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000487 struct sockaddr_ll ll;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000488#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000489 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000490} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000491
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000492#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000493
Jeremy Hyltonba699362001-10-11 17:23:34 +0000494#define X509_NAME_MAXLEN 256
495
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000496typedef struct {
497 PyObject_HEAD
498 PySocketSockObject *Socket; /* Socket on which we're layered */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000499 SSL_CTX* ctx;
500 SSL* ssl;
501 X509* server_cert;
502 BIO* sbio;
Jeremy Hyltonba699362001-10-11 17:23:34 +0000503 char server[X509_NAME_MAXLEN];
504 char issuer[X509_NAME_MAXLEN];
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000505
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000506} PySSLObject;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000507
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000508staticforward PyTypeObject PySSL_Type;
509staticforward PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args);
510staticforward PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000511
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000512#define PySSLObject_Check(v) ((v)->ob_type == &PySSL_Type)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000513
514#endif /* USE_SSL */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000515
Guido van Rossum30a685f1991-06-27 15:51:29 +0000516/* A forward reference to the Socktype type object.
517 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000518 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000519 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000520
Guido van Rossum73624e91994-10-10 17:59:00 +0000521staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000522
Guido van Rossum30a685f1991-06-27 15:51:29 +0000523
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000524/* Initialize a new socket object. */
525
526static void
527init_sockobject(PySocketSockObject *s,
528 SOCKET_T fd, int family, int type, int proto)
529{
530#ifdef RISCOS
531 int block = 1;
532#endif
533 s->sock_fd = fd;
534 s->sock_family = family;
535 s->sock_type = type;
536 s->sock_proto = proto;
537#ifdef RISCOS
538 if(taskwindow) {
539 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
540 }
541#endif
542}
543
544
Guido van Rossum30a685f1991-06-27 15:51:29 +0000545/* Create a new socket object.
546 This just creates the object and initializes it.
547 If the creation fails, return NULL and set an exception (implicit
548 in NEWOBJ()). */
549
Guido van Rossum73624e91994-10-10 17:59:00 +0000550static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000551PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000552{
Guido van Rossum73624e91994-10-10 17:59:00 +0000553 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000554 s = (PySocketSockObject *)
555 PyType_GenericNew(&PySocketSock_Type, NULL, NULL);
556 if (s != NULL)
557 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000558 return s;
559}
560
Guido van Rossum30a685f1991-06-27 15:51:29 +0000561
Guido van Rossum48a680c2001-03-02 06:34:14 +0000562/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000563 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000564#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000565PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000566#endif
567
568
Guido van Rossum30a685f1991-06-27 15:51:29 +0000569/* Convert a string specifying a host name or one of a few symbolic
570 names to a numeric IP address. This usually calls gethostbyname()
571 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000572 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000573 an error occurred; then an exception is raised. */
574
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000575static int
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000576setipaddr(char* name, struct sockaddr * addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000577{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000578 struct addrinfo hints, *res;
579 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000580
Guido van Rossuma376cc51996-12-05 23:43:35 +0000581 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000582 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000583 int siz;
584 memset(&hints, 0, sizeof(hints));
585 hints.ai_family = af;
586 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
587 hints.ai_flags = AI_PASSIVE;
588 error = getaddrinfo(NULL, "0", &hints, &res);
589 if (error) {
590 PyGAI_Err(error);
591 return -1;
592 }
593 switch (res->ai_family) {
594 case AF_INET:
595 siz = 4;
596 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000597#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000598 case AF_INET6:
599 siz = 16;
600 break;
601#endif
602 default:
603 freeaddrinfo(res);
604 PyErr_SetString(PySocket_Error,
605 "unsupported address family");
606 return -1;
607 }
608 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000609 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000610 PyErr_SetString(PySocket_Error,
611 "wildcard resolved to multiple address");
612 return -1;
613 }
614 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
615 freeaddrinfo(res);
616 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000617 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000618 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000619 struct sockaddr_in *sin;
620 if (af != PF_INET && af != PF_UNSPEC) {
621 PyErr_SetString(PySocket_Error,
622 "address family mismatched");
623 return -1;
624 }
625 sin = (struct sockaddr_in *)addr_ret;
626 memset((void *) sin, '\0', sizeof(*sin));
627 sin->sin_family = AF_INET;
628#ifdef HAVE_SOCKADDR_SA_LEN
629 sin->sin_len = sizeof(*sin);
630#endif
631 sin->sin_addr.s_addr = INADDR_BROADCAST;
632 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000633 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000634 memset(&hints, 0, sizeof(hints));
635 hints.ai_family = af;
636 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000637#if defined(__digital__) && defined(__unix__)
Martin v. Löwisb8fc9722001-10-24 17:35:46 +0000638 if (error == EAI_NONAME && af == AF_UNSPEC) {
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000639 /* On Tru64 V5.1, numeric-to-addr conversion
Martin v. Löwis861a65b2001-10-24 14:36:00 +0000640 fails if no address family is given. Assume IPv4 for now.*/
641 hints.ai_family = AF_INET;
642 error = getaddrinfo(name, NULL, &hints, &res);
643 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000644#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000645 if (error) {
646 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000647 return -1;
648 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000649 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
650 freeaddrinfo(res);
651 switch (addr_ret->sa_family) {
652 case AF_INET:
653 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000654#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000655 case AF_INET6:
656 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000657#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000658 default:
659 PyErr_SetString(PySocket_Error, "unknown address family");
660 return -1;
661 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000662}
663
Guido van Rossum30a685f1991-06-27 15:51:29 +0000664
Guido van Rossum30a685f1991-06-27 15:51:29 +0000665/* Create a string object representing an IP address.
666 This is always a string of the form 'dd.dd.dd.dd' (with variable
667 size numbers). */
668
Guido van Rossum73624e91994-10-10 17:59:00 +0000669static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000670makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000671{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000672 char buf[NI_MAXHOST];
673 int error;
674
675 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
676 NI_NUMERICHOST);
677 if (error) {
678 PyGAI_Err(error);
679 return NULL;
680 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000681 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000682}
683
684
685/* Create an object representing the given socket address,
686 suitable for passing it back to bind(), connect() etc.
687 The family field of the sockaddr structure is inspected
688 to determine what kind of address it really is. */
689
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000690/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000691static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000692makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000693{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000694 if (addrlen == 0) {
695 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000696 Py_INCREF(Py_None);
697 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000698 }
699
Guido van Rossumbcc20741998-08-04 22:53:56 +0000700#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000701 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000702 addr->sa_family = AF_INET;
703#endif
704
Guido van Rossum30a685f1991-06-27 15:51:29 +0000705 switch (addr->sa_family) {
706
707 case AF_INET:
708 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000709 struct sockaddr_in *a;
710 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000711 PyObject *ret = NULL;
712 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000713 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000714 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
715 Py_DECREF(addrobj);
716 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000717 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000718 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000719
Guido van Rossumb6775db1994-08-01 11:34:53 +0000720#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000721 case AF_UNIX:
722 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000723 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000724 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000725 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000726#endif /* AF_UNIX */
727
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000728#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000729 case AF_INET6:
730 {
731 struct sockaddr_in6 *a;
732 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
733 PyObject *ret = NULL;
734 if (addrobj) {
735 a = (struct sockaddr_in6 *)addr;
736 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
737 a->sin6_flowinfo, a->sin6_scope_id);
738 Py_DECREF(addrobj);
739 }
740 return ret;
741 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000742#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000743
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000744#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000745 case AF_PACKET:
746 {
747 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
748 char *ifname = "";
749 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000750 /* need to look up interface name give index */
751 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000752 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000753 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000754 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000755 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000756 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000757 a->sll_pkttype, a->sll_hatype,
758 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000759 }
760#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000761
Guido van Rossum30a685f1991-06-27 15:51:29 +0000762 /* More cases here... */
763
764 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000765 /* If we don't know the address family, don't raise an
766 exception -- return it as a tuple. */
767 return Py_BuildValue("is#",
768 addr->sa_family,
769 addr->sa_data,
770 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000771
Guido van Rossum30a685f1991-06-27 15:51:29 +0000772 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000773}
774
Guido van Rossum30a685f1991-06-27 15:51:29 +0000775
776/* Parse a socket address argument according to the socket object's
777 address family. Return 1 if the address was in the proper format,
778 0 of not. The address is returned through addr_ret, its length
779 through len_ret. */
780
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000781static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000782getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000783 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000784{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000785 switch (s->sock_family) {
786
Guido van Rossumb6775db1994-08-01 11:34:53 +0000787#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000788 case AF_UNIX:
789 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000790 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000791 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000792 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000793 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000794 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000795 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000796 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000797 PyErr_SetString(PySocket_Error,
798 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000799 return 0;
800 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000801 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000802 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000803 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000804 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000805 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000806 return 1;
807 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000808#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000809
Guido van Rossum30a685f1991-06-27 15:51:29 +0000810 case AF_INET:
811 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000812 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000813 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000814 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000815 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000816 if (!PyTuple_Check(args)) {
817 PyErr_Format(PyExc_TypeError,
818 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
819 args->ob_type->tp_name);
820 return 0;
821 }
822 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000823 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000824 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000825 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000826 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000827 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000828 *addr_ret = (struct sockaddr *) addr;
829 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000830 return 1;
831 }
832
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000833#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000834 case AF_INET6:
835 {
836 struct sockaddr_in6* addr;
837 char *host;
838 int port, flowinfo, scope_id;
839 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
840 flowinfo = scope_id = 0;
841 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
842 &scope_id)) {
843 return 0;
844 }
845 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
846 return 0;
847 addr->sin6_family = s->sock_family;
848 addr->sin6_port = htons((short)port);
849 addr->sin6_flowinfo = flowinfo;
850 addr->sin6_scope_id = scope_id;
851 *addr_ret = (struct sockaddr *) addr;
852 *len_ret = sizeof *addr;
853 return 1;
854 }
855#endif
856
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000857#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000858 case AF_PACKET:
859 {
860 struct sockaddr_ll* addr;
861 struct ifreq ifr;
862 char *interfaceName;
863 int protoNumber;
864 int hatype = 0;
865 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000866 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000867
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000868 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
869 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000870 return 0;
871 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
872 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000873 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +0000874 PySocket_Err();
Jeremy Hylton22308652001-02-02 03:23:09 +0000875 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000876 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000877 addr = &(s->sock_addr.ll);
878 addr->sll_family = AF_PACKET;
879 addr->sll_protocol = htons((short)protoNumber);
880 addr->sll_ifindex = ifr.ifr_ifindex;
881 addr->sll_pkttype = pkttype;
882 addr->sll_hatype = hatype;
883 *addr_ret = (struct sockaddr *) addr;
884 *len_ret = sizeof *addr;
885 return 1;
886 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000887#endif
888
Guido van Rossum30a685f1991-06-27 15:51:29 +0000889 /* More cases here... */
890
891 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000892 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000893 return 0;
894
895 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000896}
897
Guido van Rossum30a685f1991-06-27 15:51:29 +0000898
Guido van Rossum48a680c2001-03-02 06:34:14 +0000899/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000900 Return 1 if the family is known, 0 otherwise. The length is returned
901 through len_ret. */
902
903static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000904getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000905{
906 switch (s->sock_family) {
907
Guido van Rossumb6775db1994-08-01 11:34:53 +0000908#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000909 case AF_UNIX:
910 {
911 *len_ret = sizeof (struct sockaddr_un);
912 return 1;
913 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000914#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000915
916 case AF_INET:
917 {
918 *len_ret = sizeof (struct sockaddr_in);
919 return 1;
920 }
921
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000922#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000923 case AF_INET6:
924 {
925 *len_ret = sizeof (struct sockaddr_in6);
926 return 1;
927 }
928#endif
929
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000930#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000931 case AF_PACKET:
932 {
933 *len_ret = sizeof (struct sockaddr_ll);
934 return 1;
935 }
936#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000937
Guido van Rossum710e1df1992-06-12 10:39:36 +0000938 /* More cases here... */
939
940 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000941 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000942 return 0;
943
944 }
945}
946
947
Guido van Rossum30a685f1991-06-27 15:51:29 +0000948/* s.accept() method */
949
Guido van Rossum73624e91994-10-10 17:59:00 +0000950static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000951PySocketSock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000952{
953 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000954 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000955 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000956 PyObject *sock = NULL;
957 PyObject *addr = NULL;
958 PyObject *res = NULL;
959
Guido van Rossum710e1df1992-06-12 10:39:36 +0000960 if (!getsockaddrlen(s, &addrlen))
961 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000962 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000963 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000964 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000965 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000966#ifdef MS_WINDOWS
967 if (newfd == INVALID_SOCKET)
968#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000969 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000970#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000971 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000972
Guido van Rossum30a685f1991-06-27 15:51:29 +0000973 /* Create the new object with unspecified family,
974 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000975 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000976 s->sock_family,
977 s->sock_type,
978 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000979 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000980 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000981 goto finally;
982 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000983 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000984 addrlen);
985 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000986 goto finally;
987
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000988 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000989
990 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000991 Py_XDECREF(sock);
992 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000993 return res;
994}
995
Guido van Rossum82a5c661998-07-07 20:45:43 +0000996static char accept_doc[] =
997"accept() -> (socket object, address info)\n\
998\n\
999Wait for an incoming connection. Return a new socket representing the\n\
1000connection, and the address of the client. For IP sockets, the address\n\
1001info is a pair (hostaddr, port).";
1002
Guido van Rossum30a685f1991-06-27 15:51:29 +00001003
Guido van Rossume4485b01994-09-07 14:32:49 +00001004/* s.setblocking(1 | 0) method */
1005
Guido van Rossum73624e91994-10-10 17:59:00 +00001006static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001007PySocketSock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001008{
1009 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001010#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +00001011#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +00001012 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +00001013#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001014#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001015 block = PyInt_AsLong(arg);
1016 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001017 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001018 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +00001019#ifdef __BEOS__
1020 block = !block;
1021 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
1022 (void *)(&block), sizeof( int ) );
1023#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001024#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001025#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001026#ifdef PYOS_OS2
1027 block = !block;
1028 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
1029#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +00001030 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
1031 if (block)
1032 delay_flag &= (~O_NDELAY);
1033 else
1034 delay_flag |= O_NDELAY;
1035 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001036#endif /* !PYOS_OS2 */
1037#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001038 block = !block;
1039 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001040#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +00001041#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001042#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001043 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +00001044
Guido van Rossum73624e91994-10-10 17:59:00 +00001045 Py_INCREF(Py_None);
1046 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001047}
Guido van Rossume4485b01994-09-07 14:32:49 +00001048
Guido van Rossum82a5c661998-07-07 20:45:43 +00001049static char setblocking_doc[] =
1050"setblocking(flag)\n\
1051\n\
1052Set the socket to blocking (flag is true) or non-blocking (false).\n\
1053This uses the FIONBIO ioctl with the O_NDELAY flag.";
1054
Guido van Rossume4485b01994-09-07 14:32:49 +00001055
Guido van Rossum48a680c2001-03-02 06:34:14 +00001056#ifdef RISCOS
1057/* s.sleeptaskw(1 | 0) method */
1058
1059static PyObject *
1060PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
1061{
1062 int block;
1063 int delay_flag;
1064 if (!PyArg_GetInt(args, &block))
1065 return NULL;
1066 Py_BEGIN_ALLOW_THREADS
1067 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1068 Py_END_ALLOW_THREADS
1069
1070 Py_INCREF(Py_None);
1071 return Py_None;
1072}
1073static char sleeptaskw_doc[] =
1074"sleeptaskw(flag)\n\
1075\n\
1076Allow sleeps in taskwindows.";
1077#endif
1078
1079
Guido van Rossumaee08791992-09-08 09:05:33 +00001080/* s.setsockopt() method.
1081 With an integer third argument, sets an integer option.
1082 With a string third argument, sets an option from a buffer;
1083 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001084
Guido van Rossum73624e91994-10-10 17:59:00 +00001085static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001086PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001087{
1088 int level;
1089 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001090 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001091 char *buf;
1092 int buflen;
1093 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001094
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001095 if (PyArg_ParseTuple(args, "iii:setsockopt",
1096 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001097 buf = (char *) &flag;
1098 buflen = sizeof flag;
1099 }
1100 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001101 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001102 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1103 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001104 return NULL;
1105 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001106 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001107 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001108 return PySocket_Err();
1109 Py_INCREF(Py_None);
1110 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001111}
1112
Guido van Rossum82a5c661998-07-07 20:45:43 +00001113static char setsockopt_doc[] =
1114"setsockopt(level, option, value)\n\
1115\n\
1116Set a socket option. See the Unix manual for level and option.\n\
1117The value argument can either be an integer or a string.";
1118
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001119
Guido van Rossumaee08791992-09-08 09:05:33 +00001120/* s.getsockopt() method.
1121 With two arguments, retrieves an integer option.
1122 With a third integer argument, retrieves a string buffer of that size;
1123 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001124
Guido van Rossum73624e91994-10-10 17:59:00 +00001125static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001126PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001127{
1128 int level;
1129 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001130 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001131 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001132 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001133
Guido van Rossumbcc20741998-08-04 22:53:56 +00001134#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001135 /* We have incomplete socket support. */
1136 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001137 return NULL;
1138#else
1139
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001140 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1141 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001142 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001143
Guido van Rossumbe32c891996-06-20 16:25:29 +00001144 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001145 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001146 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001147 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001148 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001149 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001150 return PySocket_Err();
1151 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001152 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001153 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001154 PyErr_SetString(PySocket_Error,
1155 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001156 return NULL;
1157 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001158 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001159 if (buf == NULL)
1160 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001161 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001162 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001163 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001164 Py_DECREF(buf);
1165 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +00001166 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001167 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001168 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001169#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001170}
1171
Guido van Rossum82a5c661998-07-07 20:45:43 +00001172static char getsockopt_doc[] =
1173"getsockopt(level, option[, buffersize]) -> value\n\
1174\n\
1175Get a socket option. See the Unix manual for level and option.\n\
1176If a nonzero buffersize argument is given, the return value is a\n\
1177string of that length; otherwise it is an integer.";
1178
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001179
Fred Drake728819a2000-07-01 03:40:12 +00001180/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001181
Guido van Rossum73624e91994-10-10 17:59:00 +00001182static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001183PySocketSock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001184{
1185 struct sockaddr *addr;
1186 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001187 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001188
Fred Drake728819a2000-07-01 03:40:12 +00001189 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001190 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001191 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001192 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001193 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001194 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001195 return PySocket_Err();
1196 Py_INCREF(Py_None);
1197 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001198}
1199
Guido van Rossum82a5c661998-07-07 20:45:43 +00001200static char bind_doc[] =
1201"bind(address)\n\
1202\n\
1203Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001204pair (host, port); the host must refer to the local host. For raw packet\n\
1205sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001206
Guido van Rossum30a685f1991-06-27 15:51:29 +00001207
1208/* s.close() method.
1209 Set the file descriptor to -1 so operations tried subsequently
1210 will surely fail. */
1211
Guido van Rossum73624e91994-10-10 17:59:00 +00001212static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001213PySocketSock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001214{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001215 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001216
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001217 if ((fd = s->sock_fd) != -1) {
1218 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001219 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001220 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001221 Py_END_ALLOW_THREADS
1222 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001223 Py_INCREF(Py_None);
1224 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001225}
1226
Guido van Rossum82a5c661998-07-07 20:45:43 +00001227static char close_doc[] =
1228"close()\n\
1229\n\
1230Close the socket. It cannot be used after this call.";
1231
Guido van Rossum30a685f1991-06-27 15:51:29 +00001232
Fred Drake728819a2000-07-01 03:40:12 +00001233/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001234
Guido van Rossum73624e91994-10-10 17:59:00 +00001235static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001236PySocketSock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001237{
1238 struct sockaddr *addr;
1239 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001240 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001241
Fred Drake728819a2000-07-01 03:40:12 +00001242 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001243 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001244 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001245 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001246 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001247 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001248 return PySocket_Err();
1249 Py_INCREF(Py_None);
1250 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001251}
1252
Guido van Rossum82a5c661998-07-07 20:45:43 +00001253static char connect_doc[] =
1254"connect(address)\n\
1255\n\
1256Connect the socket to a remote address. For IP sockets, the address\n\
1257is a pair (host, port).";
1258
Guido van Rossum30a685f1991-06-27 15:51:29 +00001259
Fred Drake728819a2000-07-01 03:40:12 +00001260/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001261
1262static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001263PySocketSock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001264{
1265 struct sockaddr *addr;
1266 int addrlen;
1267 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001268
Fred Drake728819a2000-07-01 03:40:12 +00001269 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001270 return NULL;
1271 Py_BEGIN_ALLOW_THREADS
1272 res = connect(s->sock_fd, addr, addrlen);
1273 Py_END_ALLOW_THREADS
Tim Petersc32410a2001-10-30 01:26:49 +00001274 if (res != 0) {
1275#ifdef MS_WINDOWS
1276 res = WSAGetLastError();
1277#else
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001278 res = errno;
Tim Petersc32410a2001-10-30 01:26:49 +00001279#endif
1280 }
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001281 return PyInt_FromLong((long) res);
1282}
1283
Guido van Rossum82a5c661998-07-07 20:45:43 +00001284static char connect_ex_doc[] =
1285"connect_ex(address)\n\
1286\n\
1287This is like connect(address), but returns an error code (the errno value)\n\
1288instead of raising an exception when an error occurs.";
1289
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001290
Guido van Rossumed233a51992-06-23 09:07:03 +00001291/* s.fileno() method */
1292
Guido van Rossum73624e91994-10-10 17:59:00 +00001293static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001294PySocketSock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001295{
Fred Drakea04eaad2000-06-30 02:46:07 +00001296#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001297 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001298#else
1299 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1300#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001301}
1302
Guido van Rossum82a5c661998-07-07 20:45:43 +00001303static char fileno_doc[] =
1304"fileno() -> integer\n\
1305\n\
1306Return the integer file descriptor of the socket.";
1307
Guido van Rossumed233a51992-06-23 09:07:03 +00001308
Guido van Rossumbe32c891996-06-20 16:25:29 +00001309#ifndef NO_DUP
1310/* s.dup() method */
1311
1312static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001313PySocketSock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001314{
Fred Drakea04eaad2000-06-30 02:46:07 +00001315 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001316 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001317
Guido van Rossumbe32c891996-06-20 16:25:29 +00001318 newfd = dup(s->sock_fd);
1319 if (newfd < 0)
1320 return PySocket_Err();
1321 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001322 s->sock_family,
1323 s->sock_type,
1324 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001325 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001326 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001327 return sock;
1328}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001329
1330static char dup_doc[] =
1331"dup() -> socket object\n\
1332\n\
1333Return a new socket object connected to the same system resource.";
1334
Guido van Rossumbe32c891996-06-20 16:25:29 +00001335#endif
1336
1337
Guido van Rossumc89705d1992-11-26 08:54:07 +00001338/* s.getsockname() method */
1339
Guido van Rossum73624e91994-10-10 17:59:00 +00001340static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001341PySocketSock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001342{
1343 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001344 int res;
1345 socklen_t addrlen;
1346
Guido van Rossumc89705d1992-11-26 08:54:07 +00001347 if (!getsockaddrlen(s, &addrlen))
1348 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001349 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001350 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001351 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001352 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001353 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001354 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001355 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001356}
1357
Guido van Rossum82a5c661998-07-07 20:45:43 +00001358static char getsockname_doc[] =
1359"getsockname() -> address info\n\
1360\n\
1361Return the address of the local endpoint. For IP sockets, the address\n\
1362info is a pair (hostaddr, port).";
1363
Guido van Rossumc89705d1992-11-26 08:54:07 +00001364
Guido van Rossumb6775db1994-08-01 11:34:53 +00001365#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001366/* s.getpeername() method */
1367
Guido van Rossum73624e91994-10-10 17:59:00 +00001368static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001369PySocketSock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001370{
1371 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001372 int res;
1373 socklen_t addrlen;
1374
Guido van Rossumc89705d1992-11-26 08:54:07 +00001375 if (!getsockaddrlen(s, &addrlen))
1376 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001377 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001378 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001379 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001380 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001381 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001382 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001383 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001384}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001385
1386static char getpeername_doc[] =
1387"getpeername() -> address info\n\
1388\n\
1389Return the address of the remote endpoint. For IP sockets, the address\n\
1390info is a pair (hostaddr, port).";
1391
Guido van Rossumb6775db1994-08-01 11:34:53 +00001392#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001393
1394
Guido van Rossum30a685f1991-06-27 15:51:29 +00001395/* s.listen(n) method */
1396
Guido van Rossum73624e91994-10-10 17:59:00 +00001397static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001398PySocketSock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001399{
1400 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001401 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001402
1403 backlog = PyInt_AsLong(arg);
1404 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001405 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001406 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001407 if (backlog < 1)
1408 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001409 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001410 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001411 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001412 return PySocket_Err();
1413 Py_INCREF(Py_None);
1414 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001415}
1416
Guido van Rossum82a5c661998-07-07 20:45:43 +00001417static char listen_doc[] =
1418"listen(backlog)\n\
1419\n\
1420Enable a server to accept connections. The backlog argument must be at\n\
1421least 1; it specifies the number of unaccepted connection that the system\n\
1422will allow before refusing new connections.";
1423
1424
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001425#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001426/* s.makefile(mode) method.
1427 Create a new open file object referring to a dupped version of
1428 the socket's file descriptor. (The dup() call is necessary so
1429 that the open file and socket objects may be closed independent
1430 of each other.)
1431 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1432
Guido van Rossum73624e91994-10-10 17:59:00 +00001433static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001434PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001435{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001436 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001437 char *mode = "r";
1438 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001439#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001440 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001441#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001442 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001443#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001444 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001445 PyObject *f;
1446
Guido van Rossum43713e52000-02-29 13:59:29 +00001447 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001448 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001449#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001450 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1451 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001452#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001453 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001454#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001455 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001456 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001457 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001458 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001459 }
1460 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1461 if (f != NULL)
1462 PyFile_SetBufSize(f, bufsize);
1463 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001464}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001465
1466static char makefile_doc[] =
1467"makefile([mode[, buffersize]]) -> file object\n\
1468\n\
1469Return a regular file object corresponding to the socket.\n\
1470The mode and buffersize arguments are as for the built-in open() function.";
1471
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001472#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001473
Guido van Rossum48a680c2001-03-02 06:34:14 +00001474
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001475/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001476
Guido van Rossum73624e91994-10-10 17:59:00 +00001477static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001478PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001479{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001480 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001481 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001482 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001483 return NULL;
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001484 if (len < 0) {
1485 PyErr_SetString(PyExc_ValueError,
1486 "negative buffersize in connect");
1487 return NULL;
1488 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001489 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001490 if (buf == NULL)
1491 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001492 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001493 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001494 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001495 if (n < 0) {
1496 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001497 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001498 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001499 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001500 return NULL;
1501 return buf;
1502}
1503
Guido van Rossum82a5c661998-07-07 20:45:43 +00001504static char recv_doc[] =
1505"recv(buffersize[, flags]) -> data\n\
1506\n\
1507Receive up to buffersize bytes from the socket. For the optional flags\n\
1508argument, see the Unix manual. When no data is available, block until\n\
1509at least one byte is available or until the remote end is closed. When\n\
1510the remote end is closed and all data is read, return the empty string.";
1511
Guido van Rossum30a685f1991-06-27 15:51:29 +00001512
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001513/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001514
Guido van Rossum73624e91994-10-10 17:59:00 +00001515static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001516PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001517{
1518 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001519 PyObject *buf = NULL;
1520 PyObject *addr = NULL;
1521 PyObject *ret = NULL;
1522
Guido van Rossumff3ab422000-04-24 15:16:03 +00001523 int len, n, flags = 0;
1524 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001525 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001526 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001527 if (!getsockaddrlen(s, &addrlen))
1528 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001529 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001530 if (buf == NULL)
1531 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001532 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001533 memset(addrbuf, 0, addrlen);
1534 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001535#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001536#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001537 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001538#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001539 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001540#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001541#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001542 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001543#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001544 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001545 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001546 if (n < 0) {
1547 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001548 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001549 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001550 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001551 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001552
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001553 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001554 goto finally;
1555
Guido van Rossum73624e91994-10-10 17:59:00 +00001556 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001557 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001558 Py_XDECREF(addr);
1559 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001560 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001561}
1562
Guido van Rossum82a5c661998-07-07 20:45:43 +00001563static char recvfrom_doc[] =
1564"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1565\n\
1566Like recv(buffersize, flags) but also return the sender's address info.";
1567
Guido van Rossum30a685f1991-06-27 15:51:29 +00001568
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001569/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001570
Guido van Rossum73624e91994-10-10 17:59:00 +00001571static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001572PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001573{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001574 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001575 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001576 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001577 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001578 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001579 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001580 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001581 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001582 return PySocket_Err();
1583 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001584}
1585
Guido van Rossum82a5c661998-07-07 20:45:43 +00001586static char send_doc[] =
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001587"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001588\n\
1589Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001590argument, see the Unix manual. Return the number of bytes\n\
1591sent; this may be less than len(data) if the network is busy.";
1592
1593
1594/* s.sendall(data [,flags]) method */
1595
1596static PyObject *
1597PySocketSock_sendall(PySocketSockObject *s, PyObject *args)
1598{
1599 char *buf;
1600 int len, n, flags = 0, total = 0;
1601 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1602 return NULL;
1603 Py_BEGIN_ALLOW_THREADS
1604 do {
1605 n = send(s->sock_fd, buf, len, flags);
1606 if (n < 0)
1607 break;
1608 total += n;
1609 buf += n;
1610 len -= n;
1611 } while (len > 0);
1612 Py_END_ALLOW_THREADS
1613 if (n < 0)
1614 return PySocket_Err();
1615 Py_INCREF(Py_None);
1616 return Py_None;
1617}
1618
1619static char sendall_doc[] =
1620"sendall(data[, flags])\n\
1621\n\
1622Send a data string to the socket. For the optional flags\n\
1623argument, see the Unix manual. This calls send() repeatedly\n\
1624until all data is sent. If an error occurs, it's impossible\n\
1625to tell how much data has been sent.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001626
Guido van Rossum30a685f1991-06-27 15:51:29 +00001627
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001628/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001629
Guido van Rossum73624e91994-10-10 17:59:00 +00001630static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001631PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001632{
Guido van Rossum73624e91994-10-10 17:59:00 +00001633 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001634 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001635 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001636 int addrlen, len, n, flags;
1637 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001638 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001639 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001640 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1641 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001642 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001643 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001644 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001645 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001646 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001647 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001648 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001649 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001650 return PySocket_Err();
1651 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001652}
1653
Guido van Rossum82a5c661998-07-07 20:45:43 +00001654static char sendto_doc[] =
1655"sendto(data[, flags], address)\n\
1656\n\
1657Like send(data, flags) but allows specifying the destination address.\n\
1658For IP sockets, the address is a pair (hostaddr, port).";
1659
Guido van Rossum30a685f1991-06-27 15:51:29 +00001660
1661/* s.shutdown(how) method */
1662
Guido van Rossum73624e91994-10-10 17:59:00 +00001663static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001664PySocketSock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001665{
1666 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001667 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001668
1669 how = PyInt_AsLong(arg);
1670 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001671 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001672 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001673 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001674 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001675 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001676 return PySocket_Err();
1677 Py_INCREF(Py_None);
1678 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001679}
1680
Guido van Rossum82a5c661998-07-07 20:45:43 +00001681static char shutdown_doc[] =
1682"shutdown(flag)\n\
1683\n\
1684Shut down the reading side of the socket (flag == 0), the writing side\n\
1685of the socket (flag == 1), or both ends (flag == 2).";
1686
Guido van Rossum30a685f1991-06-27 15:51:29 +00001687
1688/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001689
Guido van Rossum73624e91994-10-10 17:59:00 +00001690static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum17209fc2001-10-15 21:12:54 +00001691 {"accept", (PyCFunction)PySocketSock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001692 accept_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001693 {"bind", (PyCFunction)PySocketSock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001694 bind_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00001695 {"close", (PyCFunction)PySocketSock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001696 close_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001697 {"connect", (PyCFunction)PySocketSock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001698 connect_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001699 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001700 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001701#ifndef NO_DUP
Guido van Rossum17209fc2001-10-15 21:12:54 +00001702 {"dup", (PyCFunction)PySocketSock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001703 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001704#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001705 {"fileno", (PyCFunction)PySocketSock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001706 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001707#ifdef HAVE_GETPEERNAME
Guido van Rossum17209fc2001-10-15 21:12:54 +00001708 {"getpeername", (PyCFunction)PySocketSock_getpeername,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001709 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001710#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001711 {"getsockname", (PyCFunction)PySocketSock_getsockname,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001712 METH_NOARGS, getsockname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001713 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1714 getsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001715 {"listen", (PyCFunction)PySocketSock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001716 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001717#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001718 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1719 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001720#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001721 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1722 recv_doc},
1723 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1724 recvfrom_doc},
1725 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1726 send_doc},
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001727 {"sendall", (PyCFunction)PySocketSock_sendall, METH_VARARGS,
1728 sendall_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001729 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1730 sendto_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001731 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001732 setblocking_doc},
1733 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1734 setsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001735 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001736 shutdown_doc},
1737#ifdef RISCOS
1738 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1739 sleeptaskw_doc},
1740#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001741 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001742};
1743
Guido van Rossum30a685f1991-06-27 15:51:29 +00001744
Guido van Rossum73624e91994-10-10 17:59:00 +00001745/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001746 First close the file description. */
1747
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001748static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001749PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001750{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001751 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001752 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001753 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001754}
1755
Guido van Rossum30a685f1991-06-27 15:51:29 +00001756
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001757static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001758PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001759{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001760 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001761#if SIZEOF_SOCKET_T > SIZEOF_LONG
1762 if (s->sock_fd > LONG_MAX) {
1763 /* this can occur on Win64, and actually there is a special
1764 ugly printf formatter for decimal pointer length integer
1765 printing, only bother if necessary*/
1766 PyErr_SetString(PyExc_OverflowError,
1767 "no printf formatter to display the socket descriptor in decimal");
1768 return NULL;
1769 }
1770#endif
Tim Peters885d4572001-11-28 20:27:42 +00001771 PyOS_snprintf(buf, sizeof(buf),
1772 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1773 (long)s->sock_fd, s->sock_family,
1774 s->sock_type,
1775 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001776 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001777}
1778
1779
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001780/* Create a new, uninitialized socket object. */
1781
1782static PyObject *
1783PySocketSock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1784{
1785 PyObject *new;
1786
1787 new = type->tp_alloc(type, 0);
1788 if (new != NULL)
1789 ((PySocketSockObject *)new)->sock_fd = -1;
1790 return new;
1791}
1792
1793
1794/* Initialize a new socket object. */
1795
1796/*ARGSUSED*/
1797static int
1798PySocketSock_init(PyObject *self, PyObject *args, PyObject *kwds)
1799{
1800 PySocketSockObject *s = (PySocketSockObject *)self;
1801 SOCKET_T fd;
1802 int family = AF_INET, type = SOCK_STREAM, proto = 0;
1803 static char *keywords[] = {"family", "type", "proto", 0};
1804
1805 if (!PyArg_ParseTupleAndKeywords(args, kwds,
1806 "|iii:socket", keywords,
1807 &family, &type, &proto))
1808 return -1;
1809 Py_BEGIN_ALLOW_THREADS
1810 fd = socket(family, type, proto);
1811 Py_END_ALLOW_THREADS
1812#ifdef MS_WINDOWS
1813 if (fd == INVALID_SOCKET)
1814#else
1815 if (fd < 0)
1816#endif
1817 {
1818 PySocket_Err();
1819 return -1;
1820 }
1821 init_sockobject(s, fd, family, type, proto);
1822 /* From now on, ignore SIGPIPE and let the error checking
1823 do the work. */
1824#ifdef SIGPIPE
1825 (void) signal(SIGPIPE, SIG_IGN);
1826#endif
1827 return 0;
1828}
1829
1830
Guido van Rossumb6775db1994-08-01 11:34:53 +00001831/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001832
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001833static char socket_doc[] =
1834"socket([family[, type[, proto]]]) -> socket object\n\
1835\n\
1836Open a socket of the given type. The family argument specifies the\n\
1837address family; it defaults to AF_INET. The type argument specifies\n\
1838whether this is a stream (SOCK_STREAM, this is the default)\n\
1839or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1840specifying the default protocol.\n\
1841\n\
1842A socket represents one endpoint of a network connection.\n\
1843\n\
1844Methods:\n\
1845\n\
1846accept() -- accept a connection, returning new socket and client address\n\
1847bind() -- bind the socket to a local address\n\
1848close() -- close the socket\n\
1849connect() -- connect the socket to a remote address\n\
1850connect_ex() -- connect, return an error code instead of an exception \n\
1851dup() -- return a new socket object identical to the current one (*)\n\
1852fileno() -- return underlying file descriptor\n\
1853getpeername() -- return remote address (*)\n\
1854getsockname() -- return local address\n\
1855getsockopt() -- get socket options\n\
1856listen() -- start listening for incoming connections\n\
Andrew M. Kuchling3072ecd2001-11-28 04:28:31 +00001857makefile() -- return a file object corresponding to the socket (*)\n\
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001858recv() -- receive data\n\
1859recvfrom() -- receive data and sender's address\n\
1860send() -- send data, may not send all of it\n\
1861sendall() -- send all data\n\
1862sendto() -- send data to a given address\n\
1863setblocking() -- set or clear the blocking I/O flag\n\
1864setsockopt() -- set socket options\n\
1865shutdown() -- shut down traffic in one or both directions\n\
1866\n\
1867(*) not available on all platforms!)";
1868
Guido van Rossum73624e91994-10-10 17:59:00 +00001869static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001870 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001871 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00001872 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001873 sizeof(PySocketSockObject), /* tp_basicsize */
1874 0, /* tp_itemsize */
1875 (destructor)PySocketSock_dealloc, /* tp_dealloc */
1876 0, /* tp_print */
1877 0, /* tp_getattr */
1878 0, /* tp_setattr */
1879 0, /* tp_compare */
1880 (reprfunc)PySocketSock_repr, /* tp_repr */
1881 0, /* tp_as_number */
1882 0, /* tp_as_sequence */
1883 0, /* tp_as_mapping */
1884 0, /* tp_hash */
1885 0, /* tp_call */
1886 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001887 0, /* set below */ /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001888 0, /* tp_setattro */
1889 0, /* tp_as_buffer */
1890 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1891 socket_doc, /* tp_doc */
1892 0, /* tp_traverse */
1893 0, /* tp_clear */
1894 0, /* tp_richcompare */
1895 0, /* tp_weaklistoffset */
1896 0, /* tp_iter */
1897 0, /* tp_iternext */
1898 PySocketSock_methods, /* tp_methods */
1899 0, /* tp_members */
1900 0, /* tp_getset */
1901 0, /* tp_base */
1902 0, /* tp_dict */
1903 0, /* tp_descr_get */
1904 0, /* tp_descr_set */
1905 0, /* tp_dictoffset */
1906 PySocketSock_init, /* tp_init */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001907 0, /* set below */ /* tp_alloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001908 PySocketSock_new, /* tp_new */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001909 0, /* set below */ /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001910};
1911
Guido van Rossum30a685f1991-06-27 15:51:29 +00001912
Guido van Rossum81194471991-07-27 21:42:02 +00001913/* Python interface to gethostname(). */
1914
1915/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001916static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001917PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001918{
1919 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001920 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001921 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001922 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001923 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001924 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001925 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001926 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001927 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001928 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001929 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001930}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001931
Guido van Rossum82a5c661998-07-07 20:45:43 +00001932static char gethostname_doc[] =
1933"gethostname() -> string\n\
1934\n\
1935Return the current host name.";
1936
Guido van Rossumff4949e1992-08-05 19:58:53 +00001937
Guido van Rossum30a685f1991-06-27 15:51:29 +00001938/* Python interface to gethostbyname(name). */
1939
1940/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001941static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001942PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001943{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001944 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001945 struct sockaddr_storage addrbuf;
1946
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001947 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001948 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001949 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001950 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001951 return makeipaddr((struct sockaddr *)&addrbuf,
1952 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001953}
1954
Guido van Rossum82a5c661998-07-07 20:45:43 +00001955static char gethostbyname_doc[] =
1956"gethostbyname(host) -> address\n\
1957\n\
1958Return the IP address (a string of the form '255.255.255.255') for a host.";
1959
1960
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001961/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1962
1963static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001964gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001965{
1966 char **pch;
1967 PyObject *rtn_tuple = (PyObject *)NULL;
1968 PyObject *name_list = (PyObject *)NULL;
1969 PyObject *addr_list = (PyObject *)NULL;
1970 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001971
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001972 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001973 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001974#ifndef RISCOS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001975 PyH_Err(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001976#else
1977 PyErr_SetString(PySocket_Error, "host not found");
1978#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001979 return NULL;
1980 }
1981 if (h->h_addrtype != af) {
1982#ifdef HAVE_STRERROR
1983 /* Let's get real error message to return */
1984 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001985#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001986 PyErr_SetString(PySocket_Error,
1987 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001988#endif
1989 return NULL;
1990 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001991 switch (af) {
1992 case AF_INET:
1993 if (alen < sizeof(struct sockaddr_in))
1994 return NULL;
1995 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001996#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001997 case AF_INET6:
1998 if (alen < sizeof(struct sockaddr_in6))
1999 return NULL;
2000 break;
2001#endif
2002 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002003 if ((name_list = PyList_New(0)) == NULL)
2004 goto err;
2005 if ((addr_list = PyList_New(0)) == NULL)
2006 goto err;
2007 for (pch = h->h_aliases; *pch != NULL; pch++) {
2008 int status;
2009 tmp = PyString_FromString(*pch);
2010 if (tmp == NULL)
2011 goto err;
2012 status = PyList_Append(name_list, tmp);
2013 Py_DECREF(tmp);
2014 if (status)
2015 goto err;
2016 }
2017 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2018 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002019 switch (af) {
2020 case AF_INET:
2021 {
2022 struct sockaddr_in sin;
2023 memset(&sin, 0, sizeof(sin));
2024 sin.sin_family = af;
2025#ifdef HAVE_SOCKADDR_SA_LEN
2026 sin.sin_len = sizeof(sin);
2027#endif
2028 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2029 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
2030 if (pch == h->h_addr_list && alen >= sizeof(sin))
2031 memcpy((char *) addr, &sin, sizeof(sin));
2032 break;
2033 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002034#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002035 case AF_INET6:
2036 {
2037 struct sockaddr_in6 sin6;
2038 memset(&sin6, 0, sizeof(sin6));
2039 sin6.sin6_family = af;
2040#ifdef HAVE_SOCKADDR_SA_LEN
2041 sin6.sin6_len = sizeof(sin6);
2042#endif
2043 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2044 tmp = makeipaddr((struct sockaddr *)&sin6,
2045 sizeof(sin6));
2046 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2047 memcpy((char *) addr, &sin6, sizeof(sin6));
2048 break;
2049 }
2050#endif
2051 default: /* can't happen */
2052 PyErr_SetString(PySocket_Error,
2053 "unsupported address family");
2054 return NULL;
2055 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002056 if (tmp == NULL)
2057 goto err;
2058 status = PyList_Append(addr_list, tmp);
2059 Py_DECREF(tmp);
2060 if (status)
2061 goto err;
2062 }
2063 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
2064 err:
2065 Py_XDECREF(name_list);
2066 Py_XDECREF(addr_list);
2067 return rtn_tuple;
2068}
2069
2070
2071/* Python interface to gethostbyname_ex(name). */
2072
2073/*ARGSUSED*/
2074static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002075PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002076{
2077 char *name;
2078 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002079 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002080 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002081 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002082#ifdef HAVE_GETHOSTBYNAME_R
2083 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002084#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2085 struct hostent_data data;
2086#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002087 char buf[16384];
2088 int buf_len = (sizeof buf) - 1;
2089 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002090#endif
2091#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002092 int result;
2093#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002094#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002095
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002096 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002097 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002098 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002099 return NULL;
2100 Py_BEGIN_ALLOW_THREADS
2101#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002102#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002103 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002104#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002105 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002106#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002107 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002108 result = gethostbyname_r(name, &hp_allocated, &data);
2109 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002110#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002111#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002112#ifdef USE_GETHOSTBYNAME_LOCK
2113 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002114#endif
2115 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002116#endif /* HAVE_GETHOSTBYNAME_R */
2117 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002118 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
2119 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
2120 sa = (struct sockaddr*)&addr;
2121 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002122#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002123 PyThread_release_lock(gethostbyname_lock);
2124#endif
2125 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002126}
2127
2128static char ghbn_ex_doc[] =
2129"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2130\n\
2131Return the true host name, a list of aliases, and a list of IP addresses,\n\
2132for a host. The host argument is a string giving a host name or IP number.";
2133
2134
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002135/* Python interface to gethostbyaddr(IP). */
2136
2137/*ARGSUSED*/
2138static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002139PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002140{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002141#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002142 struct sockaddr_storage addr;
2143#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002144 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002145#endif
2146 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002147 char *ip_num;
2148 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002149 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002150#ifdef HAVE_GETHOSTBYNAME_R
2151 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002152#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2153 struct hostent_data data;
2154#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002155 char buf[16384];
2156 int buf_len = (sizeof buf) - 1;
2157 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002158#endif
2159#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002160 int result;
2161#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002162#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002163 char *ap;
2164 int al;
2165 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002166
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002167 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002168 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002169 af = PF_UNSPEC;
2170 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002171 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002172 af = sa->sa_family;
2173 ap = NULL;
2174 al = 0;
2175 switch (af) {
2176 case AF_INET:
2177 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2178 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2179 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002180#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002181 case AF_INET6:
2182 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2183 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2184 break;
2185#endif
2186 default:
2187 PyErr_SetString(PySocket_Error, "unsupported address family");
2188 return NULL;
2189 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002190 Py_BEGIN_ALLOW_THREADS
2191#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002192#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002193 result = gethostbyaddr_r(ap, al, af,
2194 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002195 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002196#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002197 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002198 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002199#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002200 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002201 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002202 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002203#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002204#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002205#ifdef USE_GETHOSTBYNAME_LOCK
2206 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002207#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002208 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002209#endif /* HAVE_GETHOSTBYNAME_R */
2210 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002211 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002212#ifdef USE_GETHOSTBYNAME_LOCK
2213 PyThread_release_lock(gethostbyname_lock);
2214#endif
2215 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002216}
2217
Guido van Rossum82a5c661998-07-07 20:45:43 +00002218static char gethostbyaddr_doc[] =
2219"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2220\n\
2221Return the true host name, a list of aliases, and a list of IP addresses,\n\
2222for a host. The host argument is a string giving a host name or IP number.";
2223
Guido van Rossum30a685f1991-06-27 15:51:29 +00002224
2225/* Python interface to getservbyname(name).
2226 This only returns the port number, since the other info is already
2227 known or not useful (like the list of aliases). */
2228
2229/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002230static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002231PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002232{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002233 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002234 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002235 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002236 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002237 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002238 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002239 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002240 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002241 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002242 return NULL;
2243 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002244 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002245}
2246
Guido van Rossum82a5c661998-07-07 20:45:43 +00002247static char getservbyname_doc[] =
2248"getservbyname(servicename, protocolname) -> integer\n\
2249\n\
2250Return a port number from a service name and protocol name.\n\
2251The protocol name should be 'tcp' or 'udp'.";
2252
Guido van Rossum30a685f1991-06-27 15:51:29 +00002253
Guido van Rossum3901d851996-12-19 16:35:04 +00002254/* Python interface to getprotobyname(name).
2255 This only returns the protocol number, since the other info is
2256 already known or not useful (like the list of aliases). */
2257
2258/*ARGSUSED*/
2259static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002260PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002261{
2262 char *name;
2263 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002264#ifdef __BEOS__
2265/* Not available in BeOS yet. - [cjh] */
2266 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2267 return NULL;
2268#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002269 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002270 return NULL;
2271 Py_BEGIN_ALLOW_THREADS
2272 sp = getprotobyname(name);
2273 Py_END_ALLOW_THREADS
2274 if (sp == NULL) {
2275 PyErr_SetString(PySocket_Error, "protocol not found");
2276 return NULL;
2277 }
2278 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002279#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002280}
2281
Guido van Rossum82a5c661998-07-07 20:45:43 +00002282static char getprotobyname_doc[] =
2283"getprotobyname(name) -> integer\n\
2284\n\
2285Return the protocol number for the named protocol. (Rarely used.)";
2286
Guido van Rossum3901d851996-12-19 16:35:04 +00002287
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002288#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002289/* Create a socket object from a numeric file description.
2290 Useful e.g. if stdin is a socket.
2291 Additional arguments as for socket(). */
2292
2293/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002294static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002295PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002296{
Guido van Rossum73624e91994-10-10 17:59:00 +00002297 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002298 SOCKET_T fd;
2299 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002300 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2301 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002302 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002303 /* Dup the fd so it and the socket can be closed independently */
2304 fd = dup(fd);
2305 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002306 return PySocket_Err();
2307 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002308 /* From now on, ignore SIGPIPE and let the error checking
2309 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002310#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002311 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002312#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002313 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002314}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002315
2316static char fromfd_doc[] =
2317"fromfd(fd, family, type[, proto]) -> socket object\n\
2318\n\
2319Create a socket object from the given file descriptor.\n\
2320The remaining arguments are the same as for socket().";
2321
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002322#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002323
Guido van Rossum82a5c661998-07-07 20:45:43 +00002324
Guido van Rossum006bf911996-06-12 04:04:55 +00002325static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002326PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002327{
2328 int x1, x2;
2329
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002330 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002331 return NULL;
2332 }
2333 x2 = (int)ntohs((short)x1);
2334 return PyInt_FromLong(x2);
2335}
2336
Guido van Rossum82a5c661998-07-07 20:45:43 +00002337static char ntohs_doc[] =
2338"ntohs(integer) -> integer\n\
2339\n\
2340Convert a 16-bit integer from network to host byte order.";
2341
2342
Guido van Rossum006bf911996-06-12 04:04:55 +00002343static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002344PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002345{
2346 int x1, x2;
2347
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002348 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002349 return NULL;
2350 }
2351 x2 = ntohl(x1);
2352 return PyInt_FromLong(x2);
2353}
2354
Guido van Rossum82a5c661998-07-07 20:45:43 +00002355static char ntohl_doc[] =
2356"ntohl(integer) -> integer\n\
2357\n\
2358Convert a 32-bit integer from network to host byte order.";
2359
2360
Guido van Rossum006bf911996-06-12 04:04:55 +00002361static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002362PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002363{
2364 int x1, x2;
2365
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002366 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002367 return NULL;
2368 }
2369 x2 = (int)htons((short)x1);
2370 return PyInt_FromLong(x2);
2371}
2372
Guido van Rossum82a5c661998-07-07 20:45:43 +00002373static char htons_doc[] =
2374"htons(integer) -> integer\n\
2375\n\
2376Convert a 16-bit integer from host to network byte order.";
2377
2378
Guido van Rossum006bf911996-06-12 04:04:55 +00002379static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002380PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002381{
2382 int x1, x2;
2383
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002384 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002385 return NULL;
2386 }
2387 x2 = htonl(x1);
2388 return PyInt_FromLong(x2);
2389}
2390
Guido van Rossum82a5c661998-07-07 20:45:43 +00002391static char htonl_doc[] =
2392"htonl(integer) -> integer\n\
2393\n\
2394Convert a 32-bit integer from host to network byte order.";
2395
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002396/*
2397 * socket.inet_aton() and socket.inet_ntoa() functions
2398 *
2399 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2400 *
2401 */
2402
Guido van Rossum48a680c2001-03-02 06:34:14 +00002403static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002404"inet_aton(string) -> packed 32-bit IP representation\n\
2405\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002406Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002407binary format used in low-level network functions.";
2408
2409static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002410PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002411{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002412#ifndef INADDR_NONE
2413#define INADDR_NONE (-1)
2414#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002415
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002416 /* Have to use inet_addr() instead */
2417 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002418 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002419
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002420 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002421 return NULL;
2422 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002423#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002424 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002425#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002426 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002427#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002428
2429 if (packed_addr == INADDR_NONE) { /* invalid address */
2430 PyErr_SetString(PySocket_Error,
2431 "illegal IP address string passed to inet_aton");
2432 return NULL;
2433 }
2434
2435 return PyString_FromStringAndSize((char *) &packed_addr,
2436 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002437}
2438
Guido van Rossum48a680c2001-03-02 06:34:14 +00002439static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002440"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002441\n\
2442Convert an IP address from 32-bit packed binary format to string format";
2443
2444static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002445PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002446{
2447 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002448 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002449 struct in_addr packed_addr;
2450
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002451 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002452 return NULL;
2453 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002454
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002455 if (addr_len != sizeof(packed_addr)) {
2456 PyErr_SetString(PySocket_Error,
2457 "packed IP wrong length for inet_ntoa");
2458 return NULL;
2459 }
2460
2461 memcpy(&packed_addr, packed_str, addr_len);
2462
2463 return PyString_FromString(inet_ntoa(packed_addr));
2464}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002465
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002466/* Python interface to getaddrinfo(host, port). */
2467
2468/*ARGSUSED*/
2469static PyObject *
2470PySocket_getaddrinfo(PyObject *self, PyObject *args)
2471{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002472 struct addrinfo hints, *res;
2473 struct addrinfo *res0 = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002474 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002475 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002476 char *hptr, *pptr;
2477 int family, socktype, protocol, flags;
2478 int error;
2479 PyObject *all = (PyObject *)NULL;
2480 PyObject *single = (PyObject *)NULL;
2481
2482 family = socktype = protocol = flags = 0;
2483 family = PF_UNSPEC;
2484 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2485 &hptr, &pobj, &family, &socktype,
2486 &protocol, &flags)) {
2487 return NULL;
2488 }
2489 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002490 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002491 pptr = pbuf;
2492 } else if (PyString_Check(pobj)) {
2493 pptr = PyString_AsString(pobj);
2494 } else if (pobj == Py_None) {
2495 pptr = (char *)NULL;
2496 } else {
2497 PyErr_SetString(PySocket_Error, "Int or String expected");
2498 return NULL;
2499 }
2500 memset(&hints, 0, sizeof(hints));
2501 hints.ai_family = family;
2502 hints.ai_socktype = socktype;
2503 hints.ai_protocol = protocol;
2504 hints.ai_flags = flags;
2505 error = getaddrinfo(hptr, pptr, &hints, &res0);
2506 if (error) {
2507 PyGAI_Err(error);
2508 return NULL;
2509 }
2510
2511 if ((all = PyList_New(0)) == NULL)
2512 goto err;
2513 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002514 PyObject *addr =
2515 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2516 if (addr == NULL)
2517 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002518 single = Py_BuildValue("iiisO", res->ai_family,
2519 res->ai_socktype, res->ai_protocol,
2520 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002521 addr);
2522 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002523 if (single == NULL)
2524 goto err;
2525
2526 if (PyList_Append(all, single))
2527 goto err;
2528 Py_XDECREF(single);
2529 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002530 return all;
2531 err:
2532 Py_XDECREF(single);
2533 Py_XDECREF(all);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002534 if (res0)
2535 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002536 return (PyObject *)NULL;
2537}
2538
2539static char getaddrinfo_doc[] =
2540"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2541 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2542\n\
2543Resolve host and port into addrinfo struct.";
2544
2545/* Python interface to getnameinfo(sa, flags). */
2546
2547/*ARGSUSED*/
2548static PyObject *
2549PySocket_getnameinfo(PyObject *self, PyObject *args)
2550{
2551 PyObject *sa = (PyObject *)NULL;
2552 int flags;
2553 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002554 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002555 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2556 struct addrinfo hints, *res = NULL;
2557 int error;
2558 PyObject *ret = (PyObject *)NULL;
2559
2560 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002561 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002562 return NULL;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002563 if (!PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, &scope_id))
2564 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002565 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002566 memset(&hints, 0, sizeof(hints));
2567 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002568 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002569 error = getaddrinfo(hostp, pbuf, &hints, &res);
2570 if (error) {
2571 PyGAI_Err(error);
2572 goto fail;
2573 }
2574 if (res->ai_next) {
2575 PyErr_SetString(PySocket_Error,
2576 "sockaddr resolved to multiple addresses");
2577 goto fail;
2578 }
2579 switch (res->ai_family) {
2580 case AF_INET:
2581 {
2582 char *t1;
2583 int t2;
2584 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2585 PyErr_SetString(PySocket_Error,
2586 "IPv4 sockaddr must be 2 tuple");
2587 goto fail;
2588 }
2589 break;
2590 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002591#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002592 case AF_INET6:
2593 {
2594 struct sockaddr_in6 *sin6;
2595 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2596 sin6->sin6_flowinfo = flowinfo;
2597 sin6->sin6_scope_id = scope_id;
2598 break;
2599 }
2600#endif
2601 }
2602 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2603 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2604 if (error) {
2605 PyGAI_Err(error);
2606 goto fail;
2607 }
2608 ret = Py_BuildValue("ss", hbuf, pbuf);
2609
2610fail:
2611 if (res)
2612 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002613 return ret;
2614}
2615
2616static char getnameinfo_doc[] =
2617"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2618\n\
2619Get host and port for a sockaddr.";
2620
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002621/* XXX It might be helpful to augment the error message generated
2622 below with the name of the SSL function that generated the error.
2623 I expect it's obvious most of the time.
2624*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002625
2626#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002627static PyObject *
2628PySSL_SetError(SSL *ssl, int ret)
2629{
2630 PyObject *v, *n, *s;
2631 char *errstr;
2632 int err;
2633
2634 assert(ret <= 0);
2635
2636 err = SSL_get_error(ssl, ret);
2637 n = PyInt_FromLong(err);
2638 if (n == NULL)
2639 return NULL;
2640 v = PyTuple_New(2);
2641 if (v == NULL) {
2642 Py_DECREF(n);
2643 return NULL;
2644 }
2645
2646 switch (SSL_get_error(ssl, ret)) {
2647 case SSL_ERROR_ZERO_RETURN:
2648 errstr = "TLS/SSL connection has been closed";
2649 break;
2650 case SSL_ERROR_WANT_READ:
2651 errstr = "The operation did not complete (read)";
2652 break;
2653 case SSL_ERROR_WANT_WRITE:
2654 errstr = "The operation did not complete (write)";
2655 break;
2656 case SSL_ERROR_WANT_X509_LOOKUP:
2657 errstr = "The operation did not complete (X509 lookup)";
2658 break;
2659 case SSL_ERROR_SYSCALL:
2660 case SSL_ERROR_SSL:
2661 {
2662 unsigned long e = ERR_get_error();
2663 if (e == 0) {
2664 /* an EOF was observed that violates the protocol */
2665 errstr = "EOF occurred in violation of protocol";
2666 } else if (e == -1) {
2667 /* the underlying BIO reported an I/O error */
2668 Py_DECREF(v);
2669 Py_DECREF(n);
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +00002670 return PySocket_Err();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002671 } else {
2672 /* XXX Protected by global interpreter lock */
2673 errstr = ERR_error_string(e, NULL);
2674 }
2675 break;
2676 }
2677 default:
2678 errstr = "Invalid error code";
2679 }
2680 s = PyString_FromString(errstr);
2681 if (s == NULL) {
2682 Py_DECREF(v);
2683 Py_DECREF(n);
2684 }
2685 PyTuple_SET_ITEM(v, 0, n);
2686 PyTuple_SET_ITEM(v, 1, s);
2687 PyErr_SetObject(PySSLErrorObject, v);
2688 return NULL;
2689}
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002690
2691/* This is a C function to be called for new object initialization */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002692static PySSLObject *
2693newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002694{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002695 PySSLObject *self;
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002696 char *errstr = NULL;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002697 int ret;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002698
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002699 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002700 if (self == NULL){
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002701 errstr = "newPySSLObject error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002702 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002703 }
Jeremy Hyltonba699362001-10-11 17:23:34 +00002704 memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
2705 memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002706 self->server_cert = NULL;
2707 self->ssl = NULL;
2708 self->ctx = NULL;
2709 self->Socket = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002710
Jeremy Hylton22738b92001-10-10 22:37:48 +00002711 if ((key_file && !cert_file) || (!key_file && cert_file)) {
2712 errstr = "Both the key & certificate files must be specified";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002713 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002714 }
2715
Jeremy Hylton22738b92001-10-10 22:37:48 +00002716 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2717 if (self->ctx == NULL) {
2718 errstr = "SSL_CTX_new error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002719 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002720 }
2721
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002722 if (key_file) {
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002723 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002724 SSL_FILETYPE_PEM) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002725 errstr = "SSL_CTX_use_PrivateKey_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002726 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002727 }
2728
2729 if (SSL_CTX_use_certificate_chain_file(self->ctx,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002730 cert_file) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002731 errstr = "SSL_CTX_use_certificate_chain_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002732 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002733 }
2734 }
2735
2736 SSL_CTX_set_verify(self->ctx,
2737 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2738 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2739 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2740 SSL_set_connect_state(self->ssl);
2741
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002742 /* Actually negotiate SSL connection */
2743 /* XXX If SSL_connect() returns 0, it's also a failure. */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002744 ret = SSL_connect(self->ssl);
2745 if (ret <= 0) {
2746 PySSL_SetError(self->ssl, ret);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002747 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002748 }
2749 self->ssl->debug = 1;
2750
2751 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2752 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002753 self->server, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002754 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002755 self->issuer, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002756 }
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002757 self->Socket = Sock;
2758 Py_INCREF(self->Socket);
2759 return self;
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002760 fail:
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002761 if (errstr)
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002762 PyErr_SetString(PySSLErrorObject, errstr);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002763 Py_DECREF(self);
2764 return NULL;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002765}
2766
2767/* This is the Python function called for new object initialization */
2768static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002769PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002770{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002771 PySSLObject *rv;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002772 PySocketSockObject *Sock;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002773 char *key_file = NULL;
2774 char *cert_file = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002775
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002776 if (!PyArg_ParseTuple(args, "O!|zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002777 &PySocketSock_Type, (PyObject*)&Sock,
Jeremy Hyltonab006452001-10-10 03:33:24 +00002778 &key_file, &cert_file))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002779 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002780
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002781 rv = newPySSLObject(Sock, key_file, cert_file);
Jeremy Hyltonab006452001-10-10 03:33:24 +00002782 if (rv == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002783 return NULL;
2784 return (PyObject *)rv;
2785}
2786
2787static char ssl_doc[] =
Jeremy Hyltonba699362001-10-11 17:23:34 +00002788"ssl(socket, [keyfile, certfile]) -> sslobject";
2789
2790/* SSL object methods */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002791
2792static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002793PySSL_server(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002794{
2795 return PyString_FromString(self->server);
2796}
2797
2798static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002799PySSL_issuer(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002800{
2801 return PyString_FromString(self->issuer);
2802}
2803
2804
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002805static void PySSL_dealloc(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002806{
2807 if (self->server_cert) /* Possible not to have one? */
2808 X509_free (self->server_cert);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002809 if (self->ssl)
2810 SSL_free(self->ssl);
2811 if (self->ctx)
2812 SSL_CTX_free(self->ctx);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002813 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002814 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002815}
2816
Jeremy Hyltonba699362001-10-11 17:23:34 +00002817static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
2818{
2819 char *data;
2820 int len;
2821
2822 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
2823 return NULL;
2824
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002825 Py_BEGIN_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002826 len = SSL_write(self->ssl, data, len);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002827 Py_END_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002828 if (len > 0)
2829 return PyInt_FromLong(len);
2830 else
2831 return PySSL_SetError(self->ssl, len);
2832}
2833
2834static char PySSL_SSLwrite_doc[] =
2835"write(s) -> len\n\
2836\n\
2837Writes the string s into the SSL object. Returns the number\n\
2838of bytes written.";
2839
2840static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
2841{
2842 PyObject *buf;
2843 int count = 0;
2844 int len = 1024;
2845
2846 if (!PyArg_ParseTuple(args, "|i:read", &len))
2847 return NULL;
2848
2849 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2850 return NULL;
2851
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002852 Py_BEGIN_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002853 count = SSL_read(self->ssl, PyString_AsString(buf), len);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002854 Py_END_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002855 if (count <= 0) {
2856 Py_DECREF(buf);
2857 return PySSL_SetError(self->ssl, count);
2858 }
2859 if (count != len && _PyString_Resize(&buf, count) < 0)
2860 return NULL;
2861 return buf;
2862}
2863
2864static char PySSL_SSLread_doc[] =
2865"read([len]) -> string\n\
2866\n\
2867Read up to len bytes from the SSL socket.";
2868
2869static PyMethodDef PySSLMethods[] = {
2870 {"write", (PyCFunction)PySSL_SSLwrite, 1,
2871 PySSL_SSLwrite_doc},
2872 {"read", (PyCFunction)PySSL_SSLread, 1,
2873 PySSL_SSLread_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00002874 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
2875 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Jeremy Hyltonba699362001-10-11 17:23:34 +00002876 {NULL, NULL}
2877};
2878
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002879static PyObject *PySSL_getattr(PySSLObject *self, char *name)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002880{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002881 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002882}
2883
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002884staticforward PyTypeObject PySSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002885 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002886 0, /*ob_size*/
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002887 "_socket.SSL", /*tp_name*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002888 sizeof(PySSLObject), /*tp_basicsize*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002889 0, /*tp_itemsize*/
2890 /* methods */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002891 (destructor)PySSL_dealloc, /*tp_dealloc*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002892 0, /*tp_print*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002893 (getattrfunc)PySSL_getattr, /*tp_getattr*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002894 0, /*tp_setattr*/
2895 0, /*tp_compare*/
2896 0, /*tp_repr*/
2897 0, /*tp_as_number*/
2898 0, /*tp_as_sequence*/
2899 0, /*tp_as_mapping*/
2900 0, /*tp_hash*/
2901};
2902
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002903/* helper routines for seeding the SSL PRNG */
2904static PyObject *
2905PySSL_RAND_add(PyObject *self, PyObject *args)
2906{
2907 char *buf;
2908 int len;
2909 double entropy;
2910
2911 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
2912 return NULL;
2913 RAND_add(buf, len, entropy);
2914 Py_INCREF(Py_None);
2915 return Py_None;
2916}
2917
2918static char PySSL_RAND_add_doc[] =
2919"RAND_add(string, entropy)\n\
2920\n\
2921Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
2922bound on the entropy contained in string.";
2923
2924static PyObject *
2925PySSL_RAND_status(PyObject *self)
2926{
2927 return PyInt_FromLong(RAND_status());
2928}
2929
2930static char PySSL_RAND_status_doc[] =
2931"RAND_status() -> 0 or 1\n\
2932\n\
2933Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
2934It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
2935using the ssl() function.";
2936
2937static PyObject *
2938PySSL_RAND_egd(PyObject *self, PyObject *arg)
2939{
2940 int bytes;
2941
2942 if (!PyString_Check(arg))
2943 return PyErr_Format(PyExc_TypeError,
2944 "RAND_egd() expected string, found %s",
2945 arg->ob_type->tp_name);
2946 bytes = RAND_egd(PyString_AS_STRING(arg));
2947 if (bytes == -1) {
2948 PyErr_SetString(PySSLErrorObject,
2949 "EGD connection failed or EGD did not return "
2950 "enough data to seed the PRNG");
2951 return NULL;
2952 }
2953 return PyInt_FromLong(bytes);
2954}
2955
2956static char PySSL_RAND_egd_doc[] =
Guido van Rossumcad8fa12001-10-19 12:40:40 +00002957"RAND_egd(path) -> bytes\n\
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002958\n\
2959Queries the entropy gather daemon (EGD) on socket path. Returns number\n\
2960of bytes read. Raises socket.sslerror if connection to EGD fails or\n\
2961if it does provide enough data to seed PRNG.";
2962
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002963#endif /* USE_SSL */
2964
2965
Guido van Rossum30a685f1991-06-27 15:51:29 +00002966/* List of functions exported by this module. */
2967
Guido van Rossum73624e91994-10-10 17:59:00 +00002968static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002969 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002970 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002971 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002972 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002973 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002974 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002975 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002976 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002977 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002978 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002979 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002980 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002981#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002982 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002983 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002984#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002985 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002986 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002987 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002988 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002989 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002990 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002991 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002992 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002993 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002994 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002995 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002996 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002997 {"getaddrinfo", PySocket_getaddrinfo,
2998 METH_VARARGS, getaddrinfo_doc},
2999 {"getnameinfo", PySocket_getnameinfo,
3000 METH_VARARGS, getnameinfo_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003001#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00003002 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003003 METH_VARARGS, ssl_doc},
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00003004 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
3005 PySSL_RAND_add_doc},
3006 {"RAND_egd", PySSL_RAND_egd, METH_O,
3007 PySSL_RAND_egd_doc},
3008 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
3009 PySSL_RAND_status_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003010#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003011 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003012};
3013
Guido van Rossum30a685f1991-06-27 15:51:29 +00003014
3015/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00003016 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003017 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00003018 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003019static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00003020insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003021{
Guido van Rossum73624e91994-10-10 17:59:00 +00003022 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00003023 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003024 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00003025
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003026 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003027}
3028
Guido van Rossum30a685f1991-06-27 15:51:29 +00003029
Guido van Rossum8d665e61996-06-26 18:22:49 +00003030#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00003031
3032/* Additional initialization and cleanup for NT/Windows */
3033
3034static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003035NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003036{
3037 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003038}
3039
3040static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003041NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003042{
3043 WSADATA WSAData;
3044 int ret;
3045 char buf[100];
3046 ret = WSAStartup(0x0101, &WSAData);
3047 switch (ret) {
3048 case 0: /* no error */
3049 atexit(NTcleanup);
3050 return 1;
3051 case WSASYSNOTREADY:
3052 PyErr_SetString(PyExc_ImportError,
3053 "WSAStartup failed: network not ready");
3054 break;
3055 case WSAVERNOTSUPPORTED:
3056 case WSAEINVAL:
3057 PyErr_SetString(PyExc_ImportError,
3058 "WSAStartup failed: requested version not supported");
3059 break;
3060 default:
Tim Peters885d4572001-11-28 20:27:42 +00003061 PyOS_snprintf(buf, sizeof(buf),
3062 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003063 PyErr_SetString(PyExc_ImportError, buf);
3064 break;
3065 }
3066 return 0;
3067}
3068
Guido van Rossum8d665e61996-06-26 18:22:49 +00003069#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003070
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003071#if defined(PYOS_OS2)
3072
3073/* Additional initialization and cleanup for OS/2 */
3074
3075static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003076OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003077{
3078 /* No cleanup is necessary for OS/2 Sockets */
3079}
3080
3081static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003082OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003083{
3084 char reason[64];
3085 int rc = sock_init();
3086
3087 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00003088 atexit(OS2cleanup);
3089 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003090 }
3091
Tim Peters75cdad52001-11-28 22:07:30 +00003092 PyOS_snprintf(reason, sizeof(reason),
3093 "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003094 PyErr_SetString(PyExc_ImportError, reason);
3095
Guido van Rossum32c575d1997-12-02 20:37:32 +00003096 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003097}
3098
3099#endif /* PYOS_OS2 */
3100
Guido van Rossum30a685f1991-06-27 15:51:29 +00003101/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003102 * This is called when the first 'import socket' is done,
3103 * via a table in config.c, if config.c is compiled with USE_SOCKET
3104 * defined.
3105 *
3106 * For MS_WINDOWS (which means any Windows variant), this module
3107 * is actually called "_socket", and there's a wrapper "socket.py"
3108 * which implements some missing functionality (such as makefile(),
3109 * dup() and fromfd()). The import of "_socket" may fail with an
3110 * ImportError exception if initialization of WINSOCK fails. When
3111 * WINSOCK is initialized succesfully, a call to WSACleanup() is
3112 * scheduled to be made at exit time.
3113 *
3114 * For OS/2, this module is also called "_socket" and uses a wrapper
3115 * "socket.py" which implements that functionality that is missing
3116 * when PC operating systems don't put socket descriptors in the
3117 * operating system's filesystem layer.
3118 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003119
Guido van Rossum82a5c661998-07-07 20:45:43 +00003120static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00003121"Implementation module for socket operations. See the socket module\n\
3122for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00003123
Guido van Rossum3886bb61998-12-04 18:50:17 +00003124DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003125init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003126{
Guido van Rossum73624e91994-10-10 17:59:00 +00003127 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003128#ifdef RISCOS
3129 _kernel_swi_regs r;
3130 r.r[0]=0;
3131 _kernel_swi(0x43380, &r, &r);
3132 taskwindow = r.r[0];
3133#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00003134#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00003135 if (!NTinit())
3136 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00003137#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00003138#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003139 if (!OS2init())
3140 return;
Fred Drakea136d492000-08-16 14:18:30 +00003141#endif /* __TOS_OS2__ */
3142#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00003143#endif /* RISCOS */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003144 PySocketSock_Type.ob_type = &PyType_Type;
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00003145 PySocketSock_Type.tp_getattro = PyObject_GenericGetAttr;
3146 PySocketSock_Type.tp_alloc = PyType_GenericAlloc;
3147 PySocketSock_Type.tp_free = _PyObject_Del;
Guido van Rossuma120ffc2001-01-22 15:29:14 +00003148#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003149 PySSL_Type.ob_type = &PyType_Type;
Guido van Rossuma120ffc2001-01-22 15:29:14 +00003150#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00003151 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00003152 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003153 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
3154 if (PySocket_Error == NULL)
3155 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003156 PyDict_SetItemString(d, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003157 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
3158 if (PyH_Error == NULL)
3159 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003160 PyDict_SetItemString(d, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003161 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
3162 NULL);
3163 if (PyGAI_Error == NULL)
3164 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003165 PyDict_SetItemString(d, "gaierror", PyGAI_Error);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003166#ifdef USE_SSL
3167 SSL_load_error_strings();
3168 SSLeay_add_ssl_algorithms();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003169 PySSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
3170 if (PySSLErrorObject == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003171 return;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003172 PyDict_SetItemString(d, "sslerror", PySSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003173 if (PyDict_SetItemString(d, "SSLType",
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003174 (PyObject *)&PySSL_Type) != 0)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003175 return;
Jeremy Hylton57ca8732001-10-11 00:00:17 +00003176 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
3177 SSL_ERROR_ZERO_RETURN);
3178 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
3179 SSL_ERROR_WANT_READ);
3180 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
3181 SSL_ERROR_WANT_WRITE);
3182 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
3183 SSL_ERROR_WANT_X509_LOOKUP);
3184 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
3185 SSL_ERROR_SYSCALL);
3186 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
3187 SSL_ERROR_SSL);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003188#endif /* USE_SSL */
Guido van Rossum91ba64d1997-06-02 22:18:09 +00003189 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00003190 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003191 return;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003192 if (PyDict_SetItemString(d, "socket",
3193 (PyObject *)&PySocketSock_Type) != 0)
3194 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003195
3196 /* Address families (we only support AF_INET and AF_UNIX) */
3197#ifdef AF_UNSPEC
3198 insint(d, "AF_UNSPEC", AF_UNSPEC);
3199#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003200 insint(d, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003201#ifdef AF_INET6
3202 insint(d, "AF_INET6", AF_INET6);
3203#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003204#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003205 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003206#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003207#ifdef AF_AX25
3208 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
3209#endif
3210#ifdef AF_IPX
3211 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
3212#endif
3213#ifdef AF_APPLETALK
3214 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
3215#endif
3216#ifdef AF_NETROM
3217 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
3218#endif
3219#ifdef AF_BRIDGE
3220 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
3221#endif
3222#ifdef AF_AAL5
3223 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
3224#endif
3225#ifdef AF_X25
3226 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
3227#endif
3228#ifdef AF_INET6
3229 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
3230#endif
3231#ifdef AF_ROSE
3232 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
3233#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003234#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00003235 insint(d, "AF_PACKET", AF_PACKET);
3236 insint(d, "PF_PACKET", PF_PACKET);
3237 insint(d, "PACKET_HOST", PACKET_HOST);
3238 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
3239 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
3240 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3241 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
3242 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3243 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003244#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003245
3246 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003247 insint(d, "SOCK_STREAM", SOCK_STREAM);
3248 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003249#ifndef __BEOS__
3250/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003251 insint(d, "SOCK_RAW", SOCK_RAW);
3252 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3253 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003254#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003255
3256#ifdef SO_DEBUG
3257 insint(d, "SO_DEBUG", SO_DEBUG);
3258#endif
3259#ifdef SO_ACCEPTCONN
3260 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
3261#endif
3262#ifdef SO_REUSEADDR
3263 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
3264#endif
3265#ifdef SO_KEEPALIVE
3266 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
3267#endif
3268#ifdef SO_DONTROUTE
3269 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
3270#endif
3271#ifdef SO_BROADCAST
3272 insint(d, "SO_BROADCAST", SO_BROADCAST);
3273#endif
3274#ifdef SO_USELOOPBACK
3275 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
3276#endif
3277#ifdef SO_LINGER
3278 insint(d, "SO_LINGER", SO_LINGER);
3279#endif
3280#ifdef SO_OOBINLINE
3281 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
3282#endif
3283#ifdef SO_REUSEPORT
3284 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
3285#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003286#ifdef SO_SNDBUF
3287 insint(d, "SO_SNDBUF", SO_SNDBUF);
3288#endif
3289#ifdef SO_RCVBUF
3290 insint(d, "SO_RCVBUF", SO_RCVBUF);
3291#endif
3292#ifdef SO_SNDLOWAT
3293 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
3294#endif
3295#ifdef SO_RCVLOWAT
3296 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
3297#endif
3298#ifdef SO_SNDTIMEO
3299 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
3300#endif
3301#ifdef SO_RCVTIMEO
3302 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
3303#endif
3304#ifdef SO_ERROR
3305 insint(d, "SO_ERROR", SO_ERROR);
3306#endif
3307#ifdef SO_TYPE
3308 insint(d, "SO_TYPE", SO_TYPE);
3309#endif
3310
3311 /* Maximum number of connections for "listen" */
3312#ifdef SOMAXCONN
3313 insint(d, "SOMAXCONN", SOMAXCONN);
3314#else
3315 insint(d, "SOMAXCONN", 5); /* Common value */
3316#endif
3317
3318 /* Flags for send, recv */
3319#ifdef MSG_OOB
3320 insint(d, "MSG_OOB", MSG_OOB);
3321#endif
3322#ifdef MSG_PEEK
3323 insint(d, "MSG_PEEK", MSG_PEEK);
3324#endif
3325#ifdef MSG_DONTROUTE
3326 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
3327#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003328#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00003329 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003330#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003331#ifdef MSG_EOR
3332 insint(d, "MSG_EOR", MSG_EOR);
3333#endif
3334#ifdef MSG_TRUNC
3335 insint(d, "MSG_TRUNC", MSG_TRUNC);
3336#endif
3337#ifdef MSG_CTRUNC
3338 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
3339#endif
3340#ifdef MSG_WAITALL
3341 insint(d, "MSG_WAITALL", MSG_WAITALL);
3342#endif
3343#ifdef MSG_BTAG
3344 insint(d, "MSG_BTAG", MSG_BTAG);
3345#endif
3346#ifdef MSG_ETAG
3347 insint(d, "MSG_ETAG", MSG_ETAG);
3348#endif
3349
3350 /* Protocol level and numbers, usable for [gs]etsockopt */
3351#ifdef SOL_SOCKET
3352 insint(d, "SOL_SOCKET", SOL_SOCKET);
3353#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003354#ifdef SOL_IP
3355 insint(d, "SOL_IP", SOL_IP);
3356#else
3357 insint(d, "SOL_IP", 0);
3358#endif
3359#ifdef SOL_IPX
3360 insint(d, "SOL_IPX", SOL_IPX);
3361#endif
3362#ifdef SOL_AX25
3363 insint(d, "SOL_AX25", SOL_AX25);
3364#endif
3365#ifdef SOL_ATALK
3366 insint(d, "SOL_ATALK", SOL_ATALK);
3367#endif
3368#ifdef SOL_NETROM
3369 insint(d, "SOL_NETROM", SOL_NETROM);
3370#endif
3371#ifdef SOL_ROSE
3372 insint(d, "SOL_ROSE", SOL_ROSE);
3373#endif
3374#ifdef SOL_TCP
3375 insint(d, "SOL_TCP", SOL_TCP);
3376#else
3377 insint(d, "SOL_TCP", 6);
3378#endif
3379#ifdef SOL_UDP
3380 insint(d, "SOL_UDP", SOL_UDP);
3381#else
3382 insint(d, "SOL_UDP", 17);
3383#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003384#ifdef IPPROTO_IP
3385 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003386#else
3387 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003388#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003389#ifdef IPPROTO_HOPOPTS
3390 insint(d, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
3391#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003392#ifdef IPPROTO_ICMP
3393 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003394#else
3395 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003396#endif
3397#ifdef IPPROTO_IGMP
3398 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
3399#endif
3400#ifdef IPPROTO_GGP
3401 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
3402#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003403#ifdef IPPROTO_IPV4
3404 insint(d, "IPPROTO_IPV4", IPPROTO_IPV4);
3405#endif
3406#ifdef IPPROTO_IPIP
3407 insint(d, "IPPROTO_IPIP", IPPROTO_IPIP);
3408#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003409#ifdef IPPROTO_TCP
3410 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003411#else
3412 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003413#endif
3414#ifdef IPPROTO_EGP
3415 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
3416#endif
3417#ifdef IPPROTO_PUP
3418 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
3419#endif
3420#ifdef IPPROTO_UDP
3421 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003422#else
3423 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003424#endif
3425#ifdef IPPROTO_IDP
3426 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
3427#endif
3428#ifdef IPPROTO_HELLO
3429 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
3430#endif
3431#ifdef IPPROTO_ND
3432 insint(d, "IPPROTO_ND", IPPROTO_ND);
3433#endif
3434#ifdef IPPROTO_TP
3435 insint(d, "IPPROTO_TP", IPPROTO_TP);
3436#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003437#ifdef IPPROTO_IPV6
3438 insint(d, "IPPROTO_IPV6", IPPROTO_IPV6);
3439#endif
3440#ifdef IPPROTO_ROUTING
3441 insint(d, "IPPROTO_ROUTING", IPPROTO_ROUTING);
3442#endif
3443#ifdef IPPROTO_FRAGMENT
3444 insint(d, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
3445#endif
3446#ifdef IPPROTO_RSVP
3447 insint(d, "IPPROTO_RSVP", IPPROTO_RSVP);
3448#endif
3449#ifdef IPPROTO_GRE
3450 insint(d, "IPPROTO_GRE", IPPROTO_GRE);
3451#endif
3452#ifdef IPPROTO_ESP
3453 insint(d, "IPPROTO_ESP", IPPROTO_ESP);
3454#endif
3455#ifdef IPPROTO_AH
3456 insint(d, "IPPROTO_AH", IPPROTO_AH);
3457#endif
3458#ifdef IPPROTO_MOBILE
3459 insint(d, "IPPROTO_MOBILE", IPPROTO_MOBILE);
3460#endif
3461#ifdef IPPROTO_ICMPV6
3462 insint(d, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
3463#endif
3464#ifdef IPPROTO_NONE
3465 insint(d, "IPPROTO_NONE", IPPROTO_NONE);
3466#endif
3467#ifdef IPPROTO_DSTOPTS
3468 insint(d, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
3469#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003470#ifdef IPPROTO_XTP
3471 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
3472#endif
3473#ifdef IPPROTO_EON
3474 insint(d, "IPPROTO_EON", IPPROTO_EON);
3475#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003476#ifdef IPPROTO_PIM
3477 insint(d, "IPPROTO_PIM", IPPROTO_PIM);
3478#endif
3479#ifdef IPPROTO_IPCOMP
3480 insint(d, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
3481#endif
3482#ifdef IPPROTO_VRRP
3483 insint(d, "IPPROTO_VRRP", IPPROTO_VRRP);
3484#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003485#ifdef IPPROTO_BIP
3486 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
3487#endif
3488/**/
3489#ifdef IPPROTO_RAW
3490 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003491#else
3492 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003493#endif
3494#ifdef IPPROTO_MAX
3495 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
3496#endif
3497
3498 /* Some port configuration */
3499#ifdef IPPORT_RESERVED
3500 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
3501#else
3502 insint(d, "IPPORT_RESERVED", 1024);
3503#endif
3504#ifdef IPPORT_USERRESERVED
3505 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
3506#else
3507 insint(d, "IPPORT_USERRESERVED", 5000);
3508#endif
3509
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003510 /* Some reserved IP v.4 addresses */
3511#ifdef INADDR_ANY
3512 insint(d, "INADDR_ANY", INADDR_ANY);
3513#else
3514 insint(d, "INADDR_ANY", 0x00000000);
3515#endif
3516#ifdef INADDR_BROADCAST
3517 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
3518#else
3519 insint(d, "INADDR_BROADCAST", 0xffffffff);
3520#endif
3521#ifdef INADDR_LOOPBACK
3522 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
3523#else
3524 insint(d, "INADDR_LOOPBACK", 0x7F000001);
3525#endif
3526#ifdef INADDR_UNSPEC_GROUP
3527 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
3528#else
3529 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
3530#endif
3531#ifdef INADDR_ALLHOSTS_GROUP
3532 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
3533#else
3534 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
3535#endif
3536#ifdef INADDR_MAX_LOCAL_GROUP
3537 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
3538#else
3539 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
3540#endif
3541#ifdef INADDR_NONE
3542 insint(d, "INADDR_NONE", INADDR_NONE);
3543#else
3544 insint(d, "INADDR_NONE", 0xffffffff);
3545#endif
3546
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003547 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003548#ifdef IP_OPTIONS
3549 insint(d, "IP_OPTIONS", IP_OPTIONS);
3550#endif
3551#ifdef IP_HDRINCL
3552 insint(d, "IP_HDRINCL", IP_HDRINCL);
3553#endif
3554#ifdef IP_TOS
3555 insint(d, "IP_TOS", IP_TOS);
3556#endif
3557#ifdef IP_TTL
3558 insint(d, "IP_TTL", IP_TTL);
3559#endif
3560#ifdef IP_RECVOPTS
3561 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
3562#endif
3563#ifdef IP_RECVRETOPTS
3564 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
3565#endif
3566#ifdef IP_RECVDSTADDR
3567 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
3568#endif
3569#ifdef IP_RETOPTS
3570 insint(d, "IP_RETOPTS", IP_RETOPTS);
3571#endif
3572#ifdef IP_MULTICAST_IF
3573 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
3574#endif
3575#ifdef IP_MULTICAST_TTL
3576 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
3577#endif
3578#ifdef IP_MULTICAST_LOOP
3579 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
3580#endif
3581#ifdef IP_ADD_MEMBERSHIP
3582 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
3583#endif
3584#ifdef IP_DROP_MEMBERSHIP
3585 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
3586#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003587#ifdef IP_DEFAULT_MULTICAST_TTL
3588 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
3589#endif
3590#ifdef IP_DEFAULT_MULTICAST_LOOP
3591 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
3592#endif
3593#ifdef IP_MAX_MEMBERSHIPS
3594 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
3595#endif
3596
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003597 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3598#ifdef IPV6_JOIN_GROUP
3599 insint(d, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
3600#endif
3601#ifdef IPV6_LEAVE_GROUP
3602 insint(d, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
3603#endif
3604#ifdef IPV6_MULTICAST_HOPS
3605 insint(d, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
3606#endif
3607#ifdef IPV6_MULTICAST_IF
3608 insint(d, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
3609#endif
3610#ifdef IPV6_MULTICAST_LOOP
3611 insint(d, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
3612#endif
3613#ifdef IPV6_UNICAST_HOPS
3614 insint(d, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
3615#endif
3616
Guido van Rossum09be4091999-08-09 14:40:40 +00003617 /* TCP options */
3618#ifdef TCP_NODELAY
3619 insint(d, "TCP_NODELAY", TCP_NODELAY);
3620#endif
3621#ifdef TCP_MAXSEG
3622 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
3623#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003624#ifdef TCP_CORK
3625 insint(d, "TCP_CORK", TCP_CORK);
3626#endif
3627#ifdef TCP_KEEPIDLE
3628 insint(d, "TCP_KEEPIDLE", TCP_KEEPIDLE);
3629#endif
3630#ifdef TCP_KEEPINTVL
3631 insint(d, "TCP_KEEPINTVL", TCP_KEEPINTVL);
3632#endif
3633#ifdef TCP_KEEPCNT
3634 insint(d, "TCP_KEEPCNT", TCP_KEEPCNT);
3635#endif
3636#ifdef TCP_SYNCNT
3637 insint(d, "TCP_SYNCNT", TCP_SYNCNT);
3638#endif
3639#ifdef TCP_LINGER2
3640 insint(d, "TCP_LINGER2", TCP_LINGER2);
3641#endif
3642#ifdef TCP_DEFER_ACCEPT
3643 insint(d, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
3644#endif
3645#ifdef TCP_WINDOW_CLAMP
3646 insint(d, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
3647#endif
3648#ifdef TCP_INFO
3649 insint(d, "TCP_INFO", TCP_INFO);
3650#endif
3651#ifdef TCP_QUICKACK
3652 insint(d, "TCP_QUICKACK", TCP_QUICKACK);
3653#endif
3654
Guido van Rossum09be4091999-08-09 14:40:40 +00003655
3656 /* IPX options */
3657#ifdef IPX_TYPE
3658 insint(d, "IPX_TYPE", IPX_TYPE);
3659#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003660
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003661 /* get{addr,name}info parameters */
3662#ifdef EAI_ADDRFAMILY
3663 insint(d, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
3664#endif
3665#ifdef EAI_AGAIN
3666 insint(d, "EAI_AGAIN", EAI_AGAIN);
3667#endif
3668#ifdef EAI_BADFLAGS
3669 insint(d, "EAI_BADFLAGS", EAI_BADFLAGS);
3670#endif
3671#ifdef EAI_FAIL
3672 insint(d, "EAI_FAIL", EAI_FAIL);
3673#endif
3674#ifdef EAI_FAMILY
3675 insint(d, "EAI_FAMILY", EAI_FAMILY);
3676#endif
3677#ifdef EAI_MEMORY
3678 insint(d, "EAI_MEMORY", EAI_MEMORY);
3679#endif
3680#ifdef EAI_NODATA
3681 insint(d, "EAI_NODATA", EAI_NODATA);
3682#endif
3683#ifdef EAI_NONAME
3684 insint(d, "EAI_NONAME", EAI_NONAME);
3685#endif
3686#ifdef EAI_SERVICE
3687 insint(d, "EAI_SERVICE", EAI_SERVICE);
3688#endif
3689#ifdef EAI_SOCKTYPE
3690 insint(d, "EAI_SOCKTYPE", EAI_SOCKTYPE);
3691#endif
3692#ifdef EAI_SYSTEM
3693 insint(d, "EAI_SYSTEM", EAI_SYSTEM);
3694#endif
3695#ifdef EAI_BADHINTS
3696 insint(d, "EAI_BADHINTS", EAI_BADHINTS);
3697#endif
3698#ifdef EAI_PROTOCOL
3699 insint(d, "EAI_PROTOCOL", EAI_PROTOCOL);
3700#endif
3701#ifdef EAI_MAX
3702 insint(d, "EAI_MAX", EAI_MAX);
3703#endif
3704#ifdef AI_PASSIVE
3705 insint(d, "AI_PASSIVE", AI_PASSIVE);
3706#endif
3707#ifdef AI_CANONNAME
3708 insint(d, "AI_CANONNAME", AI_CANONNAME);
3709#endif
3710#ifdef AI_NUMERICHOST
3711 insint(d, "AI_NUMERICHOST", AI_NUMERICHOST);
3712#endif
3713#ifdef AI_MASK
3714 insint(d, "AI_MASK", AI_MASK);
3715#endif
3716#ifdef AI_ALL
3717 insint(d, "AI_ALL", AI_ALL);
3718#endif
3719#ifdef AI_V4MAPPED_CFG
3720 insint(d, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
3721#endif
3722#ifdef AI_ADDRCONFIG
3723 insint(d, "AI_ADDRCONFIG", AI_ADDRCONFIG);
3724#endif
3725#ifdef AI_V4MAPPED
3726 insint(d, "AI_V4MAPPED", AI_V4MAPPED);
3727#endif
3728#ifdef AI_DEFAULT
3729 insint(d, "AI_DEFAULT", AI_DEFAULT);
3730#endif
3731#ifdef NI_MAXHOST
3732 insint(d, "NI_MAXHOST", NI_MAXHOST);
3733#endif
3734#ifdef NI_MAXSERV
3735 insint(d, "NI_MAXSERV", NI_MAXSERV);
3736#endif
3737#ifdef NI_NOFQDN
3738 insint(d, "NI_NOFQDN", NI_NOFQDN);
3739#endif
3740#ifdef NI_NUMERICHOST
3741 insint(d, "NI_NUMERICHOST", NI_NUMERICHOST);
3742#endif
3743#ifdef NI_NAMEREQD
3744 insint(d, "NI_NAMEREQD", NI_NAMEREQD);
3745#endif
3746#ifdef NI_NUMERICSERV
3747 insint(d, "NI_NUMERICSERV", NI_NUMERICSERV);
3748#endif
3749#ifdef NI_DGRAM
3750 insint(d, "NI_DGRAM", NI_DGRAM);
3751#endif
3752
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003753 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003754#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003755 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003756#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003757}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003758
3759/* Simplistic emulation code for inet_pton that only works for IPv4 */
3760#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003761int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003762inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003763{
3764 if(af == AF_INET){
3765 long packed_addr;
3766#ifdef USE_GUSI1
3767 packed_addr = (long)inet_addr(src).s_addr;
3768#else
3769 packed_addr = inet_addr(src);
3770#endif
3771 if (packed_addr == INADDR_NONE)
3772 return 0;
3773 memcpy(dst, &packed_addr, 4);
3774 return 1;
3775 }
3776 /* Should set errno to EAFNOSUPPORT */
3777 return -1;
3778}
3779
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003780const char *
3781inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003782{
3783 if (af == AF_INET) {
3784 struct in_addr packed_addr;
3785 if (size < 16)
3786 /* Should set errno to ENOSPC. */
3787 return NULL;
3788 memcpy(&packed_addr, src, sizeof(packed_addr));
3789 return strncpy(dst, inet_ntoa(packed_addr), size);
3790 }
3791 /* Should set errno to EAFNOSUPPORT */
3792 return NULL;
3793}
3794#endif