blob: fea6b85b392619b3f3ea0114ff894535c245a005 [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öwis2d8d4272001-07-21 18:05:31 +0000482#ifdef INET6
483 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;
597#ifdef INET6
598 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) {
609 PyErr_SetString(PySocket_Error,
610 "wildcard resolved to multiple address");
611 return -1;
612 }
613 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
614 freeaddrinfo(res);
615 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000616 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000617 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000618 struct sockaddr_in *sin;
619 if (af != PF_INET && af != PF_UNSPEC) {
620 PyErr_SetString(PySocket_Error,
621 "address family mismatched");
622 return -1;
623 }
624 sin = (struct sockaddr_in *)addr_ret;
625 memset((void *) sin, '\0', sizeof(*sin));
626 sin->sin_family = AF_INET;
627#ifdef HAVE_SOCKADDR_SA_LEN
628 sin->sin_len = sizeof(*sin);
629#endif
630 sin->sin_addr.s_addr = INADDR_BROADCAST;
631 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000632 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000633 memset(&hints, 0, sizeof(hints));
634 hints.ai_family = af;
635 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000636#if defined(__digital__) && defined(__unix__)
Martin v. Löwisb8fc9722001-10-24 17:35:46 +0000637 if (error == EAI_NONAME && af == AF_UNSPEC) {
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000638 /* On Tru64 V5.1, numeric-to-addr conversion
Martin v. Löwis861a65b2001-10-24 14:36:00 +0000639 fails if no address family is given. Assume IPv4 for now.*/
640 hints.ai_family = AF_INET;
641 error = getaddrinfo(name, NULL, &hints, &res);
642 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000643#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000644 if (error) {
645 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000646 return -1;
647 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000648 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
649 freeaddrinfo(res);
650 switch (addr_ret->sa_family) {
651 case AF_INET:
652 return 4;
653#ifdef INET6
654 case AF_INET6:
655 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000656#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000657 default:
658 PyErr_SetString(PySocket_Error, "unknown address family");
659 return -1;
660 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000661}
662
Guido van Rossum30a685f1991-06-27 15:51:29 +0000663
Guido van Rossum30a685f1991-06-27 15:51:29 +0000664/* Create a string object representing an IP address.
665 This is always a string of the form 'dd.dd.dd.dd' (with variable
666 size numbers). */
667
Guido van Rossum73624e91994-10-10 17:59:00 +0000668static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000669makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000670{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000671 char buf[NI_MAXHOST];
672 int error;
673
674 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
675 NI_NUMERICHOST);
676 if (error) {
677 PyGAI_Err(error);
678 return NULL;
679 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000680 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000681}
682
683
684/* Create an object representing the given socket address,
685 suitable for passing it back to bind(), connect() etc.
686 The family field of the sockaddr structure is inspected
687 to determine what kind of address it really is. */
688
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000689/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000690static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000691makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000692{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000693 if (addrlen == 0) {
694 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000695 Py_INCREF(Py_None);
696 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000697 }
698
Guido van Rossumbcc20741998-08-04 22:53:56 +0000699#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000700 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000701 addr->sa_family = AF_INET;
702#endif
703
Guido van Rossum30a685f1991-06-27 15:51:29 +0000704 switch (addr->sa_family) {
705
706 case AF_INET:
707 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000708 struct sockaddr_in *a;
709 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000710 PyObject *ret = NULL;
711 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000712 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000713 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
714 Py_DECREF(addrobj);
715 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000716 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000717 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000718
Guido van Rossumb6775db1994-08-01 11:34:53 +0000719#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000720 case AF_UNIX:
721 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000722 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000723 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000724 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000725#endif /* AF_UNIX */
726
727#ifdef INET6
728 case AF_INET6:
729 {
730 struct sockaddr_in6 *a;
731 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
732 PyObject *ret = NULL;
733 if (addrobj) {
734 a = (struct sockaddr_in6 *)addr;
735 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
736 a->sin6_flowinfo, a->sin6_scope_id);
737 Py_DECREF(addrobj);
738 }
739 return ret;
740 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000741#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000742
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000743#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000744 case AF_PACKET:
745 {
746 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
747 char *ifname = "";
748 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000749 /* need to look up interface name give index */
750 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000751 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000752 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000753 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000754 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000755 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000756 a->sll_pkttype, a->sll_hatype,
757 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000758 }
759#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000760
Guido van Rossum30a685f1991-06-27 15:51:29 +0000761 /* More cases here... */
762
763 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000764 /* If we don't know the address family, don't raise an
765 exception -- return it as a tuple. */
766 return Py_BuildValue("is#",
767 addr->sa_family,
768 addr->sa_data,
769 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000770
Guido van Rossum30a685f1991-06-27 15:51:29 +0000771 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000772}
773
Guido van Rossum30a685f1991-06-27 15:51:29 +0000774
775/* Parse a socket address argument according to the socket object's
776 address family. Return 1 if the address was in the proper format,
777 0 of not. The address is returned through addr_ret, its length
778 through len_ret. */
779
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000780static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000781getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000782 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000783{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000784 switch (s->sock_family) {
785
Guido van Rossumb6775db1994-08-01 11:34:53 +0000786#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000787 case AF_UNIX:
788 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000789 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000790 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000791 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000792 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000793 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000794 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000795 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000796 PyErr_SetString(PySocket_Error,
797 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000798 return 0;
799 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000800 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000801 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000802 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000803 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000804 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000805 return 1;
806 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000807#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000808
Guido van Rossum30a685f1991-06-27 15:51:29 +0000809 case AF_INET:
810 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000811 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000812 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000813 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000814 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000815 if (!PyTuple_Check(args)) {
816 PyErr_Format(PyExc_TypeError,
817 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
818 args->ob_type->tp_name);
819 return 0;
820 }
821 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000822 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000823 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000824 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000825 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000826 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000827 *addr_ret = (struct sockaddr *) addr;
828 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000829 return 1;
830 }
831
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000832#ifdef INET6
833 case AF_INET6:
834 {
835 struct sockaddr_in6* addr;
836 char *host;
837 int port, flowinfo, scope_id;
838 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
839 flowinfo = scope_id = 0;
840 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
841 &scope_id)) {
842 return 0;
843 }
844 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
845 return 0;
846 addr->sin6_family = s->sock_family;
847 addr->sin6_port = htons((short)port);
848 addr->sin6_flowinfo = flowinfo;
849 addr->sin6_scope_id = scope_id;
850 *addr_ret = (struct sockaddr *) addr;
851 *len_ret = sizeof *addr;
852 return 1;
853 }
854#endif
855
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000856#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000857 case AF_PACKET:
858 {
859 struct sockaddr_ll* addr;
860 struct ifreq ifr;
861 char *interfaceName;
862 int protoNumber;
863 int hatype = 0;
864 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000865 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000866
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000867 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
868 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000869 return 0;
870 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
871 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000872 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +0000873 PySocket_Err();
Jeremy Hylton22308652001-02-02 03:23:09 +0000874 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000875 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000876 addr = &(s->sock_addr.ll);
877 addr->sll_family = AF_PACKET;
878 addr->sll_protocol = htons((short)protoNumber);
879 addr->sll_ifindex = ifr.ifr_ifindex;
880 addr->sll_pkttype = pkttype;
881 addr->sll_hatype = hatype;
882 *addr_ret = (struct sockaddr *) addr;
883 *len_ret = sizeof *addr;
884 return 1;
885 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000886#endif
887
Guido van Rossum30a685f1991-06-27 15:51:29 +0000888 /* More cases here... */
889
890 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000891 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000892 return 0;
893
894 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000895}
896
Guido van Rossum30a685f1991-06-27 15:51:29 +0000897
Guido van Rossum48a680c2001-03-02 06:34:14 +0000898/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000899 Return 1 if the family is known, 0 otherwise. The length is returned
900 through len_ret. */
901
902static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000903getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000904{
905 switch (s->sock_family) {
906
Guido van Rossumb6775db1994-08-01 11:34:53 +0000907#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000908 case AF_UNIX:
909 {
910 *len_ret = sizeof (struct sockaddr_un);
911 return 1;
912 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000913#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000914
915 case AF_INET:
916 {
917 *len_ret = sizeof (struct sockaddr_in);
918 return 1;
919 }
920
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000921#ifdef INET6
922 case AF_INET6:
923 {
924 *len_ret = sizeof (struct sockaddr_in6);
925 return 1;
926 }
927#endif
928
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000929#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000930 case AF_PACKET:
931 {
932 *len_ret = sizeof (struct sockaddr_ll);
933 return 1;
934 }
935#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000936
Guido van Rossum710e1df1992-06-12 10:39:36 +0000937 /* More cases here... */
938
939 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000940 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000941 return 0;
942
943 }
944}
945
946
Guido van Rossum30a685f1991-06-27 15:51:29 +0000947/* s.accept() method */
948
Guido van Rossum73624e91994-10-10 17:59:00 +0000949static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000950PySocketSock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000951{
952 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000953 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000954 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000955 PyObject *sock = NULL;
956 PyObject *addr = NULL;
957 PyObject *res = NULL;
958
Guido van Rossum710e1df1992-06-12 10:39:36 +0000959 if (!getsockaddrlen(s, &addrlen))
960 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000961 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000962 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000963 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000964 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000965#ifdef MS_WINDOWS
966 if (newfd == INVALID_SOCKET)
967#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000968 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000969#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000970 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000971
Guido van Rossum30a685f1991-06-27 15:51:29 +0000972 /* Create the new object with unspecified family,
973 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000974 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000975 s->sock_family,
976 s->sock_type,
977 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000978 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000979 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000980 goto finally;
981 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000982 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000983 addrlen);
984 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000985 goto finally;
986
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000987 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000988
989 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000990 Py_XDECREF(sock);
991 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000992 return res;
993}
994
Guido van Rossum82a5c661998-07-07 20:45:43 +0000995static char accept_doc[] =
996"accept() -> (socket object, address info)\n\
997\n\
998Wait for an incoming connection. Return a new socket representing the\n\
999connection, and the address of the client. For IP sockets, the address\n\
1000info is a pair (hostaddr, port).";
1001
Guido van Rossum30a685f1991-06-27 15:51:29 +00001002
Guido van Rossume4485b01994-09-07 14:32:49 +00001003/* s.setblocking(1 | 0) method */
1004
Guido van Rossum73624e91994-10-10 17:59:00 +00001005static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001006PySocketSock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001007{
1008 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001009#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +00001010#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +00001011 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +00001012#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001013#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001014 block = PyInt_AsLong(arg);
1015 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001016 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001017 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +00001018#ifdef __BEOS__
1019 block = !block;
1020 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
1021 (void *)(&block), sizeof( int ) );
1022#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001023#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001024#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001025#ifdef PYOS_OS2
1026 block = !block;
1027 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
1028#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +00001029 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
1030 if (block)
1031 delay_flag &= (~O_NDELAY);
1032 else
1033 delay_flag |= O_NDELAY;
1034 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001035#endif /* !PYOS_OS2 */
1036#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001037 block = !block;
1038 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001039#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +00001040#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001041#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001042 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +00001043
Guido van Rossum73624e91994-10-10 17:59:00 +00001044 Py_INCREF(Py_None);
1045 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001046}
Guido van Rossume4485b01994-09-07 14:32:49 +00001047
Guido van Rossum82a5c661998-07-07 20:45:43 +00001048static char setblocking_doc[] =
1049"setblocking(flag)\n\
1050\n\
1051Set the socket to blocking (flag is true) or non-blocking (false).\n\
1052This uses the FIONBIO ioctl with the O_NDELAY flag.";
1053
Guido van Rossume4485b01994-09-07 14:32:49 +00001054
Guido van Rossum48a680c2001-03-02 06:34:14 +00001055#ifdef RISCOS
1056/* s.sleeptaskw(1 | 0) method */
1057
1058static PyObject *
1059PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
1060{
1061 int block;
1062 int delay_flag;
1063 if (!PyArg_GetInt(args, &block))
1064 return NULL;
1065 Py_BEGIN_ALLOW_THREADS
1066 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1067 Py_END_ALLOW_THREADS
1068
1069 Py_INCREF(Py_None);
1070 return Py_None;
1071}
1072static char sleeptaskw_doc[] =
1073"sleeptaskw(flag)\n\
1074\n\
1075Allow sleeps in taskwindows.";
1076#endif
1077
1078
Guido van Rossumaee08791992-09-08 09:05:33 +00001079/* s.setsockopt() method.
1080 With an integer third argument, sets an integer option.
1081 With a string third argument, sets an option from a buffer;
1082 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001083
Guido van Rossum73624e91994-10-10 17:59:00 +00001084static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001085PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001086{
1087 int level;
1088 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001089 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001090 char *buf;
1091 int buflen;
1092 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001093
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001094 if (PyArg_ParseTuple(args, "iii:setsockopt",
1095 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001096 buf = (char *) &flag;
1097 buflen = sizeof flag;
1098 }
1099 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001100 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001101 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1102 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001103 return NULL;
1104 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001105 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001106 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001107 return PySocket_Err();
1108 Py_INCREF(Py_None);
1109 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001110}
1111
Guido van Rossum82a5c661998-07-07 20:45:43 +00001112static char setsockopt_doc[] =
1113"setsockopt(level, option, value)\n\
1114\n\
1115Set a socket option. See the Unix manual for level and option.\n\
1116The value argument can either be an integer or a string.";
1117
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001118
Guido van Rossumaee08791992-09-08 09:05:33 +00001119/* s.getsockopt() method.
1120 With two arguments, retrieves an integer option.
1121 With a third integer argument, retrieves a string buffer of that size;
1122 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001123
Guido van Rossum73624e91994-10-10 17:59:00 +00001124static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001125PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001126{
1127 int level;
1128 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001129 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001130 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001131 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001132
Guido van Rossumbcc20741998-08-04 22:53:56 +00001133#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001134 /* We have incomplete socket support. */
1135 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001136 return NULL;
1137#else
1138
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001139 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1140 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001141 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001142
Guido van Rossumbe32c891996-06-20 16:25:29 +00001143 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001144 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001145 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001146 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001147 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001148 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001149 return PySocket_Err();
1150 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001151 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001152 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001153 PyErr_SetString(PySocket_Error,
1154 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001155 return NULL;
1156 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001157 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001158 if (buf == NULL)
1159 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001160 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001161 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001162 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001163 Py_DECREF(buf);
1164 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +00001165 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001166 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001167 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001168#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001169}
1170
Guido van Rossum82a5c661998-07-07 20:45:43 +00001171static char getsockopt_doc[] =
1172"getsockopt(level, option[, buffersize]) -> value\n\
1173\n\
1174Get a socket option. See the Unix manual for level and option.\n\
1175If a nonzero buffersize argument is given, the return value is a\n\
1176string of that length; otherwise it is an integer.";
1177
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001178
Fred Drake728819a2000-07-01 03:40:12 +00001179/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001180
Guido van Rossum73624e91994-10-10 17:59:00 +00001181static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001182PySocketSock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001183{
1184 struct sockaddr *addr;
1185 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001186 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001187
Fred Drake728819a2000-07-01 03:40:12 +00001188 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001189 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001190 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001191 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001192 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001193 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001194 return PySocket_Err();
1195 Py_INCREF(Py_None);
1196 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001197}
1198
Guido van Rossum82a5c661998-07-07 20:45:43 +00001199static char bind_doc[] =
1200"bind(address)\n\
1201\n\
1202Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001203pair (host, port); the host must refer to the local host. For raw packet\n\
1204sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001205
Guido van Rossum30a685f1991-06-27 15:51:29 +00001206
1207/* s.close() method.
1208 Set the file descriptor to -1 so operations tried subsequently
1209 will surely fail. */
1210
Guido van Rossum73624e91994-10-10 17:59:00 +00001211static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001212PySocketSock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001213{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001214 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001215
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001216 if ((fd = s->sock_fd) != -1) {
1217 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001218 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001219 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001220 Py_END_ALLOW_THREADS
1221 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001222 Py_INCREF(Py_None);
1223 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001224}
1225
Guido van Rossum82a5c661998-07-07 20:45:43 +00001226static char close_doc[] =
1227"close()\n\
1228\n\
1229Close the socket. It cannot be used after this call.";
1230
Guido van Rossum30a685f1991-06-27 15:51:29 +00001231
Fred Drake728819a2000-07-01 03:40:12 +00001232/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001233
Guido van Rossum73624e91994-10-10 17:59:00 +00001234static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001235PySocketSock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001236{
1237 struct sockaddr *addr;
1238 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001239 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001240
Fred Drake728819a2000-07-01 03:40:12 +00001241 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001242 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001243 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001244 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001245 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001246 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001247 return PySocket_Err();
1248 Py_INCREF(Py_None);
1249 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001250}
1251
Guido van Rossum82a5c661998-07-07 20:45:43 +00001252static char connect_doc[] =
1253"connect(address)\n\
1254\n\
1255Connect the socket to a remote address. For IP sockets, the address\n\
1256is a pair (host, port).";
1257
Guido van Rossum30a685f1991-06-27 15:51:29 +00001258
Fred Drake728819a2000-07-01 03:40:12 +00001259/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001260
1261static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001262PySocketSock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001263{
1264 struct sockaddr *addr;
1265 int addrlen;
1266 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001267
Fred Drake728819a2000-07-01 03:40:12 +00001268 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001269 return NULL;
1270 Py_BEGIN_ALLOW_THREADS
1271 res = connect(s->sock_fd, addr, addrlen);
1272 Py_END_ALLOW_THREADS
Tim Petersc32410a2001-10-30 01:26:49 +00001273 if (res != 0) {
1274#ifdef MS_WINDOWS
1275 res = WSAGetLastError();
1276#else
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001277 res = errno;
Tim Petersc32410a2001-10-30 01:26:49 +00001278#endif
1279 }
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001280 return PyInt_FromLong((long) res);
1281}
1282
Guido van Rossum82a5c661998-07-07 20:45:43 +00001283static char connect_ex_doc[] =
1284"connect_ex(address)\n\
1285\n\
1286This is like connect(address), but returns an error code (the errno value)\n\
1287instead of raising an exception when an error occurs.";
1288
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001289
Guido van Rossumed233a51992-06-23 09:07:03 +00001290/* s.fileno() method */
1291
Guido van Rossum73624e91994-10-10 17:59:00 +00001292static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001293PySocketSock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001294{
Fred Drakea04eaad2000-06-30 02:46:07 +00001295#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001296 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001297#else
1298 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1299#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001300}
1301
Guido van Rossum82a5c661998-07-07 20:45:43 +00001302static char fileno_doc[] =
1303"fileno() -> integer\n\
1304\n\
1305Return the integer file descriptor of the socket.";
1306
Guido van Rossumed233a51992-06-23 09:07:03 +00001307
Guido van Rossumbe32c891996-06-20 16:25:29 +00001308#ifndef NO_DUP
1309/* s.dup() method */
1310
1311static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001312PySocketSock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001313{
Fred Drakea04eaad2000-06-30 02:46:07 +00001314 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001315 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001316
Guido van Rossumbe32c891996-06-20 16:25:29 +00001317 newfd = dup(s->sock_fd);
1318 if (newfd < 0)
1319 return PySocket_Err();
1320 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001321 s->sock_family,
1322 s->sock_type,
1323 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001324 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001325 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001326 return sock;
1327}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001328
1329static char dup_doc[] =
1330"dup() -> socket object\n\
1331\n\
1332Return a new socket object connected to the same system resource.";
1333
Guido van Rossumbe32c891996-06-20 16:25:29 +00001334#endif
1335
1336
Guido van Rossumc89705d1992-11-26 08:54:07 +00001337/* s.getsockname() method */
1338
Guido van Rossum73624e91994-10-10 17:59:00 +00001339static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001340PySocketSock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001341{
1342 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001343 int res;
1344 socklen_t addrlen;
1345
Guido van Rossumc89705d1992-11-26 08:54:07 +00001346 if (!getsockaddrlen(s, &addrlen))
1347 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001348 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001349 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001350 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001351 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001352 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001353 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001354 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001355}
1356
Guido van Rossum82a5c661998-07-07 20:45:43 +00001357static char getsockname_doc[] =
1358"getsockname() -> address info\n\
1359\n\
1360Return the address of the local endpoint. For IP sockets, the address\n\
1361info is a pair (hostaddr, port).";
1362
Guido van Rossumc89705d1992-11-26 08:54:07 +00001363
Guido van Rossumb6775db1994-08-01 11:34:53 +00001364#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001365/* s.getpeername() method */
1366
Guido van Rossum73624e91994-10-10 17:59:00 +00001367static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001368PySocketSock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001369{
1370 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001371 int res;
1372 socklen_t addrlen;
1373
Guido van Rossumc89705d1992-11-26 08:54:07 +00001374 if (!getsockaddrlen(s, &addrlen))
1375 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001376 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001377 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001378 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001379 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001380 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001381 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001382 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001383}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001384
1385static char getpeername_doc[] =
1386"getpeername() -> address info\n\
1387\n\
1388Return the address of the remote endpoint. For IP sockets, the address\n\
1389info is a pair (hostaddr, port).";
1390
Guido van Rossumb6775db1994-08-01 11:34:53 +00001391#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001392
1393
Guido van Rossum30a685f1991-06-27 15:51:29 +00001394/* s.listen(n) method */
1395
Guido van Rossum73624e91994-10-10 17:59:00 +00001396static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001397PySocketSock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001398{
1399 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001400 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001401
1402 backlog = PyInt_AsLong(arg);
1403 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001404 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001405 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001406 if (backlog < 1)
1407 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001408 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001409 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001410 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001411 return PySocket_Err();
1412 Py_INCREF(Py_None);
1413 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001414}
1415
Guido van Rossum82a5c661998-07-07 20:45:43 +00001416static char listen_doc[] =
1417"listen(backlog)\n\
1418\n\
1419Enable a server to accept connections. The backlog argument must be at\n\
1420least 1; it specifies the number of unaccepted connection that the system\n\
1421will allow before refusing new connections.";
1422
1423
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001424#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001425/* s.makefile(mode) method.
1426 Create a new open file object referring to a dupped version of
1427 the socket's file descriptor. (The dup() call is necessary so
1428 that the open file and socket objects may be closed independent
1429 of each other.)
1430 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1431
Guido van Rossum73624e91994-10-10 17:59:00 +00001432static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001433PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001434{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001435 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001436 char *mode = "r";
1437 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001438#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001439 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001440#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001441 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001442#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001443 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001444 PyObject *f;
1445
Guido van Rossum43713e52000-02-29 13:59:29 +00001446 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001447 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001448#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001449 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1450 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001451#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001452 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001453#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001454 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001455 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001456 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001457 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001458 }
1459 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1460 if (f != NULL)
1461 PyFile_SetBufSize(f, bufsize);
1462 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001463}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001464
1465static char makefile_doc[] =
1466"makefile([mode[, buffersize]]) -> file object\n\
1467\n\
1468Return a regular file object corresponding to the socket.\n\
1469The mode and buffersize arguments are as for the built-in open() function.";
1470
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001471#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001472
Guido van Rossum48a680c2001-03-02 06:34:14 +00001473
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001474/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001475
Guido van Rossum73624e91994-10-10 17:59:00 +00001476static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001477PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001478{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001479 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001480 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001481 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001482 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001483 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001484 if (buf == NULL)
1485 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001486 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001487 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001488 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001489 if (n < 0) {
1490 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001491 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001492 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001493 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001494 return NULL;
1495 return buf;
1496}
1497
Guido van Rossum82a5c661998-07-07 20:45:43 +00001498static char recv_doc[] =
1499"recv(buffersize[, flags]) -> data\n\
1500\n\
1501Receive up to buffersize bytes from the socket. For the optional flags\n\
1502argument, see the Unix manual. When no data is available, block until\n\
1503at least one byte is available or until the remote end is closed. When\n\
1504the remote end is closed and all data is read, return the empty string.";
1505
Guido van Rossum30a685f1991-06-27 15:51:29 +00001506
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001507/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001508
Guido van Rossum73624e91994-10-10 17:59:00 +00001509static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001510PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001511{
1512 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001513 PyObject *buf = NULL;
1514 PyObject *addr = NULL;
1515 PyObject *ret = NULL;
1516
Guido van Rossumff3ab422000-04-24 15:16:03 +00001517 int len, n, flags = 0;
1518 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001519 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001520 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001521 if (!getsockaddrlen(s, &addrlen))
1522 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001523 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001524 if (buf == NULL)
1525 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001526 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001527 memset(addrbuf, 0, addrlen);
1528 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001529#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001530#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001531 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001532#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001533 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001534#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001535#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001536 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001537#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001538 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001539 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001540 if (n < 0) {
1541 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001542 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001543 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001544 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001545 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001546
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001547 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001548 goto finally;
1549
Guido van Rossum73624e91994-10-10 17:59:00 +00001550 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001551 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001552 Py_XDECREF(addr);
1553 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001554 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001555}
1556
Guido van Rossum82a5c661998-07-07 20:45:43 +00001557static char recvfrom_doc[] =
1558"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1559\n\
1560Like recv(buffersize, flags) but also return the sender's address info.";
1561
Guido van Rossum30a685f1991-06-27 15:51:29 +00001562
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001563/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001564
Guido van Rossum73624e91994-10-10 17:59:00 +00001565static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001566PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001567{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001568 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001569 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001570 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001571 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001572 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001573 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001574 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001575 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001576 return PySocket_Err();
1577 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001578}
1579
Guido van Rossum82a5c661998-07-07 20:45:43 +00001580static char send_doc[] =
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001581"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001582\n\
1583Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001584argument, see the Unix manual. Return the number of bytes\n\
1585sent; this may be less than len(data) if the network is busy.";
1586
1587
1588/* s.sendall(data [,flags]) method */
1589
1590static PyObject *
1591PySocketSock_sendall(PySocketSockObject *s, PyObject *args)
1592{
1593 char *buf;
1594 int len, n, flags = 0, total = 0;
1595 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1596 return NULL;
1597 Py_BEGIN_ALLOW_THREADS
1598 do {
1599 n = send(s->sock_fd, buf, len, flags);
1600 if (n < 0)
1601 break;
1602 total += n;
1603 buf += n;
1604 len -= n;
1605 } while (len > 0);
1606 Py_END_ALLOW_THREADS
1607 if (n < 0)
1608 return PySocket_Err();
1609 Py_INCREF(Py_None);
1610 return Py_None;
1611}
1612
1613static char sendall_doc[] =
1614"sendall(data[, flags])\n\
1615\n\
1616Send a data string to the socket. For the optional flags\n\
1617argument, see the Unix manual. This calls send() repeatedly\n\
1618until all data is sent. If an error occurs, it's impossible\n\
1619to tell how much data has been sent.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001620
Guido van Rossum30a685f1991-06-27 15:51:29 +00001621
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001622/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001623
Guido van Rossum73624e91994-10-10 17:59:00 +00001624static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001625PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001626{
Guido van Rossum73624e91994-10-10 17:59:00 +00001627 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001628 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001629 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001630 int addrlen, len, n, flags;
1631 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001632 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001633 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001634 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1635 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001636 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001637 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001638 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001639 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001640 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001641 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001642 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001643 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001644 return PySocket_Err();
1645 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001646}
1647
Guido van Rossum82a5c661998-07-07 20:45:43 +00001648static char sendto_doc[] =
1649"sendto(data[, flags], address)\n\
1650\n\
1651Like send(data, flags) but allows specifying the destination address.\n\
1652For IP sockets, the address is a pair (hostaddr, port).";
1653
Guido van Rossum30a685f1991-06-27 15:51:29 +00001654
1655/* s.shutdown(how) method */
1656
Guido van Rossum73624e91994-10-10 17:59:00 +00001657static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001658PySocketSock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001659{
1660 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001661 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001662
1663 how = PyInt_AsLong(arg);
1664 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001665 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001666 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001667 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001668 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001669 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001670 return PySocket_Err();
1671 Py_INCREF(Py_None);
1672 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001673}
1674
Guido van Rossum82a5c661998-07-07 20:45:43 +00001675static char shutdown_doc[] =
1676"shutdown(flag)\n\
1677\n\
1678Shut down the reading side of the socket (flag == 0), the writing side\n\
1679of the socket (flag == 1), or both ends (flag == 2).";
1680
Guido van Rossum30a685f1991-06-27 15:51:29 +00001681
1682/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001683
Guido van Rossum73624e91994-10-10 17:59:00 +00001684static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum17209fc2001-10-15 21:12:54 +00001685 {"accept", (PyCFunction)PySocketSock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001686 accept_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001687 {"bind", (PyCFunction)PySocketSock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001688 bind_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00001689 {"close", (PyCFunction)PySocketSock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001690 close_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001691 {"connect", (PyCFunction)PySocketSock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001692 connect_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001693 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001694 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001695#ifndef NO_DUP
Guido van Rossum17209fc2001-10-15 21:12:54 +00001696 {"dup", (PyCFunction)PySocketSock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001697 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001698#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001699 {"fileno", (PyCFunction)PySocketSock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001700 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001701#ifdef HAVE_GETPEERNAME
Guido van Rossum17209fc2001-10-15 21:12:54 +00001702 {"getpeername", (PyCFunction)PySocketSock_getpeername,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001703 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001704#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001705 {"getsockname", (PyCFunction)PySocketSock_getsockname,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001706 METH_NOARGS, getsockname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001707 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1708 getsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001709 {"listen", (PyCFunction)PySocketSock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001710 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001711#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001712 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1713 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001714#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001715 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1716 recv_doc},
1717 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1718 recvfrom_doc},
1719 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1720 send_doc},
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001721 {"sendall", (PyCFunction)PySocketSock_sendall, METH_VARARGS,
1722 sendall_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001723 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1724 sendto_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001725 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001726 setblocking_doc},
1727 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1728 setsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001729 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001730 shutdown_doc},
1731#ifdef RISCOS
1732 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1733 sleeptaskw_doc},
1734#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001735 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001736};
1737
Guido van Rossum30a685f1991-06-27 15:51:29 +00001738
Guido van Rossum73624e91994-10-10 17:59:00 +00001739/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001740 First close the file description. */
1741
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001742static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001743PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001744{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001745 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001746 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001747 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001748}
1749
Guido van Rossum30a685f1991-06-27 15:51:29 +00001750
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001751static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001752PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001753{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001754 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001755#if SIZEOF_SOCKET_T > SIZEOF_LONG
1756 if (s->sock_fd > LONG_MAX) {
1757 /* this can occur on Win64, and actually there is a special
1758 ugly printf formatter for decimal pointer length integer
1759 printing, only bother if necessary*/
1760 PyErr_SetString(PyExc_OverflowError,
1761 "no printf formatter to display the socket descriptor in decimal");
1762 return NULL;
1763 }
1764#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001765 sprintf(buf,
1766 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001767 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001768 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001769}
1770
1771
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001772/* Create a new, uninitialized socket object. */
1773
1774static PyObject *
1775PySocketSock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1776{
1777 PyObject *new;
1778
1779 new = type->tp_alloc(type, 0);
1780 if (new != NULL)
1781 ((PySocketSockObject *)new)->sock_fd = -1;
1782 return new;
1783}
1784
1785
1786/* Initialize a new socket object. */
1787
1788/*ARGSUSED*/
1789static int
1790PySocketSock_init(PyObject *self, PyObject *args, PyObject *kwds)
1791{
1792 PySocketSockObject *s = (PySocketSockObject *)self;
1793 SOCKET_T fd;
1794 int family = AF_INET, type = SOCK_STREAM, proto = 0;
1795 static char *keywords[] = {"family", "type", "proto", 0};
1796
1797 if (!PyArg_ParseTupleAndKeywords(args, kwds,
1798 "|iii:socket", keywords,
1799 &family, &type, &proto))
1800 return -1;
1801 Py_BEGIN_ALLOW_THREADS
1802 fd = socket(family, type, proto);
1803 Py_END_ALLOW_THREADS
1804#ifdef MS_WINDOWS
1805 if (fd == INVALID_SOCKET)
1806#else
1807 if (fd < 0)
1808#endif
1809 {
1810 PySocket_Err();
1811 return -1;
1812 }
1813 init_sockobject(s, fd, family, type, proto);
1814 /* From now on, ignore SIGPIPE and let the error checking
1815 do the work. */
1816#ifdef SIGPIPE
1817 (void) signal(SIGPIPE, SIG_IGN);
1818#endif
1819 return 0;
1820}
1821
1822
Guido van Rossumb6775db1994-08-01 11:34:53 +00001823/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001824
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001825static char socket_doc[] =
1826"socket([family[, type[, proto]]]) -> socket object\n\
1827\n\
1828Open a socket of the given type. The family argument specifies the\n\
1829address family; it defaults to AF_INET. The type argument specifies\n\
1830whether this is a stream (SOCK_STREAM, this is the default)\n\
1831or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1832specifying the default protocol.\n\
1833\n\
1834A socket represents one endpoint of a network connection.\n\
1835\n\
1836Methods:\n\
1837\n\
1838accept() -- accept a connection, returning new socket and client address\n\
1839bind() -- bind the socket to a local address\n\
1840close() -- close the socket\n\
1841connect() -- connect the socket to a remote address\n\
1842connect_ex() -- connect, return an error code instead of an exception \n\
1843dup() -- return a new socket object identical to the current one (*)\n\
1844fileno() -- return underlying file descriptor\n\
1845getpeername() -- return remote address (*)\n\
1846getsockname() -- return local address\n\
1847getsockopt() -- get socket options\n\
1848listen() -- start listening for incoming connections\n\
1849makefile() -- return a file object corresponding tot the socket (*)\n\
1850recv() -- receive data\n\
1851recvfrom() -- receive data and sender's address\n\
1852send() -- send data, may not send all of it\n\
1853sendall() -- send all data\n\
1854sendto() -- send data to a given address\n\
1855setblocking() -- set or clear the blocking I/O flag\n\
1856setsockopt() -- set socket options\n\
1857shutdown() -- shut down traffic in one or both directions\n\
1858\n\
1859(*) not available on all platforms!)";
1860
Guido van Rossum73624e91994-10-10 17:59:00 +00001861static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001862 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001863 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00001864 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001865 sizeof(PySocketSockObject), /* tp_basicsize */
1866 0, /* tp_itemsize */
1867 (destructor)PySocketSock_dealloc, /* tp_dealloc */
1868 0, /* tp_print */
1869 0, /* tp_getattr */
1870 0, /* tp_setattr */
1871 0, /* tp_compare */
1872 (reprfunc)PySocketSock_repr, /* tp_repr */
1873 0, /* tp_as_number */
1874 0, /* tp_as_sequence */
1875 0, /* tp_as_mapping */
1876 0, /* tp_hash */
1877 0, /* tp_call */
1878 0, /* tp_str */
1879 PyObject_GenericGetAttr, /* tp_getattro */
1880 0, /* tp_setattro */
1881 0, /* tp_as_buffer */
1882 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1883 socket_doc, /* tp_doc */
1884 0, /* tp_traverse */
1885 0, /* tp_clear */
1886 0, /* tp_richcompare */
1887 0, /* tp_weaklistoffset */
1888 0, /* tp_iter */
1889 0, /* tp_iternext */
1890 PySocketSock_methods, /* tp_methods */
1891 0, /* tp_members */
1892 0, /* tp_getset */
1893 0, /* tp_base */
1894 0, /* tp_dict */
1895 0, /* tp_descr_get */
1896 0, /* tp_descr_set */
1897 0, /* tp_dictoffset */
1898 PySocketSock_init, /* tp_init */
1899 PyType_GenericAlloc, /* tp_alloc */
1900 PySocketSock_new, /* tp_new */
1901 _PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001902};
1903
Guido van Rossum30a685f1991-06-27 15:51:29 +00001904
Guido van Rossum81194471991-07-27 21:42:02 +00001905/* Python interface to gethostname(). */
1906
1907/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001908static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001909PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001910{
1911 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001912 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001913 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001914 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001915 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001916 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001917 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001918 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001919 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001920 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001921 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001922}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001923
Guido van Rossum82a5c661998-07-07 20:45:43 +00001924static char gethostname_doc[] =
1925"gethostname() -> string\n\
1926\n\
1927Return the current host name.";
1928
Guido van Rossumff4949e1992-08-05 19:58:53 +00001929
Guido van Rossum30a685f1991-06-27 15:51:29 +00001930/* Python interface to gethostbyname(name). */
1931
1932/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001933static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001934PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001935{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001936 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001937 struct sockaddr_storage addrbuf;
1938
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001939 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001940 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001941 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001942 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001943 return makeipaddr((struct sockaddr *)&addrbuf,
1944 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001945}
1946
Guido van Rossum82a5c661998-07-07 20:45:43 +00001947static char gethostbyname_doc[] =
1948"gethostbyname(host) -> address\n\
1949\n\
1950Return the IP address (a string of the form '255.255.255.255') for a host.";
1951
1952
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001953/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1954
1955static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001956gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001957{
1958 char **pch;
1959 PyObject *rtn_tuple = (PyObject *)NULL;
1960 PyObject *name_list = (PyObject *)NULL;
1961 PyObject *addr_list = (PyObject *)NULL;
1962 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001963
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001964 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001965 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001966#ifndef RISCOS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001967 PyH_Err(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001968#else
1969 PyErr_SetString(PySocket_Error, "host not found");
1970#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001971 return NULL;
1972 }
1973 if (h->h_addrtype != af) {
1974#ifdef HAVE_STRERROR
1975 /* Let's get real error message to return */
1976 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001977#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001978 PyErr_SetString(PySocket_Error,
1979 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001980#endif
1981 return NULL;
1982 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001983 switch (af) {
1984 case AF_INET:
1985 if (alen < sizeof(struct sockaddr_in))
1986 return NULL;
1987 break;
1988#ifdef INET6
1989 case AF_INET6:
1990 if (alen < sizeof(struct sockaddr_in6))
1991 return NULL;
1992 break;
1993#endif
1994 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001995 if ((name_list = PyList_New(0)) == NULL)
1996 goto err;
1997 if ((addr_list = PyList_New(0)) == NULL)
1998 goto err;
1999 for (pch = h->h_aliases; *pch != NULL; pch++) {
2000 int status;
2001 tmp = PyString_FromString(*pch);
2002 if (tmp == NULL)
2003 goto err;
2004 status = PyList_Append(name_list, tmp);
2005 Py_DECREF(tmp);
2006 if (status)
2007 goto err;
2008 }
2009 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2010 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002011 switch (af) {
2012 case AF_INET:
2013 {
2014 struct sockaddr_in sin;
2015 memset(&sin, 0, sizeof(sin));
2016 sin.sin_family = af;
2017#ifdef HAVE_SOCKADDR_SA_LEN
2018 sin.sin_len = sizeof(sin);
2019#endif
2020 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2021 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
2022 if (pch == h->h_addr_list && alen >= sizeof(sin))
2023 memcpy((char *) addr, &sin, sizeof(sin));
2024 break;
2025 }
2026#ifdef INET6
2027 case AF_INET6:
2028 {
2029 struct sockaddr_in6 sin6;
2030 memset(&sin6, 0, sizeof(sin6));
2031 sin6.sin6_family = af;
2032#ifdef HAVE_SOCKADDR_SA_LEN
2033 sin6.sin6_len = sizeof(sin6);
2034#endif
2035 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2036 tmp = makeipaddr((struct sockaddr *)&sin6,
2037 sizeof(sin6));
2038 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2039 memcpy((char *) addr, &sin6, sizeof(sin6));
2040 break;
2041 }
2042#endif
2043 default: /* can't happen */
2044 PyErr_SetString(PySocket_Error,
2045 "unsupported address family");
2046 return NULL;
2047 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002048 if (tmp == NULL)
2049 goto err;
2050 status = PyList_Append(addr_list, tmp);
2051 Py_DECREF(tmp);
2052 if (status)
2053 goto err;
2054 }
2055 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
2056 err:
2057 Py_XDECREF(name_list);
2058 Py_XDECREF(addr_list);
2059 return rtn_tuple;
2060}
2061
2062
2063/* Python interface to gethostbyname_ex(name). */
2064
2065/*ARGSUSED*/
2066static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002067PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002068{
2069 char *name;
2070 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002071 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002072 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002073 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002074#ifdef HAVE_GETHOSTBYNAME_R
2075 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002076#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2077 struct hostent_data data;
2078#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002079 char buf[16384];
2080 int buf_len = (sizeof buf) - 1;
2081 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002082#endif
2083#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002084 int result;
2085#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002086#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002087
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002088 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002089 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002090 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002091 return NULL;
2092 Py_BEGIN_ALLOW_THREADS
2093#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002094#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002095 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002096#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002097 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002098#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002099 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002100 result = gethostbyname_r(name, &hp_allocated, &data);
2101 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002102#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002103#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002104#ifdef USE_GETHOSTBYNAME_LOCK
2105 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002106#endif
2107 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002108#endif /* HAVE_GETHOSTBYNAME_R */
2109 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002110 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
2111 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
2112 sa = (struct sockaddr*)&addr;
2113 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002114#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002115 PyThread_release_lock(gethostbyname_lock);
2116#endif
2117 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002118}
2119
2120static char ghbn_ex_doc[] =
2121"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2122\n\
2123Return the true host name, a list of aliases, and a list of IP addresses,\n\
2124for a host. The host argument is a string giving a host name or IP number.";
2125
2126
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002127/* Python interface to gethostbyaddr(IP). */
2128
2129/*ARGSUSED*/
2130static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002131PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002132{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002133#ifdef INET6
2134 struct sockaddr_storage addr;
2135#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002136 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002137#endif
2138 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002139 char *ip_num;
2140 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002141 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002142#ifdef HAVE_GETHOSTBYNAME_R
2143 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002144#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2145 struct hostent_data data;
2146#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002147 char buf[16384];
2148 int buf_len = (sizeof buf) - 1;
2149 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002150#endif
2151#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002152 int result;
2153#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002154#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002155 char *ap;
2156 int al;
2157 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002158
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002159 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002160 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002161 af = PF_UNSPEC;
2162 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002163 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002164 af = sa->sa_family;
2165 ap = NULL;
2166 al = 0;
2167 switch (af) {
2168 case AF_INET:
2169 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2170 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2171 break;
2172#ifdef INET6
2173 case AF_INET6:
2174 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2175 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2176 break;
2177#endif
2178 default:
2179 PyErr_SetString(PySocket_Error, "unsupported address family");
2180 return NULL;
2181 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002182 Py_BEGIN_ALLOW_THREADS
2183#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002184#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002185 result = gethostbyaddr_r(ap, al, af,
2186 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002187 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002188#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002189 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002190 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002191#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002192 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002193 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002194 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002195#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002196#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002197#ifdef USE_GETHOSTBYNAME_LOCK
2198 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002199#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002200 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002201#endif /* HAVE_GETHOSTBYNAME_R */
2202 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002203 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002204#ifdef USE_GETHOSTBYNAME_LOCK
2205 PyThread_release_lock(gethostbyname_lock);
2206#endif
2207 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002208}
2209
Guido van Rossum82a5c661998-07-07 20:45:43 +00002210static char gethostbyaddr_doc[] =
2211"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2212\n\
2213Return the true host name, a list of aliases, and a list of IP addresses,\n\
2214for a host. The host argument is a string giving a host name or IP number.";
2215
Guido van Rossum30a685f1991-06-27 15:51:29 +00002216
2217/* Python interface to getservbyname(name).
2218 This only returns the port number, since the other info is already
2219 known or not useful (like the list of aliases). */
2220
2221/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002222static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002223PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002224{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002225 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002226 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002227 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002228 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002229 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002230 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002231 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002232 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002233 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002234 return NULL;
2235 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002236 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002237}
2238
Guido van Rossum82a5c661998-07-07 20:45:43 +00002239static char getservbyname_doc[] =
2240"getservbyname(servicename, protocolname) -> integer\n\
2241\n\
2242Return a port number from a service name and protocol name.\n\
2243The protocol name should be 'tcp' or 'udp'.";
2244
Guido van Rossum30a685f1991-06-27 15:51:29 +00002245
Guido van Rossum3901d851996-12-19 16:35:04 +00002246/* Python interface to getprotobyname(name).
2247 This only returns the protocol number, since the other info is
2248 already known or not useful (like the list of aliases). */
2249
2250/*ARGSUSED*/
2251static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002252PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002253{
2254 char *name;
2255 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002256#ifdef __BEOS__
2257/* Not available in BeOS yet. - [cjh] */
2258 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2259 return NULL;
2260#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002261 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002262 return NULL;
2263 Py_BEGIN_ALLOW_THREADS
2264 sp = getprotobyname(name);
2265 Py_END_ALLOW_THREADS
2266 if (sp == NULL) {
2267 PyErr_SetString(PySocket_Error, "protocol not found");
2268 return NULL;
2269 }
2270 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002271#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002272}
2273
Guido van Rossum82a5c661998-07-07 20:45:43 +00002274static char getprotobyname_doc[] =
2275"getprotobyname(name) -> integer\n\
2276\n\
2277Return the protocol number for the named protocol. (Rarely used.)";
2278
Guido van Rossum3901d851996-12-19 16:35:04 +00002279
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002280#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002281/* Create a socket object from a numeric file description.
2282 Useful e.g. if stdin is a socket.
2283 Additional arguments as for socket(). */
2284
2285/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002286static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002287PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002288{
Guido van Rossum73624e91994-10-10 17:59:00 +00002289 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002290 SOCKET_T fd;
2291 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002292 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2293 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002294 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002295 /* Dup the fd so it and the socket can be closed independently */
2296 fd = dup(fd);
2297 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002298 return PySocket_Err();
2299 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002300 /* From now on, ignore SIGPIPE and let the error checking
2301 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002302#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002303 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002304#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002305 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002306}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002307
2308static char fromfd_doc[] =
2309"fromfd(fd, family, type[, proto]) -> socket object\n\
2310\n\
2311Create a socket object from the given file descriptor.\n\
2312The remaining arguments are the same as for socket().";
2313
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002314#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002315
Guido van Rossum82a5c661998-07-07 20:45:43 +00002316
Guido van Rossum006bf911996-06-12 04:04:55 +00002317static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002318PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002319{
2320 int x1, x2;
2321
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002322 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002323 return NULL;
2324 }
2325 x2 = (int)ntohs((short)x1);
2326 return PyInt_FromLong(x2);
2327}
2328
Guido van Rossum82a5c661998-07-07 20:45:43 +00002329static char ntohs_doc[] =
2330"ntohs(integer) -> integer\n\
2331\n\
2332Convert a 16-bit integer from network to host byte order.";
2333
2334
Guido van Rossum006bf911996-06-12 04:04:55 +00002335static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002336PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002337{
2338 int x1, x2;
2339
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002340 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002341 return NULL;
2342 }
2343 x2 = ntohl(x1);
2344 return PyInt_FromLong(x2);
2345}
2346
Guido van Rossum82a5c661998-07-07 20:45:43 +00002347static char ntohl_doc[] =
2348"ntohl(integer) -> integer\n\
2349\n\
2350Convert a 32-bit integer from network to host byte order.";
2351
2352
Guido van Rossum006bf911996-06-12 04:04:55 +00002353static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002354PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002355{
2356 int x1, x2;
2357
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002358 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002359 return NULL;
2360 }
2361 x2 = (int)htons((short)x1);
2362 return PyInt_FromLong(x2);
2363}
2364
Guido van Rossum82a5c661998-07-07 20:45:43 +00002365static char htons_doc[] =
2366"htons(integer) -> integer\n\
2367\n\
2368Convert a 16-bit integer from host to network byte order.";
2369
2370
Guido van Rossum006bf911996-06-12 04:04:55 +00002371static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002372PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002373{
2374 int x1, x2;
2375
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002376 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002377 return NULL;
2378 }
2379 x2 = htonl(x1);
2380 return PyInt_FromLong(x2);
2381}
2382
Guido van Rossum82a5c661998-07-07 20:45:43 +00002383static char htonl_doc[] =
2384"htonl(integer) -> integer\n\
2385\n\
2386Convert a 32-bit integer from host to network byte order.";
2387
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002388/*
2389 * socket.inet_aton() and socket.inet_ntoa() functions
2390 *
2391 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2392 *
2393 */
2394
Guido van Rossum48a680c2001-03-02 06:34:14 +00002395static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002396"inet_aton(string) -> packed 32-bit IP representation\n\
2397\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002398Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002399binary format used in low-level network functions.";
2400
2401static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002402PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002403{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002404#ifndef INADDR_NONE
2405#define INADDR_NONE (-1)
2406#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002407
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002408 /* Have to use inet_addr() instead */
2409 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002410 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002411
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002412 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002413 return NULL;
2414 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002415#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002416 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002417#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002418 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002419#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002420
2421 if (packed_addr == INADDR_NONE) { /* invalid address */
2422 PyErr_SetString(PySocket_Error,
2423 "illegal IP address string passed to inet_aton");
2424 return NULL;
2425 }
2426
2427 return PyString_FromStringAndSize((char *) &packed_addr,
2428 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002429}
2430
Guido van Rossum48a680c2001-03-02 06:34:14 +00002431static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002432"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002433\n\
2434Convert an IP address from 32-bit packed binary format to string format";
2435
2436static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002437PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002438{
2439 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002440 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002441 struct in_addr packed_addr;
2442
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002443 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002444 return NULL;
2445 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002446
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002447 if (addr_len != sizeof(packed_addr)) {
2448 PyErr_SetString(PySocket_Error,
2449 "packed IP wrong length for inet_ntoa");
2450 return NULL;
2451 }
2452
2453 memcpy(&packed_addr, packed_str, addr_len);
2454
2455 return PyString_FromString(inet_ntoa(packed_addr));
2456}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002457
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002458/* Python interface to getaddrinfo(host, port). */
2459
2460/*ARGSUSED*/
2461static PyObject *
2462PySocket_getaddrinfo(PyObject *self, PyObject *args)
2463{
2464 struct addrinfo hints, *res0, *res;
2465 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002466 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002467 char *hptr, *pptr;
2468 int family, socktype, protocol, flags;
2469 int error;
2470 PyObject *all = (PyObject *)NULL;
2471 PyObject *single = (PyObject *)NULL;
2472
2473 family = socktype = protocol = flags = 0;
2474 family = PF_UNSPEC;
2475 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2476 &hptr, &pobj, &family, &socktype,
2477 &protocol, &flags)) {
2478 return NULL;
2479 }
2480 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002481 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002482 pptr = pbuf;
2483 } else if (PyString_Check(pobj)) {
2484 pptr = PyString_AsString(pobj);
2485 } else if (pobj == Py_None) {
2486 pptr = (char *)NULL;
2487 } else {
2488 PyErr_SetString(PySocket_Error, "Int or String expected");
2489 return NULL;
2490 }
2491 memset(&hints, 0, sizeof(hints));
2492 hints.ai_family = family;
2493 hints.ai_socktype = socktype;
2494 hints.ai_protocol = protocol;
2495 hints.ai_flags = flags;
2496 error = getaddrinfo(hptr, pptr, &hints, &res0);
2497 if (error) {
2498 PyGAI_Err(error);
2499 return NULL;
2500 }
2501
2502 if ((all = PyList_New(0)) == NULL)
2503 goto err;
2504 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002505 PyObject *addr =
2506 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2507 if (addr == NULL)
2508 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002509 single = Py_BuildValue("iiisO", res->ai_family,
2510 res->ai_socktype, res->ai_protocol,
2511 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002512 addr);
2513 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002514 if (single == NULL)
2515 goto err;
2516
2517 if (PyList_Append(all, single))
2518 goto err;
2519 Py_XDECREF(single);
2520 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002521 return all;
2522 err:
2523 Py_XDECREF(single);
2524 Py_XDECREF(all);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002525 return (PyObject *)NULL;
2526}
2527
2528static char getaddrinfo_doc[] =
2529"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2530 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2531\n\
2532Resolve host and port into addrinfo struct.";
2533
2534/* Python interface to getnameinfo(sa, flags). */
2535
2536/*ARGSUSED*/
2537static PyObject *
2538PySocket_getnameinfo(PyObject *self, PyObject *args)
2539{
2540 PyObject *sa = (PyObject *)NULL;
2541 int flags;
2542 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002543 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002544 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2545 struct addrinfo hints, *res = NULL;
2546 int error;
2547 PyObject *ret = (PyObject *)NULL;
2548
2549 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002550 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002551 return NULL;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002552 if (!PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, &scope_id))
2553 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002554 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002555 memset(&hints, 0, sizeof(hints));
2556 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002557 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002558 error = getaddrinfo(hostp, pbuf, &hints, &res);
2559 if (error) {
2560 PyGAI_Err(error);
2561 goto fail;
2562 }
2563 if (res->ai_next) {
2564 PyErr_SetString(PySocket_Error,
2565 "sockaddr resolved to multiple addresses");
2566 goto fail;
2567 }
2568 switch (res->ai_family) {
2569 case AF_INET:
2570 {
2571 char *t1;
2572 int t2;
2573 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2574 PyErr_SetString(PySocket_Error,
2575 "IPv4 sockaddr must be 2 tuple");
2576 goto fail;
2577 }
2578 break;
2579 }
2580#ifdef INET6
2581 case AF_INET6:
2582 {
2583 struct sockaddr_in6 *sin6;
2584 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2585 sin6->sin6_flowinfo = flowinfo;
2586 sin6->sin6_scope_id = scope_id;
2587 break;
2588 }
2589#endif
2590 }
2591 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2592 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2593 if (error) {
2594 PyGAI_Err(error);
2595 goto fail;
2596 }
2597 ret = Py_BuildValue("ss", hbuf, pbuf);
2598
2599fail:
2600 if (res)
2601 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002602 return ret;
2603}
2604
2605static char getnameinfo_doc[] =
2606"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2607\n\
2608Get host and port for a sockaddr.";
2609
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002610/* XXX It might be helpful to augment the error message generated
2611 below with the name of the SSL function that generated the error.
2612 I expect it's obvious most of the time.
2613*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002614
2615#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002616static PyObject *
2617PySSL_SetError(SSL *ssl, int ret)
2618{
2619 PyObject *v, *n, *s;
2620 char *errstr;
2621 int err;
2622
2623 assert(ret <= 0);
2624
2625 err = SSL_get_error(ssl, ret);
2626 n = PyInt_FromLong(err);
2627 if (n == NULL)
2628 return NULL;
2629 v = PyTuple_New(2);
2630 if (v == NULL) {
2631 Py_DECREF(n);
2632 return NULL;
2633 }
2634
2635 switch (SSL_get_error(ssl, ret)) {
2636 case SSL_ERROR_ZERO_RETURN:
2637 errstr = "TLS/SSL connection has been closed";
2638 break;
2639 case SSL_ERROR_WANT_READ:
2640 errstr = "The operation did not complete (read)";
2641 break;
2642 case SSL_ERROR_WANT_WRITE:
2643 errstr = "The operation did not complete (write)";
2644 break;
2645 case SSL_ERROR_WANT_X509_LOOKUP:
2646 errstr = "The operation did not complete (X509 lookup)";
2647 break;
2648 case SSL_ERROR_SYSCALL:
2649 case SSL_ERROR_SSL:
2650 {
2651 unsigned long e = ERR_get_error();
2652 if (e == 0) {
2653 /* an EOF was observed that violates the protocol */
2654 errstr = "EOF occurred in violation of protocol";
2655 } else if (e == -1) {
2656 /* the underlying BIO reported an I/O error */
2657 Py_DECREF(v);
2658 Py_DECREF(n);
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +00002659 return PySocket_Err();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002660 } else {
2661 /* XXX Protected by global interpreter lock */
2662 errstr = ERR_error_string(e, NULL);
2663 }
2664 break;
2665 }
2666 default:
2667 errstr = "Invalid error code";
2668 }
2669 s = PyString_FromString(errstr);
2670 if (s == NULL) {
2671 Py_DECREF(v);
2672 Py_DECREF(n);
2673 }
2674 PyTuple_SET_ITEM(v, 0, n);
2675 PyTuple_SET_ITEM(v, 1, s);
2676 PyErr_SetObject(PySSLErrorObject, v);
2677 return NULL;
2678}
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002679
2680/* This is a C function to be called for new object initialization */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002681static PySSLObject *
2682newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002683{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002684 PySSLObject *self;
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002685 char *errstr = NULL;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002686 int ret;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002687
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002688 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002689 if (self == NULL){
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002690 errstr = "newPySSLObject error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002691 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002692 }
Jeremy Hyltonba699362001-10-11 17:23:34 +00002693 memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
2694 memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002695 self->server_cert = NULL;
2696 self->ssl = NULL;
2697 self->ctx = NULL;
2698 self->Socket = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002699
Jeremy Hylton22738b92001-10-10 22:37:48 +00002700 if ((key_file && !cert_file) || (!key_file && cert_file)) {
2701 errstr = "Both the key & certificate files must be specified";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002702 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002703 }
2704
Jeremy Hylton22738b92001-10-10 22:37:48 +00002705 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2706 if (self->ctx == NULL) {
2707 errstr = "SSL_CTX_new error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002708 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002709 }
2710
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002711 if (key_file) {
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002712 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002713 SSL_FILETYPE_PEM) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002714 errstr = "SSL_CTX_use_PrivateKey_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002715 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002716 }
2717
2718 if (SSL_CTX_use_certificate_chain_file(self->ctx,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002719 cert_file) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002720 errstr = "SSL_CTX_use_certificate_chain_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002721 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002722 }
2723 }
2724
2725 SSL_CTX_set_verify(self->ctx,
2726 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2727 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2728 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2729 SSL_set_connect_state(self->ssl);
2730
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002731 /* Actually negotiate SSL connection */
2732 /* XXX If SSL_connect() returns 0, it's also a failure. */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002733 ret = SSL_connect(self->ssl);
2734 if (ret <= 0) {
2735 PySSL_SetError(self->ssl, ret);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002736 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002737 }
2738 self->ssl->debug = 1;
2739
2740 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2741 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002742 self->server, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002743 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002744 self->issuer, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002745 }
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002746 self->Socket = Sock;
2747 Py_INCREF(self->Socket);
2748 return self;
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002749 fail:
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002750 if (errstr)
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002751 PyErr_SetString(PySSLErrorObject, errstr);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002752 Py_DECREF(self);
2753 return NULL;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002754}
2755
2756/* This is the Python function called for new object initialization */
2757static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002758PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002759{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002760 PySSLObject *rv;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002761 PySocketSockObject *Sock;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002762 char *key_file = NULL;
2763 char *cert_file = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002764
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002765 if (!PyArg_ParseTuple(args, "O!|zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002766 &PySocketSock_Type, (PyObject*)&Sock,
Jeremy Hyltonab006452001-10-10 03:33:24 +00002767 &key_file, &cert_file))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002768 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002769
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002770 rv = newPySSLObject(Sock, key_file, cert_file);
Jeremy Hyltonab006452001-10-10 03:33:24 +00002771 if (rv == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002772 return NULL;
2773 return (PyObject *)rv;
2774}
2775
2776static char ssl_doc[] =
Jeremy Hyltonba699362001-10-11 17:23:34 +00002777"ssl(socket, [keyfile, certfile]) -> sslobject";
2778
2779/* SSL object methods */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002780
2781static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002782PySSL_server(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002783{
2784 return PyString_FromString(self->server);
2785}
2786
2787static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002788PySSL_issuer(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002789{
2790 return PyString_FromString(self->issuer);
2791}
2792
2793
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002794static void PySSL_dealloc(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002795{
2796 if (self->server_cert) /* Possible not to have one? */
2797 X509_free (self->server_cert);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002798 if (self->ssl)
2799 SSL_free(self->ssl);
2800 if (self->ctx)
2801 SSL_CTX_free(self->ctx);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002802 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002803 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002804}
2805
Jeremy Hyltonba699362001-10-11 17:23:34 +00002806static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
2807{
2808 char *data;
2809 int len;
2810
2811 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
2812 return NULL;
2813
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002814 Py_BEGIN_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002815 len = SSL_write(self->ssl, data, len);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002816 Py_END_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002817 if (len > 0)
2818 return PyInt_FromLong(len);
2819 else
2820 return PySSL_SetError(self->ssl, len);
2821}
2822
2823static char PySSL_SSLwrite_doc[] =
2824"write(s) -> len\n\
2825\n\
2826Writes the string s into the SSL object. Returns the number\n\
2827of bytes written.";
2828
2829static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
2830{
2831 PyObject *buf;
2832 int count = 0;
2833 int len = 1024;
2834
2835 if (!PyArg_ParseTuple(args, "|i:read", &len))
2836 return NULL;
2837
2838 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2839 return NULL;
2840
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002841 Py_BEGIN_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002842 count = SSL_read(self->ssl, PyString_AsString(buf), len);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002843 Py_END_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002844 if (count <= 0) {
2845 Py_DECREF(buf);
2846 return PySSL_SetError(self->ssl, count);
2847 }
2848 if (count != len && _PyString_Resize(&buf, count) < 0)
2849 return NULL;
2850 return buf;
2851}
2852
2853static char PySSL_SSLread_doc[] =
2854"read([len]) -> string\n\
2855\n\
2856Read up to len bytes from the SSL socket.";
2857
2858static PyMethodDef PySSLMethods[] = {
2859 {"write", (PyCFunction)PySSL_SSLwrite, 1,
2860 PySSL_SSLwrite_doc},
2861 {"read", (PyCFunction)PySSL_SSLread, 1,
2862 PySSL_SSLread_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00002863 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
2864 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Jeremy Hyltonba699362001-10-11 17:23:34 +00002865 {NULL, NULL}
2866};
2867
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002868static PyObject *PySSL_getattr(PySSLObject *self, char *name)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002869{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002870 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002871}
2872
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002873staticforward PyTypeObject PySSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002874 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002875 0, /*ob_size*/
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002876 "_socket.SSL", /*tp_name*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002877 sizeof(PySSLObject), /*tp_basicsize*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002878 0, /*tp_itemsize*/
2879 /* methods */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002880 (destructor)PySSL_dealloc, /*tp_dealloc*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002881 0, /*tp_print*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002882 (getattrfunc)PySSL_getattr, /*tp_getattr*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002883 0, /*tp_setattr*/
2884 0, /*tp_compare*/
2885 0, /*tp_repr*/
2886 0, /*tp_as_number*/
2887 0, /*tp_as_sequence*/
2888 0, /*tp_as_mapping*/
2889 0, /*tp_hash*/
2890};
2891
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002892/* helper routines for seeding the SSL PRNG */
2893static PyObject *
2894PySSL_RAND_add(PyObject *self, PyObject *args)
2895{
2896 char *buf;
2897 int len;
2898 double entropy;
2899
2900 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
2901 return NULL;
2902 RAND_add(buf, len, entropy);
2903 Py_INCREF(Py_None);
2904 return Py_None;
2905}
2906
2907static char PySSL_RAND_add_doc[] =
2908"RAND_add(string, entropy)\n\
2909\n\
2910Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
2911bound on the entropy contained in string.";
2912
2913static PyObject *
2914PySSL_RAND_status(PyObject *self)
2915{
2916 return PyInt_FromLong(RAND_status());
2917}
2918
2919static char PySSL_RAND_status_doc[] =
2920"RAND_status() -> 0 or 1\n\
2921\n\
2922Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
2923It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
2924using the ssl() function.";
2925
2926static PyObject *
2927PySSL_RAND_egd(PyObject *self, PyObject *arg)
2928{
2929 int bytes;
2930
2931 if (!PyString_Check(arg))
2932 return PyErr_Format(PyExc_TypeError,
2933 "RAND_egd() expected string, found %s",
2934 arg->ob_type->tp_name);
2935 bytes = RAND_egd(PyString_AS_STRING(arg));
2936 if (bytes == -1) {
2937 PyErr_SetString(PySSLErrorObject,
2938 "EGD connection failed or EGD did not return "
2939 "enough data to seed the PRNG");
2940 return NULL;
2941 }
2942 return PyInt_FromLong(bytes);
2943}
2944
2945static char PySSL_RAND_egd_doc[] =
Guido van Rossumcad8fa12001-10-19 12:40:40 +00002946"RAND_egd(path) -> bytes\n\
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002947\n\
2948Queries the entropy gather daemon (EGD) on socket path. Returns number\n\
2949of bytes read. Raises socket.sslerror if connection to EGD fails or\n\
2950if it does provide enough data to seed PRNG.";
2951
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002952#endif /* USE_SSL */
2953
2954
Guido van Rossum30a685f1991-06-27 15:51:29 +00002955/* List of functions exported by this module. */
2956
Guido van Rossum73624e91994-10-10 17:59:00 +00002957static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002958 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002959 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002960 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002961 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002962 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002963 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002964 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002965 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002966 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002967 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002968 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002969 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002970#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002971 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002972 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002973#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002974 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002975 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002976 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002977 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002978 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002979 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002980 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002981 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002982 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002983 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002984 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002985 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002986 {"getaddrinfo", PySocket_getaddrinfo,
2987 METH_VARARGS, getaddrinfo_doc},
2988 {"getnameinfo", PySocket_getnameinfo,
2989 METH_VARARGS, getnameinfo_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002990#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002991 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002992 METH_VARARGS, ssl_doc},
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002993 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
2994 PySSL_RAND_add_doc},
2995 {"RAND_egd", PySSL_RAND_egd, METH_O,
2996 PySSL_RAND_egd_doc},
2997 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
2998 PySSL_RAND_status_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002999#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003000 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003001};
3002
Guido van Rossum30a685f1991-06-27 15:51:29 +00003003
3004/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00003005 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003006 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00003007 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003008static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00003009insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003010{
Guido van Rossum73624e91994-10-10 17:59:00 +00003011 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00003012 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003013 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00003014
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003015 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003016}
3017
Guido van Rossum30a685f1991-06-27 15:51:29 +00003018
Guido van Rossum8d665e61996-06-26 18:22:49 +00003019#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00003020
3021/* Additional initialization and cleanup for NT/Windows */
3022
3023static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003024NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003025{
3026 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003027}
3028
3029static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003030NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003031{
3032 WSADATA WSAData;
3033 int ret;
3034 char buf[100];
3035 ret = WSAStartup(0x0101, &WSAData);
3036 switch (ret) {
3037 case 0: /* no error */
3038 atexit(NTcleanup);
3039 return 1;
3040 case WSASYSNOTREADY:
3041 PyErr_SetString(PyExc_ImportError,
3042 "WSAStartup failed: network not ready");
3043 break;
3044 case WSAVERNOTSUPPORTED:
3045 case WSAEINVAL:
3046 PyErr_SetString(PyExc_ImportError,
3047 "WSAStartup failed: requested version not supported");
3048 break;
3049 default:
3050 sprintf(buf, "WSAStartup failed: error code %d", ret);
3051 PyErr_SetString(PyExc_ImportError, buf);
3052 break;
3053 }
3054 return 0;
3055}
3056
Guido van Rossum8d665e61996-06-26 18:22:49 +00003057#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003058
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003059#if defined(PYOS_OS2)
3060
3061/* Additional initialization and cleanup for OS/2 */
3062
3063static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003064OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003065{
3066 /* No cleanup is necessary for OS/2 Sockets */
3067}
3068
3069static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003070OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003071{
3072 char reason[64];
3073 int rc = sock_init();
3074
3075 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00003076 atexit(OS2cleanup);
3077 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003078 }
3079
3080 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
3081 PyErr_SetString(PyExc_ImportError, reason);
3082
Guido van Rossum32c575d1997-12-02 20:37:32 +00003083 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003084}
3085
3086#endif /* PYOS_OS2 */
3087
Guido van Rossum30a685f1991-06-27 15:51:29 +00003088/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003089 * This is called when the first 'import socket' is done,
3090 * via a table in config.c, if config.c is compiled with USE_SOCKET
3091 * defined.
3092 *
3093 * For MS_WINDOWS (which means any Windows variant), this module
3094 * is actually called "_socket", and there's a wrapper "socket.py"
3095 * which implements some missing functionality (such as makefile(),
3096 * dup() and fromfd()). The import of "_socket" may fail with an
3097 * ImportError exception if initialization of WINSOCK fails. When
3098 * WINSOCK is initialized succesfully, a call to WSACleanup() is
3099 * scheduled to be made at exit time.
3100 *
3101 * For OS/2, this module is also called "_socket" and uses a wrapper
3102 * "socket.py" which implements that functionality that is missing
3103 * when PC operating systems don't put socket descriptors in the
3104 * operating system's filesystem layer.
3105 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003106
Guido van Rossum82a5c661998-07-07 20:45:43 +00003107static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00003108"Implementation module for socket operations. See the socket module\n\
3109for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00003110
Guido van Rossum3886bb61998-12-04 18:50:17 +00003111DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003112init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003113{
Guido van Rossum73624e91994-10-10 17:59:00 +00003114 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003115#ifdef RISCOS
3116 _kernel_swi_regs r;
3117 r.r[0]=0;
3118 _kernel_swi(0x43380, &r, &r);
3119 taskwindow = r.r[0];
3120#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00003121#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00003122 if (!NTinit())
3123 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00003124#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00003125#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003126 if (!OS2init())
3127 return;
Fred Drakea136d492000-08-16 14:18:30 +00003128#endif /* __TOS_OS2__ */
3129#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00003130#endif /* RISCOS */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003131 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossuma120ffc2001-01-22 15:29:14 +00003132#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003133 PySSL_Type.ob_type = &PyType_Type;
Guido van Rossuma120ffc2001-01-22 15:29:14 +00003134#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00003135 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00003136 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003137 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
3138 if (PySocket_Error == NULL)
3139 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003140 PyDict_SetItemString(d, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003141 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
3142 if (PyH_Error == NULL)
3143 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003144 PyDict_SetItemString(d, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003145 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
3146 NULL);
3147 if (PyGAI_Error == NULL)
3148 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003149 PyDict_SetItemString(d, "gaierror", PyGAI_Error);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003150#ifdef USE_SSL
3151 SSL_load_error_strings();
3152 SSLeay_add_ssl_algorithms();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003153 PySSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
3154 if (PySSLErrorObject == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003155 return;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003156 PyDict_SetItemString(d, "sslerror", PySSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003157 if (PyDict_SetItemString(d, "SSLType",
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003158 (PyObject *)&PySSL_Type) != 0)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003159 return;
Jeremy Hylton57ca8732001-10-11 00:00:17 +00003160 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
3161 SSL_ERROR_ZERO_RETURN);
3162 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
3163 SSL_ERROR_WANT_READ);
3164 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
3165 SSL_ERROR_WANT_WRITE);
3166 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
3167 SSL_ERROR_WANT_X509_LOOKUP);
3168 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
3169 SSL_ERROR_SYSCALL);
3170 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
3171 SSL_ERROR_SSL);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003172#endif /* USE_SSL */
Guido van Rossum91ba64d1997-06-02 22:18:09 +00003173 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00003174 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003175 return;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003176 if (PyDict_SetItemString(d, "socket",
3177 (PyObject *)&PySocketSock_Type) != 0)
3178 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003179
3180 /* Address families (we only support AF_INET and AF_UNIX) */
3181#ifdef AF_UNSPEC
3182 insint(d, "AF_UNSPEC", AF_UNSPEC);
3183#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003184 insint(d, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003185#ifdef AF_INET6
3186 insint(d, "AF_INET6", AF_INET6);
3187#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003188#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003189 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003190#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003191#ifdef AF_AX25
3192 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
3193#endif
3194#ifdef AF_IPX
3195 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
3196#endif
3197#ifdef AF_APPLETALK
3198 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
3199#endif
3200#ifdef AF_NETROM
3201 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
3202#endif
3203#ifdef AF_BRIDGE
3204 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
3205#endif
3206#ifdef AF_AAL5
3207 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
3208#endif
3209#ifdef AF_X25
3210 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
3211#endif
3212#ifdef AF_INET6
3213 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
3214#endif
3215#ifdef AF_ROSE
3216 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
3217#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003218#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00003219 insint(d, "AF_PACKET", AF_PACKET);
3220 insint(d, "PF_PACKET", PF_PACKET);
3221 insint(d, "PACKET_HOST", PACKET_HOST);
3222 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
3223 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
3224 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3225 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
3226 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3227 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003228#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003229
3230 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003231 insint(d, "SOCK_STREAM", SOCK_STREAM);
3232 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003233#ifndef __BEOS__
3234/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003235 insint(d, "SOCK_RAW", SOCK_RAW);
3236 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3237 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003238#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003239
3240#ifdef SO_DEBUG
3241 insint(d, "SO_DEBUG", SO_DEBUG);
3242#endif
3243#ifdef SO_ACCEPTCONN
3244 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
3245#endif
3246#ifdef SO_REUSEADDR
3247 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
3248#endif
3249#ifdef SO_KEEPALIVE
3250 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
3251#endif
3252#ifdef SO_DONTROUTE
3253 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
3254#endif
3255#ifdef SO_BROADCAST
3256 insint(d, "SO_BROADCAST", SO_BROADCAST);
3257#endif
3258#ifdef SO_USELOOPBACK
3259 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
3260#endif
3261#ifdef SO_LINGER
3262 insint(d, "SO_LINGER", SO_LINGER);
3263#endif
3264#ifdef SO_OOBINLINE
3265 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
3266#endif
3267#ifdef SO_REUSEPORT
3268 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
3269#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003270#ifdef SO_SNDBUF
3271 insint(d, "SO_SNDBUF", SO_SNDBUF);
3272#endif
3273#ifdef SO_RCVBUF
3274 insint(d, "SO_RCVBUF", SO_RCVBUF);
3275#endif
3276#ifdef SO_SNDLOWAT
3277 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
3278#endif
3279#ifdef SO_RCVLOWAT
3280 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
3281#endif
3282#ifdef SO_SNDTIMEO
3283 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
3284#endif
3285#ifdef SO_RCVTIMEO
3286 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
3287#endif
3288#ifdef SO_ERROR
3289 insint(d, "SO_ERROR", SO_ERROR);
3290#endif
3291#ifdef SO_TYPE
3292 insint(d, "SO_TYPE", SO_TYPE);
3293#endif
3294
3295 /* Maximum number of connections for "listen" */
3296#ifdef SOMAXCONN
3297 insint(d, "SOMAXCONN", SOMAXCONN);
3298#else
3299 insint(d, "SOMAXCONN", 5); /* Common value */
3300#endif
3301
3302 /* Flags for send, recv */
3303#ifdef MSG_OOB
3304 insint(d, "MSG_OOB", MSG_OOB);
3305#endif
3306#ifdef MSG_PEEK
3307 insint(d, "MSG_PEEK", MSG_PEEK);
3308#endif
3309#ifdef MSG_DONTROUTE
3310 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
3311#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003312#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00003313 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003314#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003315#ifdef MSG_EOR
3316 insint(d, "MSG_EOR", MSG_EOR);
3317#endif
3318#ifdef MSG_TRUNC
3319 insint(d, "MSG_TRUNC", MSG_TRUNC);
3320#endif
3321#ifdef MSG_CTRUNC
3322 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
3323#endif
3324#ifdef MSG_WAITALL
3325 insint(d, "MSG_WAITALL", MSG_WAITALL);
3326#endif
3327#ifdef MSG_BTAG
3328 insint(d, "MSG_BTAG", MSG_BTAG);
3329#endif
3330#ifdef MSG_ETAG
3331 insint(d, "MSG_ETAG", MSG_ETAG);
3332#endif
3333
3334 /* Protocol level and numbers, usable for [gs]etsockopt */
3335#ifdef SOL_SOCKET
3336 insint(d, "SOL_SOCKET", SOL_SOCKET);
3337#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003338#ifdef SOL_IP
3339 insint(d, "SOL_IP", SOL_IP);
3340#else
3341 insint(d, "SOL_IP", 0);
3342#endif
3343#ifdef SOL_IPX
3344 insint(d, "SOL_IPX", SOL_IPX);
3345#endif
3346#ifdef SOL_AX25
3347 insint(d, "SOL_AX25", SOL_AX25);
3348#endif
3349#ifdef SOL_ATALK
3350 insint(d, "SOL_ATALK", SOL_ATALK);
3351#endif
3352#ifdef SOL_NETROM
3353 insint(d, "SOL_NETROM", SOL_NETROM);
3354#endif
3355#ifdef SOL_ROSE
3356 insint(d, "SOL_ROSE", SOL_ROSE);
3357#endif
3358#ifdef SOL_TCP
3359 insint(d, "SOL_TCP", SOL_TCP);
3360#else
3361 insint(d, "SOL_TCP", 6);
3362#endif
3363#ifdef SOL_UDP
3364 insint(d, "SOL_UDP", SOL_UDP);
3365#else
3366 insint(d, "SOL_UDP", 17);
3367#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003368#ifdef IPPROTO_IP
3369 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003370#else
3371 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003372#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003373#ifdef IPPROTO_HOPOPTS
3374 insint(d, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
3375#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003376#ifdef IPPROTO_ICMP
3377 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003378#else
3379 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003380#endif
3381#ifdef IPPROTO_IGMP
3382 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
3383#endif
3384#ifdef IPPROTO_GGP
3385 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
3386#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003387#ifdef IPPROTO_IPV4
3388 insint(d, "IPPROTO_IPV4", IPPROTO_IPV4);
3389#endif
3390#ifdef IPPROTO_IPIP
3391 insint(d, "IPPROTO_IPIP", IPPROTO_IPIP);
3392#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003393#ifdef IPPROTO_TCP
3394 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003395#else
3396 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003397#endif
3398#ifdef IPPROTO_EGP
3399 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
3400#endif
3401#ifdef IPPROTO_PUP
3402 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
3403#endif
3404#ifdef IPPROTO_UDP
3405 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003406#else
3407 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003408#endif
3409#ifdef IPPROTO_IDP
3410 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
3411#endif
3412#ifdef IPPROTO_HELLO
3413 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
3414#endif
3415#ifdef IPPROTO_ND
3416 insint(d, "IPPROTO_ND", IPPROTO_ND);
3417#endif
3418#ifdef IPPROTO_TP
3419 insint(d, "IPPROTO_TP", IPPROTO_TP);
3420#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003421#ifdef IPPROTO_IPV6
3422 insint(d, "IPPROTO_IPV6", IPPROTO_IPV6);
3423#endif
3424#ifdef IPPROTO_ROUTING
3425 insint(d, "IPPROTO_ROUTING", IPPROTO_ROUTING);
3426#endif
3427#ifdef IPPROTO_FRAGMENT
3428 insint(d, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
3429#endif
3430#ifdef IPPROTO_RSVP
3431 insint(d, "IPPROTO_RSVP", IPPROTO_RSVP);
3432#endif
3433#ifdef IPPROTO_GRE
3434 insint(d, "IPPROTO_GRE", IPPROTO_GRE);
3435#endif
3436#ifdef IPPROTO_ESP
3437 insint(d, "IPPROTO_ESP", IPPROTO_ESP);
3438#endif
3439#ifdef IPPROTO_AH
3440 insint(d, "IPPROTO_AH", IPPROTO_AH);
3441#endif
3442#ifdef IPPROTO_MOBILE
3443 insint(d, "IPPROTO_MOBILE", IPPROTO_MOBILE);
3444#endif
3445#ifdef IPPROTO_ICMPV6
3446 insint(d, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
3447#endif
3448#ifdef IPPROTO_NONE
3449 insint(d, "IPPROTO_NONE", IPPROTO_NONE);
3450#endif
3451#ifdef IPPROTO_DSTOPTS
3452 insint(d, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
3453#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003454#ifdef IPPROTO_XTP
3455 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
3456#endif
3457#ifdef IPPROTO_EON
3458 insint(d, "IPPROTO_EON", IPPROTO_EON);
3459#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003460#ifdef IPPROTO_PIM
3461 insint(d, "IPPROTO_PIM", IPPROTO_PIM);
3462#endif
3463#ifdef IPPROTO_IPCOMP
3464 insint(d, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
3465#endif
3466#ifdef IPPROTO_VRRP
3467 insint(d, "IPPROTO_VRRP", IPPROTO_VRRP);
3468#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003469#ifdef IPPROTO_BIP
3470 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
3471#endif
3472/**/
3473#ifdef IPPROTO_RAW
3474 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003475#else
3476 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003477#endif
3478#ifdef IPPROTO_MAX
3479 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
3480#endif
3481
3482 /* Some port configuration */
3483#ifdef IPPORT_RESERVED
3484 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
3485#else
3486 insint(d, "IPPORT_RESERVED", 1024);
3487#endif
3488#ifdef IPPORT_USERRESERVED
3489 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
3490#else
3491 insint(d, "IPPORT_USERRESERVED", 5000);
3492#endif
3493
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003494 /* Some reserved IP v.4 addresses */
3495#ifdef INADDR_ANY
3496 insint(d, "INADDR_ANY", INADDR_ANY);
3497#else
3498 insint(d, "INADDR_ANY", 0x00000000);
3499#endif
3500#ifdef INADDR_BROADCAST
3501 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
3502#else
3503 insint(d, "INADDR_BROADCAST", 0xffffffff);
3504#endif
3505#ifdef INADDR_LOOPBACK
3506 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
3507#else
3508 insint(d, "INADDR_LOOPBACK", 0x7F000001);
3509#endif
3510#ifdef INADDR_UNSPEC_GROUP
3511 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
3512#else
3513 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
3514#endif
3515#ifdef INADDR_ALLHOSTS_GROUP
3516 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
3517#else
3518 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
3519#endif
3520#ifdef INADDR_MAX_LOCAL_GROUP
3521 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
3522#else
3523 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
3524#endif
3525#ifdef INADDR_NONE
3526 insint(d, "INADDR_NONE", INADDR_NONE);
3527#else
3528 insint(d, "INADDR_NONE", 0xffffffff);
3529#endif
3530
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003531 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003532#ifdef IP_OPTIONS
3533 insint(d, "IP_OPTIONS", IP_OPTIONS);
3534#endif
3535#ifdef IP_HDRINCL
3536 insint(d, "IP_HDRINCL", IP_HDRINCL);
3537#endif
3538#ifdef IP_TOS
3539 insint(d, "IP_TOS", IP_TOS);
3540#endif
3541#ifdef IP_TTL
3542 insint(d, "IP_TTL", IP_TTL);
3543#endif
3544#ifdef IP_RECVOPTS
3545 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
3546#endif
3547#ifdef IP_RECVRETOPTS
3548 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
3549#endif
3550#ifdef IP_RECVDSTADDR
3551 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
3552#endif
3553#ifdef IP_RETOPTS
3554 insint(d, "IP_RETOPTS", IP_RETOPTS);
3555#endif
3556#ifdef IP_MULTICAST_IF
3557 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
3558#endif
3559#ifdef IP_MULTICAST_TTL
3560 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
3561#endif
3562#ifdef IP_MULTICAST_LOOP
3563 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
3564#endif
3565#ifdef IP_ADD_MEMBERSHIP
3566 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
3567#endif
3568#ifdef IP_DROP_MEMBERSHIP
3569 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
3570#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003571#ifdef IP_DEFAULT_MULTICAST_TTL
3572 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
3573#endif
3574#ifdef IP_DEFAULT_MULTICAST_LOOP
3575 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
3576#endif
3577#ifdef IP_MAX_MEMBERSHIPS
3578 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
3579#endif
3580
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003581 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3582#ifdef IPV6_JOIN_GROUP
3583 insint(d, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
3584#endif
3585#ifdef IPV6_LEAVE_GROUP
3586 insint(d, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
3587#endif
3588#ifdef IPV6_MULTICAST_HOPS
3589 insint(d, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
3590#endif
3591#ifdef IPV6_MULTICAST_IF
3592 insint(d, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
3593#endif
3594#ifdef IPV6_MULTICAST_LOOP
3595 insint(d, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
3596#endif
3597#ifdef IPV6_UNICAST_HOPS
3598 insint(d, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
3599#endif
3600
Guido van Rossum09be4091999-08-09 14:40:40 +00003601 /* TCP options */
3602#ifdef TCP_NODELAY
3603 insint(d, "TCP_NODELAY", TCP_NODELAY);
3604#endif
3605#ifdef TCP_MAXSEG
3606 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
3607#endif
3608
3609 /* IPX options */
3610#ifdef IPX_TYPE
3611 insint(d, "IPX_TYPE", IPX_TYPE);
3612#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003613
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003614 /* get{addr,name}info parameters */
3615#ifdef EAI_ADDRFAMILY
3616 insint(d, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
3617#endif
3618#ifdef EAI_AGAIN
3619 insint(d, "EAI_AGAIN", EAI_AGAIN);
3620#endif
3621#ifdef EAI_BADFLAGS
3622 insint(d, "EAI_BADFLAGS", EAI_BADFLAGS);
3623#endif
3624#ifdef EAI_FAIL
3625 insint(d, "EAI_FAIL", EAI_FAIL);
3626#endif
3627#ifdef EAI_FAMILY
3628 insint(d, "EAI_FAMILY", EAI_FAMILY);
3629#endif
3630#ifdef EAI_MEMORY
3631 insint(d, "EAI_MEMORY", EAI_MEMORY);
3632#endif
3633#ifdef EAI_NODATA
3634 insint(d, "EAI_NODATA", EAI_NODATA);
3635#endif
3636#ifdef EAI_NONAME
3637 insint(d, "EAI_NONAME", EAI_NONAME);
3638#endif
3639#ifdef EAI_SERVICE
3640 insint(d, "EAI_SERVICE", EAI_SERVICE);
3641#endif
3642#ifdef EAI_SOCKTYPE
3643 insint(d, "EAI_SOCKTYPE", EAI_SOCKTYPE);
3644#endif
3645#ifdef EAI_SYSTEM
3646 insint(d, "EAI_SYSTEM", EAI_SYSTEM);
3647#endif
3648#ifdef EAI_BADHINTS
3649 insint(d, "EAI_BADHINTS", EAI_BADHINTS);
3650#endif
3651#ifdef EAI_PROTOCOL
3652 insint(d, "EAI_PROTOCOL", EAI_PROTOCOL);
3653#endif
3654#ifdef EAI_MAX
3655 insint(d, "EAI_MAX", EAI_MAX);
3656#endif
3657#ifdef AI_PASSIVE
3658 insint(d, "AI_PASSIVE", AI_PASSIVE);
3659#endif
3660#ifdef AI_CANONNAME
3661 insint(d, "AI_CANONNAME", AI_CANONNAME);
3662#endif
3663#ifdef AI_NUMERICHOST
3664 insint(d, "AI_NUMERICHOST", AI_NUMERICHOST);
3665#endif
3666#ifdef AI_MASK
3667 insint(d, "AI_MASK", AI_MASK);
3668#endif
3669#ifdef AI_ALL
3670 insint(d, "AI_ALL", AI_ALL);
3671#endif
3672#ifdef AI_V4MAPPED_CFG
3673 insint(d, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
3674#endif
3675#ifdef AI_ADDRCONFIG
3676 insint(d, "AI_ADDRCONFIG", AI_ADDRCONFIG);
3677#endif
3678#ifdef AI_V4MAPPED
3679 insint(d, "AI_V4MAPPED", AI_V4MAPPED);
3680#endif
3681#ifdef AI_DEFAULT
3682 insint(d, "AI_DEFAULT", AI_DEFAULT);
3683#endif
3684#ifdef NI_MAXHOST
3685 insint(d, "NI_MAXHOST", NI_MAXHOST);
3686#endif
3687#ifdef NI_MAXSERV
3688 insint(d, "NI_MAXSERV", NI_MAXSERV);
3689#endif
3690#ifdef NI_NOFQDN
3691 insint(d, "NI_NOFQDN", NI_NOFQDN);
3692#endif
3693#ifdef NI_NUMERICHOST
3694 insint(d, "NI_NUMERICHOST", NI_NUMERICHOST);
3695#endif
3696#ifdef NI_NAMEREQD
3697 insint(d, "NI_NAMEREQD", NI_NAMEREQD);
3698#endif
3699#ifdef NI_NUMERICSERV
3700 insint(d, "NI_NUMERICSERV", NI_NUMERICSERV);
3701#endif
3702#ifdef NI_DGRAM
3703 insint(d, "NI_DGRAM", NI_DGRAM);
3704#endif
3705
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003706 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003707#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003708 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003709#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003710}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003711
3712/* Simplistic emulation code for inet_pton that only works for IPv4 */
3713#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003714int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003715inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003716{
3717 if(af == AF_INET){
3718 long packed_addr;
3719#ifdef USE_GUSI1
3720 packed_addr = (long)inet_addr(src).s_addr;
3721#else
3722 packed_addr = inet_addr(src);
3723#endif
3724 if (packed_addr == INADDR_NONE)
3725 return 0;
3726 memcpy(dst, &packed_addr, 4);
3727 return 1;
3728 }
3729 /* Should set errno to EAFNOSUPPORT */
3730 return -1;
3731}
3732
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003733const char *
3734inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003735{
3736 if (af == AF_INET) {
3737 struct in_addr packed_addr;
3738 if (size < 16)
3739 /* Should set errno to ENOSPC. */
3740 return NULL;
3741 memcpy(&packed_addr, src, sizeof(packed_addr));
3742 return strncpy(dst, inet_ntoa(packed_addr), size);
3743 }
3744 /* Should set errno to EAFNOSUPPORT */
3745 return NULL;
3746}
3747#endif