blob: e5d850cb3bc87157b466998767450228278b25b7 [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>
Fred Drake51d90362000-10-06 15:37:06 +0000145#if !(defined(__BEOS__) || defined(__CYGWIN__))
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>
152#else
Guido van Rossumff3ab422000-04-24 15:16:03 +0000153#ifndef USE_GUSI1
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000154#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000155#endif
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000156#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000157
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000158#ifndef RISCOS
Guido van Rossume4485b01994-09-07 14:32:49 +0000159#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000160#else
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000161#include <sys/fcntl.h>
162#define NO_DUP
163int h_errno; /* not used */
164#endif
165#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000166#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000167#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000168#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000169
Guido van Rossum48a680c2001-03-02 06:34:14 +0000170
Guido van Rossumb6775db1994-08-01 11:34:53 +0000171#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000172#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000173#else
174#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000175#endif
176
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000177#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000178#include <sys/ioctl.h>
179#include <net/if.h>
180#include <netpacket/packet.h>
181#endif
182
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000183#ifdef HAVE_STDDEF_H
184#include <stddef.h>
185#endif
186
187#ifndef offsetof
188#define offsetof(type, member) ((size_t)(&((type *)0)->member))
189#endif
190
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000191#ifndef O_NDELAY
192#define O_NDELAY O_NONBLOCK /* For QNX only? */
193#endif
194
Guido van Rossumff3ab422000-04-24 15:16:03 +0000195#ifdef USE_GUSI1
Jack Jansen508537b1996-02-14 15:57:45 +0000196/* fdopen() isn't declared in stdio.h (sigh) */
197#include <GUSI.h>
198#endif
199
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000200#include "addrinfo.h"
201
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000202#ifdef USE_SSL
Andrew M. Kuchling697a0b02001-01-18 17:41:41 +0000203#include "openssl/rsa.h"
204#include "openssl/crypto.h"
205#include "openssl/x509.h"
206#include "openssl/pem.h"
207#include "openssl/ssl.h"
208#include "openssl/err.h"
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +0000209#include "openssl/rand.h"
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000210#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000211
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000212#ifndef HAVE_INET_PTON
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000213int inet_pton (int af, const char *src, void *dst);
214const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000215#endif
216
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000217#ifdef __APPLE__
218/* On OS X, getaddrinfo returns no error indication of lookup
219 failure, so we must use the emulation instead of the libinfo
220 implementation. Unfortunately, performing an autoconf test
221 for this bug would require DNS access for the machine performing
222 the configuration, which is not acceptable. Therefore, we
223 determine the bug just by checking for __APPLE__. If this bug
224 gets ever fixed, perhaps checking for sys/version.h would be
225 appropriate, which is 10/0 on the system with the bug. */
226#undef HAVE_GETADDRINFO
227/* avoid clashes with the C library definition of the symbol. */
228#define getaddrinfo fake_getaddrinfo
229#endif
230
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000231/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000232#if !defined(HAVE_GETADDRINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000233#include "getaddrinfo.c"
234#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000235#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000236#include "getnameinfo.c"
237#endif
238
Guido van Rossumbcc20741998-08-04 22:53:56 +0000239#if defined(MS_WINDOWS) || defined(__BEOS__)
240/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000241/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000242#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000243#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000244#endif
245
Fred Drakea04eaad2000-06-30 02:46:07 +0000246/* abstract the socket file descriptor type */
247#ifdef MS_WINDOWS
248typedef SOCKET SOCKET_T;
249# ifdef MS_WIN64
250# define SIZEOF_SOCKET_T 8
251# else
252# define SIZEOF_SOCKET_T 4
253# endif
254#else
255typedef int SOCKET_T;
256# define SIZEOF_SOCKET_T SIZEOF_INT
257#endif
258
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000259#ifdef MS_WIN32
260# define EAFNOSUPPORT WSAEAFNOSUPPORT
261# define snprintf _snprintf
262#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000263
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000264#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000265#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000266#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000267#endif
268
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000269#ifndef SOCKETCLOSE
270#define SOCKETCLOSE close
271#endif
272
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000273
274/* XXX There's a problem here: *static* functions are not supposed to have
275 a Py prefix (or use CapitalizedWords). Later... */
276
Guido van Rossum30a685f1991-06-27 15:51:29 +0000277/* Global variable holding the exception type for errors detected
278 by this module (but not argument type or memory errors, etc.). */
279
Guido van Rossum73624e91994-10-10 17:59:00 +0000280static PyObject *PySocket_Error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000281static PyObject *PyH_Error;
282static PyObject *PyGAI_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000283
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000284#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000285static PyObject *PySSLErrorObject;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000286#endif /* USE_SSL */
287
Guido van Rossum30a685f1991-06-27 15:51:29 +0000288
Guido van Rossum48a680c2001-03-02 06:34:14 +0000289#ifdef RISCOS
290/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
291static int taskwindow;
292#endif
293
294
Guido van Rossum30a685f1991-06-27 15:51:29 +0000295/* Convenience function to raise an error according to errno
296 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000297
Guido van Rossum73624e91994-10-10 17:59:00 +0000298static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000299PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000300{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000301#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000302 int err_no = WSAGetLastError();
303 if (err_no) {
304 static struct { int no; const char *msg; } *msgp, msgs[] = {
305 { WSAEINTR, "Interrupted system call" },
306 { WSAEBADF, "Bad file descriptor" },
307 { WSAEACCES, "Permission denied" },
308 { WSAEFAULT, "Bad address" },
309 { WSAEINVAL, "Invalid argument" },
310 { WSAEMFILE, "Too many open files" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000311 { WSAEWOULDBLOCK,
Mark Hammond46a733d2000-07-24 01:45:11 +0000312 "The socket operation could not complete "
313 "without blocking" },
314 { WSAEINPROGRESS, "Operation now in progress" },
315 { WSAEALREADY, "Operation already in progress" },
316 { WSAENOTSOCK, "Socket operation on non-socket" },
317 { WSAEDESTADDRREQ, "Destination address required" },
318 { WSAEMSGSIZE, "Message too long" },
319 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
320 { WSAENOPROTOOPT, "Protocol not available" },
321 { WSAEPROTONOSUPPORT, "Protocol not supported" },
322 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
323 { WSAEOPNOTSUPP, "Operation not supported" },
324 { WSAEPFNOSUPPORT, "Protocol family not supported" },
325 { WSAEAFNOSUPPORT, "Address family not supported" },
326 { WSAEADDRINUSE, "Address already in use" },
327 { WSAEADDRNOTAVAIL,
328 "Can't assign requested address" },
329 { WSAENETDOWN, "Network is down" },
330 { WSAENETUNREACH, "Network is unreachable" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000331 { WSAENETRESET,
Mark Hammond46a733d2000-07-24 01:45:11 +0000332 "Network dropped connection on reset" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000333 { WSAECONNABORTED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000334 "Software caused connection abort" },
335 { WSAECONNRESET, "Connection reset by peer" },
336 { WSAENOBUFS, "No buffer space available" },
337 { WSAEISCONN, "Socket is already connected" },
338 { WSAENOTCONN, "Socket is not connected" },
339 { WSAESHUTDOWN, "Can't send after socket shutdown" },
340 { WSAETOOMANYREFS,
341 "Too many references: can't splice" },
342 { WSAETIMEDOUT, "Operation timed out" },
343 { WSAECONNREFUSED, "Connection refused" },
344 { WSAELOOP, "Too many levels of symbolic links" },
345 { WSAENAMETOOLONG, "File name too long" },
346 { WSAEHOSTDOWN, "Host is down" },
347 { WSAEHOSTUNREACH, "No route to host" },
348 { WSAENOTEMPTY, "Directory not empty" },
349 { WSAEPROCLIM, "Too many processes" },
350 { WSAEUSERS, "Too many users" },
351 { WSAEDQUOT, "Disc quota exceeded" },
352 { WSAESTALE, "Stale NFS file handle" },
353 { WSAEREMOTE, "Too many levels of remote in path" },
354 { WSASYSNOTREADY,
355 "Network subsystem is unvailable" },
356 { WSAVERNOTSUPPORTED,
357 "WinSock version is not supported" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000358 { WSANOTINITIALISED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000359 "Successful WSAStartup() not yet performed" },
360 { WSAEDISCON, "Graceful shutdown in progress" },
361 /* Resolver errors */
362 { WSAHOST_NOT_FOUND, "No such host is known" },
363 { WSATRY_AGAIN, "Host not found, or server failed" },
364 { WSANO_RECOVERY,
365 "Unexpected server error encountered" },
366 { WSANO_DATA, "Valid name without requested data" },
367 { WSANO_ADDRESS, "No address, look for MX record" },
368 { 0, NULL }
369 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000370 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000371 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000372
Mark Hammond46a733d2000-07-24 01:45:11 +0000373 for (msgp = msgs; msgp->msg; msgp++) {
374 if (err_no == msgp->no) {
375 msg = msgp->msg;
376 break;
377 }
378 }
379
380 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000381 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000382 PyErr_SetObject(PySocket_Error, v);
383 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000384 }
385 return NULL;
386 }
387 else
388#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000389
390#if defined(PYOS_OS2)
391 if (sock_errno() != NO_ERROR) {
392 APIRET rc;
393 ULONG msglen;
394 char outbuf[100];
395 int myerrorcode = sock_errno();
396
397 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
398 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
399 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
400 if (rc == NO_ERROR) {
401 PyObject *v;
402
403 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
404 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
405 char *lastc = &outbuf[ strlen(outbuf)-1 ];
406 while (lastc > outbuf && isspace(*lastc))
407 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
408 }
409 v = Py_BuildValue("(is)", myerrorcode, outbuf);
410 if (v != NULL) {
411 PyErr_SetObject(PySocket_Error, v);
412 Py_DECREF(v);
413 }
414 return NULL;
415 }
416 }
417#endif
418
Guido van Rossum73624e91994-10-10 17:59:00 +0000419 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000420}
421
Guido van Rossum30a685f1991-06-27 15:51:29 +0000422
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000423static PyObject *
424PyH_Err(int h_error)
425{
426 PyObject *v;
427
428#ifdef HAVE_HSTRERROR
429 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
430#else
431 v = Py_BuildValue("(is)", h_error, "host not found");
432#endif
433 if (v != NULL) {
Martin v. Löwis864e9ff2001-08-04 22:32:03 +0000434 PyErr_SetObject(PyH_Error, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000435 Py_DECREF(v);
436 }
437
438 return NULL;
439}
440
441
442static PyObject *
443PyGAI_Err(int error)
444{
445 PyObject *v;
446
447 if (error == EAI_SYSTEM)
448 return PySocket_Err();
449
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000450#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000451 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000452#else
453 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
454#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000455 if (v != NULL) {
456 PyErr_SetObject(PyGAI_Error, v);
457 Py_DECREF(v);
458 }
459
460 return NULL;
461}
462
463
Guido van Rossum30a685f1991-06-27 15:51:29 +0000464/* The object holding a socket. It holds some extra information,
465 like the address family, which is used to decode socket address
466 arguments properly. */
467
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000468typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000469 PyObject_HEAD
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000470 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000471 int sock_family; /* Address family, e.g., AF_INET */
472 int sock_type; /* Socket type, e.g., SOCK_STREAM */
473 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000474 union sock_addr {
475 struct sockaddr_in in;
476#ifdef AF_UNIX
477 struct sockaddr_un un;
478#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000479#ifdef INET6
480 struct sockaddr_in6 in6;
481 struct sockaddr_storage storage;
482#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000483#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000484 struct sockaddr_ll ll;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000485#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000486 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000487} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000488
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000489#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000490
Jeremy Hyltonba699362001-10-11 17:23:34 +0000491#define X509_NAME_MAXLEN 256
492
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000493typedef struct {
494 PyObject_HEAD
495 PySocketSockObject *Socket; /* Socket on which we're layered */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000496 SSL_CTX* ctx;
497 SSL* ssl;
498 X509* server_cert;
499 BIO* sbio;
Jeremy Hyltonba699362001-10-11 17:23:34 +0000500 char server[X509_NAME_MAXLEN];
501 char issuer[X509_NAME_MAXLEN];
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000502
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000503} PySSLObject;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000504
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000505staticforward PyTypeObject PySSL_Type;
506staticforward PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args);
507staticforward PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000508
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000509#define PySSLObject_Check(v) ((v)->ob_type == &PySSL_Type)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000510
511#endif /* USE_SSL */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000512
Guido van Rossum30a685f1991-06-27 15:51:29 +0000513/* A forward reference to the Socktype type object.
514 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000515 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000516 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000517
Guido van Rossum73624e91994-10-10 17:59:00 +0000518staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000519
Guido van Rossum30a685f1991-06-27 15:51:29 +0000520
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000521/* Initialize a new socket object. */
522
523static void
524init_sockobject(PySocketSockObject *s,
525 SOCKET_T fd, int family, int type, int proto)
526{
527#ifdef RISCOS
528 int block = 1;
529#endif
530 s->sock_fd = fd;
531 s->sock_family = family;
532 s->sock_type = type;
533 s->sock_proto = proto;
534#ifdef RISCOS
535 if(taskwindow) {
536 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
537 }
538#endif
539}
540
541
Guido van Rossum30a685f1991-06-27 15:51:29 +0000542/* Create a new socket object.
543 This just creates the object and initializes it.
544 If the creation fails, return NULL and set an exception (implicit
545 in NEWOBJ()). */
546
Guido van Rossum73624e91994-10-10 17:59:00 +0000547static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000548PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000549{
Guido van Rossum73624e91994-10-10 17:59:00 +0000550 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000551 s = (PySocketSockObject *)
552 PyType_GenericNew(&PySocketSock_Type, NULL, NULL);
553 if (s != NULL)
554 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000555 return s;
556}
557
Guido van Rossum30a685f1991-06-27 15:51:29 +0000558
Guido van Rossum48a680c2001-03-02 06:34:14 +0000559/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000560 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000561#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000562PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000563#endif
564
565
Guido van Rossum30a685f1991-06-27 15:51:29 +0000566/* Convert a string specifying a host name or one of a few symbolic
567 names to a numeric IP address. This usually calls gethostbyname()
568 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000569 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000570 an error occurred; then an exception is raised. */
571
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000572static int
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000573setipaddr(char* name, struct sockaddr * addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000574{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000575 struct addrinfo hints, *res;
576 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000577
Guido van Rossuma376cc51996-12-05 23:43:35 +0000578 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000579 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000580 int siz;
581 memset(&hints, 0, sizeof(hints));
582 hints.ai_family = af;
583 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
584 hints.ai_flags = AI_PASSIVE;
585 error = getaddrinfo(NULL, "0", &hints, &res);
586 if (error) {
587 PyGAI_Err(error);
588 return -1;
589 }
590 switch (res->ai_family) {
591 case AF_INET:
592 siz = 4;
593 break;
594#ifdef INET6
595 case AF_INET6:
596 siz = 16;
597 break;
598#endif
599 default:
600 freeaddrinfo(res);
601 PyErr_SetString(PySocket_Error,
602 "unsupported address family");
603 return -1;
604 }
605 if (res->ai_next) {
606 PyErr_SetString(PySocket_Error,
607 "wildcard resolved to multiple address");
608 return -1;
609 }
610 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
611 freeaddrinfo(res);
612 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000613 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000614 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000615 struct sockaddr_in *sin;
616 if (af != PF_INET && af != PF_UNSPEC) {
617 PyErr_SetString(PySocket_Error,
618 "address family mismatched");
619 return -1;
620 }
621 sin = (struct sockaddr_in *)addr_ret;
622 memset((void *) sin, '\0', sizeof(*sin));
623 sin->sin_family = AF_INET;
624#ifdef HAVE_SOCKADDR_SA_LEN
625 sin->sin_len = sizeof(*sin);
626#endif
627 sin->sin_addr.s_addr = INADDR_BROADCAST;
628 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000629 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000630 memset(&hints, 0, sizeof(hints));
631 hints.ai_family = af;
632 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000633#if defined(__digital__) && defined(__unix__)
Martin v. Löwisb8fc9722001-10-24 17:35:46 +0000634 if (error == EAI_NONAME && af == AF_UNSPEC) {
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000635 /* On Tru64 V5.1, numeric-to-addr conversion
Martin v. Löwis861a65b2001-10-24 14:36:00 +0000636 fails if no address family is given. Assume IPv4 for now.*/
637 hints.ai_family = AF_INET;
638 error = getaddrinfo(name, NULL, &hints, &res);
639 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000640#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000641 if (error) {
642 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000643 return -1;
644 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000645 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
646 freeaddrinfo(res);
647 switch (addr_ret->sa_family) {
648 case AF_INET:
649 return 4;
650#ifdef INET6
651 case AF_INET6:
652 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000653#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000654 default:
655 PyErr_SetString(PySocket_Error, "unknown address family");
656 return -1;
657 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000658}
659
Guido van Rossum30a685f1991-06-27 15:51:29 +0000660
Guido van Rossum30a685f1991-06-27 15:51:29 +0000661/* Create a string object representing an IP address.
662 This is always a string of the form 'dd.dd.dd.dd' (with variable
663 size numbers). */
664
Guido van Rossum73624e91994-10-10 17:59:00 +0000665static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000666makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000667{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000668 char buf[NI_MAXHOST];
669 int error;
670
671 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
672 NI_NUMERICHOST);
673 if (error) {
674 PyGAI_Err(error);
675 return NULL;
676 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000677 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000678}
679
680
681/* Create an object representing the given socket address,
682 suitable for passing it back to bind(), connect() etc.
683 The family field of the sockaddr structure is inspected
684 to determine what kind of address it really is. */
685
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000686/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000687static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000688makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000689{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000690 if (addrlen == 0) {
691 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000692 Py_INCREF(Py_None);
693 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000694 }
695
Guido van Rossumbcc20741998-08-04 22:53:56 +0000696#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000697 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000698 addr->sa_family = AF_INET;
699#endif
700
Guido van Rossum30a685f1991-06-27 15:51:29 +0000701 switch (addr->sa_family) {
702
703 case AF_INET:
704 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000705 struct sockaddr_in *a;
706 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000707 PyObject *ret = NULL;
708 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000709 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000710 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
711 Py_DECREF(addrobj);
712 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000713 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000714 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000715
Guido van Rossumb6775db1994-08-01 11:34:53 +0000716#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000717 case AF_UNIX:
718 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000719 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000720 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000721 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000722#endif /* AF_UNIX */
723
724#ifdef INET6
725 case AF_INET6:
726 {
727 struct sockaddr_in6 *a;
728 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
729 PyObject *ret = NULL;
730 if (addrobj) {
731 a = (struct sockaddr_in6 *)addr;
732 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
733 a->sin6_flowinfo, a->sin6_scope_id);
734 Py_DECREF(addrobj);
735 }
736 return ret;
737 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000738#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000739
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000740#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000741 case AF_PACKET:
742 {
743 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
744 char *ifname = "";
745 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000746 /* need to look up interface name give index */
747 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000748 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000749 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000750 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000751 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000752 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000753 a->sll_pkttype, a->sll_hatype,
754 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000755 }
756#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000757
Guido van Rossum30a685f1991-06-27 15:51:29 +0000758 /* More cases here... */
759
760 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000761 /* If we don't know the address family, don't raise an
762 exception -- return it as a tuple. */
763 return Py_BuildValue("is#",
764 addr->sa_family,
765 addr->sa_data,
766 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000767
Guido van Rossum30a685f1991-06-27 15:51:29 +0000768 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000769}
770
Guido van Rossum30a685f1991-06-27 15:51:29 +0000771
772/* Parse a socket address argument according to the socket object's
773 address family. Return 1 if the address was in the proper format,
774 0 of not. The address is returned through addr_ret, its length
775 through len_ret. */
776
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000777static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000778getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000779 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000780{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000781 switch (s->sock_family) {
782
Guido van Rossumb6775db1994-08-01 11:34:53 +0000783#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000784 case AF_UNIX:
785 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000786 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000787 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000788 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000789 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000790 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000791 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000792 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000793 PyErr_SetString(PySocket_Error,
794 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000795 return 0;
796 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000797 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000798 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000799 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000800 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000801 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000802 return 1;
803 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000804#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000805
Guido van Rossum30a685f1991-06-27 15:51:29 +0000806 case AF_INET:
807 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000808 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000809 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000810 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000811 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000812 if (!PyTuple_Check(args)) {
813 PyErr_Format(PyExc_TypeError,
814 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
815 args->ob_type->tp_name);
816 return 0;
817 }
818 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000819 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000820 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000821 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000822 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000823 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000824 *addr_ret = (struct sockaddr *) addr;
825 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000826 return 1;
827 }
828
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000829#ifdef INET6
830 case AF_INET6:
831 {
832 struct sockaddr_in6* addr;
833 char *host;
834 int port, flowinfo, scope_id;
835 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
836 flowinfo = scope_id = 0;
837 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
838 &scope_id)) {
839 return 0;
840 }
841 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
842 return 0;
843 addr->sin6_family = s->sock_family;
844 addr->sin6_port = htons((short)port);
845 addr->sin6_flowinfo = flowinfo;
846 addr->sin6_scope_id = scope_id;
847 *addr_ret = (struct sockaddr *) addr;
848 *len_ret = sizeof *addr;
849 return 1;
850 }
851#endif
852
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000853#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000854 case AF_PACKET:
855 {
856 struct sockaddr_ll* addr;
857 struct ifreq ifr;
858 char *interfaceName;
859 int protoNumber;
860 int hatype = 0;
861 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000862 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000863
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000864 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
865 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000866 return 0;
867 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
868 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000869 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +0000870 PySocket_Err();
Jeremy Hylton22308652001-02-02 03:23:09 +0000871 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000872 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000873 addr = &(s->sock_addr.ll);
874 addr->sll_family = AF_PACKET;
875 addr->sll_protocol = htons((short)protoNumber);
876 addr->sll_ifindex = ifr.ifr_ifindex;
877 addr->sll_pkttype = pkttype;
878 addr->sll_hatype = hatype;
879 *addr_ret = (struct sockaddr *) addr;
880 *len_ret = sizeof *addr;
881 return 1;
882 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000883#endif
884
Guido van Rossum30a685f1991-06-27 15:51:29 +0000885 /* More cases here... */
886
887 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000888 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000889 return 0;
890
891 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000892}
893
Guido van Rossum30a685f1991-06-27 15:51:29 +0000894
Guido van Rossum48a680c2001-03-02 06:34:14 +0000895/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000896 Return 1 if the family is known, 0 otherwise. The length is returned
897 through len_ret. */
898
899static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000900getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000901{
902 switch (s->sock_family) {
903
Guido van Rossumb6775db1994-08-01 11:34:53 +0000904#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000905 case AF_UNIX:
906 {
907 *len_ret = sizeof (struct sockaddr_un);
908 return 1;
909 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000910#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000911
912 case AF_INET:
913 {
914 *len_ret = sizeof (struct sockaddr_in);
915 return 1;
916 }
917
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000918#ifdef INET6
919 case AF_INET6:
920 {
921 *len_ret = sizeof (struct sockaddr_in6);
922 return 1;
923 }
924#endif
925
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000926#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000927 case AF_PACKET:
928 {
929 *len_ret = sizeof (struct sockaddr_ll);
930 return 1;
931 }
932#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000933
Guido van Rossum710e1df1992-06-12 10:39:36 +0000934 /* More cases here... */
935
936 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000937 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000938 return 0;
939
940 }
941}
942
943
Guido van Rossum30a685f1991-06-27 15:51:29 +0000944/* s.accept() method */
945
Guido van Rossum73624e91994-10-10 17:59:00 +0000946static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000947PySocketSock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000948{
949 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000950 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000951 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000952 PyObject *sock = NULL;
953 PyObject *addr = NULL;
954 PyObject *res = NULL;
955
Guido van Rossum710e1df1992-06-12 10:39:36 +0000956 if (!getsockaddrlen(s, &addrlen))
957 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000958 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000959 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000960 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000961 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000962#ifdef MS_WINDOWS
963 if (newfd == INVALID_SOCKET)
964#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000965 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000966#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000967 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000968
Guido van Rossum30a685f1991-06-27 15:51:29 +0000969 /* Create the new object with unspecified family,
970 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000971 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000972 s->sock_family,
973 s->sock_type,
974 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000975 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000976 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000977 goto finally;
978 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000979 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000980 addrlen);
981 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000982 goto finally;
983
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000984 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000985
986 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000987 Py_XDECREF(sock);
988 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000989 return res;
990}
991
Guido van Rossum82a5c661998-07-07 20:45:43 +0000992static char accept_doc[] =
993"accept() -> (socket object, address info)\n\
994\n\
995Wait for an incoming connection. Return a new socket representing the\n\
996connection, and the address of the client. For IP sockets, the address\n\
997info is a pair (hostaddr, port).";
998
Guido van Rossum30a685f1991-06-27 15:51:29 +0000999
Guido van Rossume4485b01994-09-07 14:32:49 +00001000/* s.setblocking(1 | 0) method */
1001
Guido van Rossum73624e91994-10-10 17:59:00 +00001002static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001003PySocketSock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001004{
1005 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001006#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +00001007#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +00001008 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +00001009#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001010#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001011 block = PyInt_AsLong(arg);
1012 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001013 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001014 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +00001015#ifdef __BEOS__
1016 block = !block;
1017 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
1018 (void *)(&block), sizeof( int ) );
1019#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001020#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001021#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001022#ifdef PYOS_OS2
1023 block = !block;
1024 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
1025#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +00001026 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
1027 if (block)
1028 delay_flag &= (~O_NDELAY);
1029 else
1030 delay_flag |= O_NDELAY;
1031 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001032#endif /* !PYOS_OS2 */
1033#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001034 block = !block;
1035 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001036#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +00001037#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001038#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001039 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +00001040
Guido van Rossum73624e91994-10-10 17:59:00 +00001041 Py_INCREF(Py_None);
1042 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001043}
Guido van Rossume4485b01994-09-07 14:32:49 +00001044
Guido van Rossum82a5c661998-07-07 20:45:43 +00001045static char setblocking_doc[] =
1046"setblocking(flag)\n\
1047\n\
1048Set the socket to blocking (flag is true) or non-blocking (false).\n\
1049This uses the FIONBIO ioctl with the O_NDELAY flag.";
1050
Guido van Rossume4485b01994-09-07 14:32:49 +00001051
Guido van Rossum48a680c2001-03-02 06:34:14 +00001052#ifdef RISCOS
1053/* s.sleeptaskw(1 | 0) method */
1054
1055static PyObject *
1056PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
1057{
1058 int block;
1059 int delay_flag;
1060 if (!PyArg_GetInt(args, &block))
1061 return NULL;
1062 Py_BEGIN_ALLOW_THREADS
1063 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1064 Py_END_ALLOW_THREADS
1065
1066 Py_INCREF(Py_None);
1067 return Py_None;
1068}
1069static char sleeptaskw_doc[] =
1070"sleeptaskw(flag)\n\
1071\n\
1072Allow sleeps in taskwindows.";
1073#endif
1074
1075
Guido van Rossumaee08791992-09-08 09:05:33 +00001076/* s.setsockopt() method.
1077 With an integer third argument, sets an integer option.
1078 With a string third argument, sets an option from a buffer;
1079 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001080
Guido van Rossum73624e91994-10-10 17:59:00 +00001081static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001082PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001083{
1084 int level;
1085 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001086 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001087 char *buf;
1088 int buflen;
1089 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001090
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001091 if (PyArg_ParseTuple(args, "iii:setsockopt",
1092 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001093 buf = (char *) &flag;
1094 buflen = sizeof flag;
1095 }
1096 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001097 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001098 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1099 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001100 return NULL;
1101 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001102 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001103 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001104 return PySocket_Err();
1105 Py_INCREF(Py_None);
1106 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001107}
1108
Guido van Rossum82a5c661998-07-07 20:45:43 +00001109static char setsockopt_doc[] =
1110"setsockopt(level, option, value)\n\
1111\n\
1112Set a socket option. See the Unix manual for level and option.\n\
1113The value argument can either be an integer or a string.";
1114
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001115
Guido van Rossumaee08791992-09-08 09:05:33 +00001116/* s.getsockopt() method.
1117 With two arguments, retrieves an integer option.
1118 With a third integer argument, retrieves a string buffer of that size;
1119 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001120
Guido van Rossum73624e91994-10-10 17:59:00 +00001121static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001122PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001123{
1124 int level;
1125 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001126 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001127 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001128 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001129
Guido van Rossumbcc20741998-08-04 22:53:56 +00001130#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001131 /* We have incomplete socket support. */
1132 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001133 return NULL;
1134#else
1135
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001136 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1137 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001138 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001139
Guido van Rossumbe32c891996-06-20 16:25:29 +00001140 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001141 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001142 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001143 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001144 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001145 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001146 return PySocket_Err();
1147 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001148 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001149 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001150 PyErr_SetString(PySocket_Error,
1151 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001152 return NULL;
1153 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001154 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001155 if (buf == NULL)
1156 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001157 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001158 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001159 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001160 Py_DECREF(buf);
1161 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +00001162 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001163 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001164 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001165#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001166}
1167
Guido van Rossum82a5c661998-07-07 20:45:43 +00001168static char getsockopt_doc[] =
1169"getsockopt(level, option[, buffersize]) -> value\n\
1170\n\
1171Get a socket option. See the Unix manual for level and option.\n\
1172If a nonzero buffersize argument is given, the return value is a\n\
1173string of that length; otherwise it is an integer.";
1174
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001175
Fred Drake728819a2000-07-01 03:40:12 +00001176/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001177
Guido van Rossum73624e91994-10-10 17:59:00 +00001178static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001179PySocketSock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001180{
1181 struct sockaddr *addr;
1182 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001183 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001184
Fred Drake728819a2000-07-01 03:40:12 +00001185 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001186 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001187 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001188 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001189 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001190 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001191 return PySocket_Err();
1192 Py_INCREF(Py_None);
1193 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001194}
1195
Guido van Rossum82a5c661998-07-07 20:45:43 +00001196static char bind_doc[] =
1197"bind(address)\n\
1198\n\
1199Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001200pair (host, port); the host must refer to the local host. For raw packet\n\
1201sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001202
Guido van Rossum30a685f1991-06-27 15:51:29 +00001203
1204/* s.close() method.
1205 Set the file descriptor to -1 so operations tried subsequently
1206 will surely fail. */
1207
Guido van Rossum73624e91994-10-10 17:59:00 +00001208static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001209PySocketSock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001210{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001211 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001212
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001213 if ((fd = s->sock_fd) != -1) {
1214 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001215 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001216 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001217 Py_END_ALLOW_THREADS
1218 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001219 Py_INCREF(Py_None);
1220 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001221}
1222
Guido van Rossum82a5c661998-07-07 20:45:43 +00001223static char close_doc[] =
1224"close()\n\
1225\n\
1226Close the socket. It cannot be used after this call.";
1227
Guido van Rossum30a685f1991-06-27 15:51:29 +00001228
Fred Drake728819a2000-07-01 03:40:12 +00001229/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001230
Guido van Rossum73624e91994-10-10 17:59:00 +00001231static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001232PySocketSock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001233{
1234 struct sockaddr *addr;
1235 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001236 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001237
Fred Drake728819a2000-07-01 03:40:12 +00001238 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001239 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001240 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001241 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001242 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001243 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001244 return PySocket_Err();
1245 Py_INCREF(Py_None);
1246 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001247}
1248
Guido van Rossum82a5c661998-07-07 20:45:43 +00001249static char connect_doc[] =
1250"connect(address)\n\
1251\n\
1252Connect the socket to a remote address. For IP sockets, the address\n\
1253is a pair (host, port).";
1254
Guido van Rossum30a685f1991-06-27 15:51:29 +00001255
Fred Drake728819a2000-07-01 03:40:12 +00001256/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001257
1258static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001259PySocketSock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001260{
1261 struct sockaddr *addr;
1262 int addrlen;
1263 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001264
Fred Drake728819a2000-07-01 03:40:12 +00001265 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001266 return NULL;
1267 Py_BEGIN_ALLOW_THREADS
1268 res = connect(s->sock_fd, addr, addrlen);
1269 Py_END_ALLOW_THREADS
Tim Petersc32410a2001-10-30 01:26:49 +00001270 if (res != 0) {
1271#ifdef MS_WINDOWS
1272 res = WSAGetLastError();
1273#else
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001274 res = errno;
Tim Petersc32410a2001-10-30 01:26:49 +00001275#endif
1276 }
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001277 return PyInt_FromLong((long) res);
1278}
1279
Guido van Rossum82a5c661998-07-07 20:45:43 +00001280static char connect_ex_doc[] =
1281"connect_ex(address)\n\
1282\n\
1283This is like connect(address), but returns an error code (the errno value)\n\
1284instead of raising an exception when an error occurs.";
1285
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001286
Guido van Rossumed233a51992-06-23 09:07:03 +00001287/* s.fileno() method */
1288
Guido van Rossum73624e91994-10-10 17:59:00 +00001289static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001290PySocketSock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001291{
Fred Drakea04eaad2000-06-30 02:46:07 +00001292#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001293 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001294#else
1295 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1296#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001297}
1298
Guido van Rossum82a5c661998-07-07 20:45:43 +00001299static char fileno_doc[] =
1300"fileno() -> integer\n\
1301\n\
1302Return the integer file descriptor of the socket.";
1303
Guido van Rossumed233a51992-06-23 09:07:03 +00001304
Guido van Rossumbe32c891996-06-20 16:25:29 +00001305#ifndef NO_DUP
1306/* s.dup() method */
1307
1308static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001309PySocketSock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001310{
Fred Drakea04eaad2000-06-30 02:46:07 +00001311 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001312 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001313
Guido van Rossumbe32c891996-06-20 16:25:29 +00001314 newfd = dup(s->sock_fd);
1315 if (newfd < 0)
1316 return PySocket_Err();
1317 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001318 s->sock_family,
1319 s->sock_type,
1320 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001321 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001322 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001323 return sock;
1324}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001325
1326static char dup_doc[] =
1327"dup() -> socket object\n\
1328\n\
1329Return a new socket object connected to the same system resource.";
1330
Guido van Rossumbe32c891996-06-20 16:25:29 +00001331#endif
1332
1333
Guido van Rossumc89705d1992-11-26 08:54:07 +00001334/* s.getsockname() method */
1335
Guido van Rossum73624e91994-10-10 17:59:00 +00001336static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001337PySocketSock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001338{
1339 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001340 int res;
1341 socklen_t addrlen;
1342
Guido van Rossumc89705d1992-11-26 08:54:07 +00001343 if (!getsockaddrlen(s, &addrlen))
1344 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001345 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001346 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001347 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001348 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001349 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001350 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001351 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001352}
1353
Guido van Rossum82a5c661998-07-07 20:45:43 +00001354static char getsockname_doc[] =
1355"getsockname() -> address info\n\
1356\n\
1357Return the address of the local endpoint. For IP sockets, the address\n\
1358info is a pair (hostaddr, port).";
1359
Guido van Rossumc89705d1992-11-26 08:54:07 +00001360
Guido van Rossumb6775db1994-08-01 11:34:53 +00001361#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001362/* s.getpeername() method */
1363
Guido van Rossum73624e91994-10-10 17:59:00 +00001364static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001365PySocketSock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001366{
1367 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001368 int res;
1369 socklen_t addrlen;
1370
Guido van Rossumc89705d1992-11-26 08:54:07 +00001371 if (!getsockaddrlen(s, &addrlen))
1372 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001373 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001374 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001375 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001376 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001377 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001378 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001379 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001380}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001381
1382static char getpeername_doc[] =
1383"getpeername() -> address info\n\
1384\n\
1385Return the address of the remote endpoint. For IP sockets, the address\n\
1386info is a pair (hostaddr, port).";
1387
Guido van Rossumb6775db1994-08-01 11:34:53 +00001388#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001389
1390
Guido van Rossum30a685f1991-06-27 15:51:29 +00001391/* s.listen(n) method */
1392
Guido van Rossum73624e91994-10-10 17:59:00 +00001393static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001394PySocketSock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001395{
1396 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001397 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001398
1399 backlog = PyInt_AsLong(arg);
1400 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001401 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001402 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001403 if (backlog < 1)
1404 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001405 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001406 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001407 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001408 return PySocket_Err();
1409 Py_INCREF(Py_None);
1410 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001411}
1412
Guido van Rossum82a5c661998-07-07 20:45:43 +00001413static char listen_doc[] =
1414"listen(backlog)\n\
1415\n\
1416Enable a server to accept connections. The backlog argument must be at\n\
1417least 1; it specifies the number of unaccepted connection that the system\n\
1418will allow before refusing new connections.";
1419
1420
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001421#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001422/* s.makefile(mode) method.
1423 Create a new open file object referring to a dupped version of
1424 the socket's file descriptor. (The dup() call is necessary so
1425 that the open file and socket objects may be closed independent
1426 of each other.)
1427 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1428
Guido van Rossum73624e91994-10-10 17:59:00 +00001429static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001430PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001431{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001432 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001433 char *mode = "r";
1434 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001435#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001436 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001437#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001438 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001439#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001440 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001441 PyObject *f;
1442
Guido van Rossum43713e52000-02-29 13:59:29 +00001443 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001444 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001445#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001446 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1447 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001448#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001449 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001450#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001451 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001452 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001453 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001454 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001455 }
1456 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1457 if (f != NULL)
1458 PyFile_SetBufSize(f, bufsize);
1459 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001460}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001461
1462static char makefile_doc[] =
1463"makefile([mode[, buffersize]]) -> file object\n\
1464\n\
1465Return a regular file object corresponding to the socket.\n\
1466The mode and buffersize arguments are as for the built-in open() function.";
1467
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001468#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001469
Guido van Rossum48a680c2001-03-02 06:34:14 +00001470
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001471/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001472
Guido van Rossum73624e91994-10-10 17:59:00 +00001473static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001474PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001475{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001476 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001477 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001478 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001479 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001480 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001481 if (buf == NULL)
1482 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001483 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001484 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001485 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001486 if (n < 0) {
1487 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001488 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001489 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001490 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001491 return NULL;
1492 return buf;
1493}
1494
Guido van Rossum82a5c661998-07-07 20:45:43 +00001495static char recv_doc[] =
1496"recv(buffersize[, flags]) -> data\n\
1497\n\
1498Receive up to buffersize bytes from the socket. For the optional flags\n\
1499argument, see the Unix manual. When no data is available, block until\n\
1500at least one byte is available or until the remote end is closed. When\n\
1501the remote end is closed and all data is read, return the empty string.";
1502
Guido van Rossum30a685f1991-06-27 15:51:29 +00001503
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001504/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001505
Guido van Rossum73624e91994-10-10 17:59:00 +00001506static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001507PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001508{
1509 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001510 PyObject *buf = NULL;
1511 PyObject *addr = NULL;
1512 PyObject *ret = NULL;
1513
Guido van Rossumff3ab422000-04-24 15:16:03 +00001514 int len, n, flags = 0;
1515 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001516 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001517 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001518 if (!getsockaddrlen(s, &addrlen))
1519 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001520 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001521 if (buf == NULL)
1522 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001523 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001524 memset(addrbuf, 0, addrlen);
1525 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001526#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001527#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001528 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001529#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001530 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001531#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001532#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001533 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001534#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001535 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001536 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001537 if (n < 0) {
1538 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001539 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001540 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001541 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001542 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001543
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001544 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001545 goto finally;
1546
Guido van Rossum73624e91994-10-10 17:59:00 +00001547 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001548 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001549 Py_XDECREF(addr);
1550 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001551 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001552}
1553
Guido van Rossum82a5c661998-07-07 20:45:43 +00001554static char recvfrom_doc[] =
1555"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1556\n\
1557Like recv(buffersize, flags) but also return the sender's address info.";
1558
Guido van Rossum30a685f1991-06-27 15:51:29 +00001559
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001560/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001561
Guido van Rossum73624e91994-10-10 17:59:00 +00001562static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001563PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001564{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001565 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001566 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001567 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001568 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001569 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001570 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001571 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001572 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001573 return PySocket_Err();
1574 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001575}
1576
Guido van Rossum82a5c661998-07-07 20:45:43 +00001577static char send_doc[] =
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001578"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001579\n\
1580Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001581argument, see the Unix manual. Return the number of bytes\n\
1582sent; this may be less than len(data) if the network is busy.";
1583
1584
1585/* s.sendall(data [,flags]) method */
1586
1587static PyObject *
1588PySocketSock_sendall(PySocketSockObject *s, PyObject *args)
1589{
1590 char *buf;
1591 int len, n, flags = 0, total = 0;
1592 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1593 return NULL;
1594 Py_BEGIN_ALLOW_THREADS
1595 do {
1596 n = send(s->sock_fd, buf, len, flags);
1597 if (n < 0)
1598 break;
1599 total += n;
1600 buf += n;
1601 len -= n;
1602 } while (len > 0);
1603 Py_END_ALLOW_THREADS
1604 if (n < 0)
1605 return PySocket_Err();
1606 Py_INCREF(Py_None);
1607 return Py_None;
1608}
1609
1610static char sendall_doc[] =
1611"sendall(data[, flags])\n\
1612\n\
1613Send a data string to the socket. For the optional flags\n\
1614argument, see the Unix manual. This calls send() repeatedly\n\
1615until all data is sent. If an error occurs, it's impossible\n\
1616to tell how much data has been sent.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001617
Guido van Rossum30a685f1991-06-27 15:51:29 +00001618
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001619/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001620
Guido van Rossum73624e91994-10-10 17:59:00 +00001621static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001622PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001623{
Guido van Rossum73624e91994-10-10 17:59:00 +00001624 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001625 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001626 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001627 int addrlen, len, n, flags;
1628 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001629 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001630 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001631 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1632 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001633 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001634 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001635 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001636 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001637 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001638 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001639 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001640 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001641 return PySocket_Err();
1642 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001643}
1644
Guido van Rossum82a5c661998-07-07 20:45:43 +00001645static char sendto_doc[] =
1646"sendto(data[, flags], address)\n\
1647\n\
1648Like send(data, flags) but allows specifying the destination address.\n\
1649For IP sockets, the address is a pair (hostaddr, port).";
1650
Guido van Rossum30a685f1991-06-27 15:51:29 +00001651
1652/* s.shutdown(how) method */
1653
Guido van Rossum73624e91994-10-10 17:59:00 +00001654static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001655PySocketSock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001656{
1657 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001658 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001659
1660 how = PyInt_AsLong(arg);
1661 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001662 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001663 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001664 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001665 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001666 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001667 return PySocket_Err();
1668 Py_INCREF(Py_None);
1669 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001670}
1671
Guido van Rossum82a5c661998-07-07 20:45:43 +00001672static char shutdown_doc[] =
1673"shutdown(flag)\n\
1674\n\
1675Shut down the reading side of the socket (flag == 0), the writing side\n\
1676of the socket (flag == 1), or both ends (flag == 2).";
1677
Guido van Rossum30a685f1991-06-27 15:51:29 +00001678
1679/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001680
Guido van Rossum73624e91994-10-10 17:59:00 +00001681static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum17209fc2001-10-15 21:12:54 +00001682 {"accept", (PyCFunction)PySocketSock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001683 accept_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001684 {"bind", (PyCFunction)PySocketSock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001685 bind_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00001686 {"close", (PyCFunction)PySocketSock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001687 close_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001688 {"connect", (PyCFunction)PySocketSock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001689 connect_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001690 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001691 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001692#ifndef NO_DUP
Guido van Rossum17209fc2001-10-15 21:12:54 +00001693 {"dup", (PyCFunction)PySocketSock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001694 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001695#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001696 {"fileno", (PyCFunction)PySocketSock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001697 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001698#ifdef HAVE_GETPEERNAME
Guido van Rossum17209fc2001-10-15 21:12:54 +00001699 {"getpeername", (PyCFunction)PySocketSock_getpeername,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001700 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001701#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001702 {"getsockname", (PyCFunction)PySocketSock_getsockname,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001703 METH_NOARGS, getsockname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001704 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1705 getsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001706 {"listen", (PyCFunction)PySocketSock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001707 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001708#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001709 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1710 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001711#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001712 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1713 recv_doc},
1714 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1715 recvfrom_doc},
1716 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1717 send_doc},
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001718 {"sendall", (PyCFunction)PySocketSock_sendall, METH_VARARGS,
1719 sendall_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001720 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1721 sendto_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001722 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001723 setblocking_doc},
1724 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1725 setsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001726 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001727 shutdown_doc},
1728#ifdef RISCOS
1729 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1730 sleeptaskw_doc},
1731#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001732 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001733};
1734
Guido van Rossum30a685f1991-06-27 15:51:29 +00001735
Guido van Rossum73624e91994-10-10 17:59:00 +00001736/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001737 First close the file description. */
1738
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001739static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001740PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001741{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001742 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001743 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001744 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001745}
1746
Guido van Rossum30a685f1991-06-27 15:51:29 +00001747
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001748static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001749PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001750{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001751 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001752#if SIZEOF_SOCKET_T > SIZEOF_LONG
1753 if (s->sock_fd > LONG_MAX) {
1754 /* this can occur on Win64, and actually there is a special
1755 ugly printf formatter for decimal pointer length integer
1756 printing, only bother if necessary*/
1757 PyErr_SetString(PyExc_OverflowError,
1758 "no printf formatter to display the socket descriptor in decimal");
1759 return NULL;
1760 }
1761#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001762 sprintf(buf,
1763 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001764 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001765 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001766}
1767
1768
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001769/* Create a new, uninitialized socket object. */
1770
1771static PyObject *
1772PySocketSock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1773{
1774 PyObject *new;
1775
1776 new = type->tp_alloc(type, 0);
1777 if (new != NULL)
1778 ((PySocketSockObject *)new)->sock_fd = -1;
1779 return new;
1780}
1781
1782
1783/* Initialize a new socket object. */
1784
1785/*ARGSUSED*/
1786static int
1787PySocketSock_init(PyObject *self, PyObject *args, PyObject *kwds)
1788{
1789 PySocketSockObject *s = (PySocketSockObject *)self;
1790 SOCKET_T fd;
1791 int family = AF_INET, type = SOCK_STREAM, proto = 0;
1792 static char *keywords[] = {"family", "type", "proto", 0};
1793
1794 if (!PyArg_ParseTupleAndKeywords(args, kwds,
1795 "|iii:socket", keywords,
1796 &family, &type, &proto))
1797 return -1;
1798 Py_BEGIN_ALLOW_THREADS
1799 fd = socket(family, type, proto);
1800 Py_END_ALLOW_THREADS
1801#ifdef MS_WINDOWS
1802 if (fd == INVALID_SOCKET)
1803#else
1804 if (fd < 0)
1805#endif
1806 {
1807 PySocket_Err();
1808 return -1;
1809 }
1810 init_sockobject(s, fd, family, type, proto);
1811 /* From now on, ignore SIGPIPE and let the error checking
1812 do the work. */
1813#ifdef SIGPIPE
1814 (void) signal(SIGPIPE, SIG_IGN);
1815#endif
1816 return 0;
1817}
1818
1819
Guido van Rossumb6775db1994-08-01 11:34:53 +00001820/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001821
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001822static char socket_doc[] =
1823"socket([family[, type[, proto]]]) -> socket object\n\
1824\n\
1825Open a socket of the given type. The family argument specifies the\n\
1826address family; it defaults to AF_INET. The type argument specifies\n\
1827whether this is a stream (SOCK_STREAM, this is the default)\n\
1828or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1829specifying the default protocol.\n\
1830\n\
1831A socket represents one endpoint of a network connection.\n\
1832\n\
1833Methods:\n\
1834\n\
1835accept() -- accept a connection, returning new socket and client address\n\
1836bind() -- bind the socket to a local address\n\
1837close() -- close the socket\n\
1838connect() -- connect the socket to a remote address\n\
1839connect_ex() -- connect, return an error code instead of an exception \n\
1840dup() -- return a new socket object identical to the current one (*)\n\
1841fileno() -- return underlying file descriptor\n\
1842getpeername() -- return remote address (*)\n\
1843getsockname() -- return local address\n\
1844getsockopt() -- get socket options\n\
1845listen() -- start listening for incoming connections\n\
1846makefile() -- return a file object corresponding tot the socket (*)\n\
1847recv() -- receive data\n\
1848recvfrom() -- receive data and sender's address\n\
1849send() -- send data, may not send all of it\n\
1850sendall() -- send all data\n\
1851sendto() -- send data to a given address\n\
1852setblocking() -- set or clear the blocking I/O flag\n\
1853setsockopt() -- set socket options\n\
1854shutdown() -- shut down traffic in one or both directions\n\
1855\n\
1856(*) not available on all platforms!)";
1857
Guido van Rossum73624e91994-10-10 17:59:00 +00001858static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001859 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001860 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00001861 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001862 sizeof(PySocketSockObject), /* tp_basicsize */
1863 0, /* tp_itemsize */
1864 (destructor)PySocketSock_dealloc, /* tp_dealloc */
1865 0, /* tp_print */
1866 0, /* tp_getattr */
1867 0, /* tp_setattr */
1868 0, /* tp_compare */
1869 (reprfunc)PySocketSock_repr, /* tp_repr */
1870 0, /* tp_as_number */
1871 0, /* tp_as_sequence */
1872 0, /* tp_as_mapping */
1873 0, /* tp_hash */
1874 0, /* tp_call */
1875 0, /* tp_str */
1876 PyObject_GenericGetAttr, /* tp_getattro */
1877 0, /* tp_setattro */
1878 0, /* tp_as_buffer */
1879 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1880 socket_doc, /* tp_doc */
1881 0, /* tp_traverse */
1882 0, /* tp_clear */
1883 0, /* tp_richcompare */
1884 0, /* tp_weaklistoffset */
1885 0, /* tp_iter */
1886 0, /* tp_iternext */
1887 PySocketSock_methods, /* tp_methods */
1888 0, /* tp_members */
1889 0, /* tp_getset */
1890 0, /* tp_base */
1891 0, /* tp_dict */
1892 0, /* tp_descr_get */
1893 0, /* tp_descr_set */
1894 0, /* tp_dictoffset */
1895 PySocketSock_init, /* tp_init */
1896 PyType_GenericAlloc, /* tp_alloc */
1897 PySocketSock_new, /* tp_new */
1898 _PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001899};
1900
Guido van Rossum30a685f1991-06-27 15:51:29 +00001901
Guido van Rossum81194471991-07-27 21:42:02 +00001902/* Python interface to gethostname(). */
1903
1904/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001905static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001906PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001907{
1908 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001909 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001910 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001911 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001912 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001913 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001914 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001915 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001916 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001917 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001918 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001919}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001920
Guido van Rossum82a5c661998-07-07 20:45:43 +00001921static char gethostname_doc[] =
1922"gethostname() -> string\n\
1923\n\
1924Return the current host name.";
1925
Guido van Rossumff4949e1992-08-05 19:58:53 +00001926
Guido van Rossum30a685f1991-06-27 15:51:29 +00001927/* Python interface to gethostbyname(name). */
1928
1929/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001930static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001931PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001932{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001933 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001934 struct sockaddr_storage addrbuf;
1935
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001936 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001937 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001938 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001939 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001940 return makeipaddr((struct sockaddr *)&addrbuf,
1941 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001942}
1943
Guido van Rossum82a5c661998-07-07 20:45:43 +00001944static char gethostbyname_doc[] =
1945"gethostbyname(host) -> address\n\
1946\n\
1947Return the IP address (a string of the form '255.255.255.255') for a host.";
1948
1949
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001950/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1951
1952static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001953gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001954{
1955 char **pch;
1956 PyObject *rtn_tuple = (PyObject *)NULL;
1957 PyObject *name_list = (PyObject *)NULL;
1958 PyObject *addr_list = (PyObject *)NULL;
1959 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001960
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001961 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001962 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001963#ifndef RISCOS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001964 PyH_Err(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001965#else
1966 PyErr_SetString(PySocket_Error, "host not found");
1967#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001968 return NULL;
1969 }
1970 if (h->h_addrtype != af) {
1971#ifdef HAVE_STRERROR
1972 /* Let's get real error message to return */
1973 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001974#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001975 PyErr_SetString(PySocket_Error,
1976 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001977#endif
1978 return NULL;
1979 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001980 switch (af) {
1981 case AF_INET:
1982 if (alen < sizeof(struct sockaddr_in))
1983 return NULL;
1984 break;
1985#ifdef INET6
1986 case AF_INET6:
1987 if (alen < sizeof(struct sockaddr_in6))
1988 return NULL;
1989 break;
1990#endif
1991 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001992 if ((name_list = PyList_New(0)) == NULL)
1993 goto err;
1994 if ((addr_list = PyList_New(0)) == NULL)
1995 goto err;
1996 for (pch = h->h_aliases; *pch != NULL; pch++) {
1997 int status;
1998 tmp = PyString_FromString(*pch);
1999 if (tmp == NULL)
2000 goto err;
2001 status = PyList_Append(name_list, tmp);
2002 Py_DECREF(tmp);
2003 if (status)
2004 goto err;
2005 }
2006 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2007 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002008 switch (af) {
2009 case AF_INET:
2010 {
2011 struct sockaddr_in sin;
2012 memset(&sin, 0, sizeof(sin));
2013 sin.sin_family = af;
2014#ifdef HAVE_SOCKADDR_SA_LEN
2015 sin.sin_len = sizeof(sin);
2016#endif
2017 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2018 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
2019 if (pch == h->h_addr_list && alen >= sizeof(sin))
2020 memcpy((char *) addr, &sin, sizeof(sin));
2021 break;
2022 }
2023#ifdef INET6
2024 case AF_INET6:
2025 {
2026 struct sockaddr_in6 sin6;
2027 memset(&sin6, 0, sizeof(sin6));
2028 sin6.sin6_family = af;
2029#ifdef HAVE_SOCKADDR_SA_LEN
2030 sin6.sin6_len = sizeof(sin6);
2031#endif
2032 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2033 tmp = makeipaddr((struct sockaddr *)&sin6,
2034 sizeof(sin6));
2035 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2036 memcpy((char *) addr, &sin6, sizeof(sin6));
2037 break;
2038 }
2039#endif
2040 default: /* can't happen */
2041 PyErr_SetString(PySocket_Error,
2042 "unsupported address family");
2043 return NULL;
2044 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002045 if (tmp == NULL)
2046 goto err;
2047 status = PyList_Append(addr_list, tmp);
2048 Py_DECREF(tmp);
2049 if (status)
2050 goto err;
2051 }
2052 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
2053 err:
2054 Py_XDECREF(name_list);
2055 Py_XDECREF(addr_list);
2056 return rtn_tuple;
2057}
2058
2059
2060/* Python interface to gethostbyname_ex(name). */
2061
2062/*ARGSUSED*/
2063static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002064PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002065{
2066 char *name;
2067 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002068 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002069 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002070 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002071#ifdef HAVE_GETHOSTBYNAME_R
2072 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002073#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2074 struct hostent_data data;
2075#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002076 char buf[16384];
2077 int buf_len = (sizeof buf) - 1;
2078 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002079#endif
2080#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002081 int result;
2082#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002083#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002084
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002085 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002086 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002087 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002088 return NULL;
2089 Py_BEGIN_ALLOW_THREADS
2090#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002091#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002092 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002093#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002094 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002095#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002096 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002097 result = gethostbyname_r(name, &hp_allocated, &data);
2098 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002099#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002100#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002101#ifdef USE_GETHOSTBYNAME_LOCK
2102 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002103#endif
2104 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002105#endif /* HAVE_GETHOSTBYNAME_R */
2106 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002107 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
2108 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
2109 sa = (struct sockaddr*)&addr;
2110 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002111#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002112 PyThread_release_lock(gethostbyname_lock);
2113#endif
2114 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002115}
2116
2117static char ghbn_ex_doc[] =
2118"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2119\n\
2120Return the true host name, a list of aliases, and a list of IP addresses,\n\
2121for a host. The host argument is a string giving a host name or IP number.";
2122
2123
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002124/* Python interface to gethostbyaddr(IP). */
2125
2126/*ARGSUSED*/
2127static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002128PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002129{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002130#ifdef INET6
2131 struct sockaddr_storage addr;
2132#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002133 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002134#endif
2135 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002136 char *ip_num;
2137 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002138 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002139#ifdef HAVE_GETHOSTBYNAME_R
2140 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002141#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2142 struct hostent_data data;
2143#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002144 char buf[16384];
2145 int buf_len = (sizeof buf) - 1;
2146 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002147#endif
2148#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002149 int result;
2150#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002151#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002152 char *ap;
2153 int al;
2154 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002155
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002156 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002157 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002158 af = PF_UNSPEC;
2159 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002160 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002161 af = sa->sa_family;
2162 ap = NULL;
2163 al = 0;
2164 switch (af) {
2165 case AF_INET:
2166 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2167 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2168 break;
2169#ifdef INET6
2170 case AF_INET6:
2171 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2172 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2173 break;
2174#endif
2175 default:
2176 PyErr_SetString(PySocket_Error, "unsupported address family");
2177 return NULL;
2178 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002179 Py_BEGIN_ALLOW_THREADS
2180#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002181#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002182 result = gethostbyaddr_r(ap, al, af,
2183 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002184 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002185#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002186 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002187 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002188#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002189 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002190 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002191 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002192#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002193#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002194#ifdef USE_GETHOSTBYNAME_LOCK
2195 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002196#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002197 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002198#endif /* HAVE_GETHOSTBYNAME_R */
2199 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002200 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002201#ifdef USE_GETHOSTBYNAME_LOCK
2202 PyThread_release_lock(gethostbyname_lock);
2203#endif
2204 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002205}
2206
Guido van Rossum82a5c661998-07-07 20:45:43 +00002207static char gethostbyaddr_doc[] =
2208"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2209\n\
2210Return the true host name, a list of aliases, and a list of IP addresses,\n\
2211for a host. The host argument is a string giving a host name or IP number.";
2212
Guido van Rossum30a685f1991-06-27 15:51:29 +00002213
2214/* Python interface to getservbyname(name).
2215 This only returns the port number, since the other info is already
2216 known or not useful (like the list of aliases). */
2217
2218/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002219static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002220PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002221{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002222 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002223 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002224 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002225 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002226 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002227 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002228 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002229 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002230 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002231 return NULL;
2232 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002233 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002234}
2235
Guido van Rossum82a5c661998-07-07 20:45:43 +00002236static char getservbyname_doc[] =
2237"getservbyname(servicename, protocolname) -> integer\n\
2238\n\
2239Return a port number from a service name and protocol name.\n\
2240The protocol name should be 'tcp' or 'udp'.";
2241
Guido van Rossum30a685f1991-06-27 15:51:29 +00002242
Guido van Rossum3901d851996-12-19 16:35:04 +00002243/* Python interface to getprotobyname(name).
2244 This only returns the protocol number, since the other info is
2245 already known or not useful (like the list of aliases). */
2246
2247/*ARGSUSED*/
2248static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002249PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002250{
2251 char *name;
2252 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002253#ifdef __BEOS__
2254/* Not available in BeOS yet. - [cjh] */
2255 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2256 return NULL;
2257#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002258 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002259 return NULL;
2260 Py_BEGIN_ALLOW_THREADS
2261 sp = getprotobyname(name);
2262 Py_END_ALLOW_THREADS
2263 if (sp == NULL) {
2264 PyErr_SetString(PySocket_Error, "protocol not found");
2265 return NULL;
2266 }
2267 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002268#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002269}
2270
Guido van Rossum82a5c661998-07-07 20:45:43 +00002271static char getprotobyname_doc[] =
2272"getprotobyname(name) -> integer\n\
2273\n\
2274Return the protocol number for the named protocol. (Rarely used.)";
2275
Guido van Rossum3901d851996-12-19 16:35:04 +00002276
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002277#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002278/* Create a socket object from a numeric file description.
2279 Useful e.g. if stdin is a socket.
2280 Additional arguments as for socket(). */
2281
2282/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002283static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002284PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002285{
Guido van Rossum73624e91994-10-10 17:59:00 +00002286 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002287 SOCKET_T fd;
2288 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002289 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2290 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002291 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002292 /* Dup the fd so it and the socket can be closed independently */
2293 fd = dup(fd);
2294 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002295 return PySocket_Err();
2296 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002297 /* From now on, ignore SIGPIPE and let the error checking
2298 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002299#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002300 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002301#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002302 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002303}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002304
2305static char fromfd_doc[] =
2306"fromfd(fd, family, type[, proto]) -> socket object\n\
2307\n\
2308Create a socket object from the given file descriptor.\n\
2309The remaining arguments are the same as for socket().";
2310
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002311#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002312
Guido van Rossum82a5c661998-07-07 20:45:43 +00002313
Guido van Rossum006bf911996-06-12 04:04:55 +00002314static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002315PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002316{
2317 int x1, x2;
2318
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002319 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002320 return NULL;
2321 }
2322 x2 = (int)ntohs((short)x1);
2323 return PyInt_FromLong(x2);
2324}
2325
Guido van Rossum82a5c661998-07-07 20:45:43 +00002326static char ntohs_doc[] =
2327"ntohs(integer) -> integer\n\
2328\n\
2329Convert a 16-bit integer from network to host byte order.";
2330
2331
Guido van Rossum006bf911996-06-12 04:04:55 +00002332static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002333PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002334{
2335 int x1, x2;
2336
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002337 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002338 return NULL;
2339 }
2340 x2 = ntohl(x1);
2341 return PyInt_FromLong(x2);
2342}
2343
Guido van Rossum82a5c661998-07-07 20:45:43 +00002344static char ntohl_doc[] =
2345"ntohl(integer) -> integer\n\
2346\n\
2347Convert a 32-bit integer from network to host byte order.";
2348
2349
Guido van Rossum006bf911996-06-12 04:04:55 +00002350static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002351PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002352{
2353 int x1, x2;
2354
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002355 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002356 return NULL;
2357 }
2358 x2 = (int)htons((short)x1);
2359 return PyInt_FromLong(x2);
2360}
2361
Guido van Rossum82a5c661998-07-07 20:45:43 +00002362static char htons_doc[] =
2363"htons(integer) -> integer\n\
2364\n\
2365Convert a 16-bit integer from host to network byte order.";
2366
2367
Guido van Rossum006bf911996-06-12 04:04:55 +00002368static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002369PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002370{
2371 int x1, x2;
2372
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002373 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002374 return NULL;
2375 }
2376 x2 = htonl(x1);
2377 return PyInt_FromLong(x2);
2378}
2379
Guido van Rossum82a5c661998-07-07 20:45:43 +00002380static char htonl_doc[] =
2381"htonl(integer) -> integer\n\
2382\n\
2383Convert a 32-bit integer from host to network byte order.";
2384
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002385/*
2386 * socket.inet_aton() and socket.inet_ntoa() functions
2387 *
2388 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2389 *
2390 */
2391
Guido van Rossum48a680c2001-03-02 06:34:14 +00002392static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002393"inet_aton(string) -> packed 32-bit IP representation\n\
2394\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002395Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002396binary format used in low-level network functions.";
2397
2398static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002399PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002400{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002401#ifndef INADDR_NONE
2402#define INADDR_NONE (-1)
2403#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002404
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002405 /* Have to use inet_addr() instead */
2406 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002407 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002408
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002409 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002410 return NULL;
2411 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002412#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002413 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002414#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002415 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002416#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002417
2418 if (packed_addr == INADDR_NONE) { /* invalid address */
2419 PyErr_SetString(PySocket_Error,
2420 "illegal IP address string passed to inet_aton");
2421 return NULL;
2422 }
2423
2424 return PyString_FromStringAndSize((char *) &packed_addr,
2425 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002426}
2427
Guido van Rossum48a680c2001-03-02 06:34:14 +00002428static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002429"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002430\n\
2431Convert an IP address from 32-bit packed binary format to string format";
2432
2433static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002434PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002435{
2436 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002437 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002438 struct in_addr packed_addr;
2439
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002440 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002441 return NULL;
2442 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002443
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002444 if (addr_len != sizeof(packed_addr)) {
2445 PyErr_SetString(PySocket_Error,
2446 "packed IP wrong length for inet_ntoa");
2447 return NULL;
2448 }
2449
2450 memcpy(&packed_addr, packed_str, addr_len);
2451
2452 return PyString_FromString(inet_ntoa(packed_addr));
2453}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002454
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002455/* Python interface to getaddrinfo(host, port). */
2456
2457/*ARGSUSED*/
2458static PyObject *
2459PySocket_getaddrinfo(PyObject *self, PyObject *args)
2460{
2461 struct addrinfo hints, *res0, *res;
2462 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002463 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002464 char *hptr, *pptr;
2465 int family, socktype, protocol, flags;
2466 int error;
2467 PyObject *all = (PyObject *)NULL;
2468 PyObject *single = (PyObject *)NULL;
2469
2470 family = socktype = protocol = flags = 0;
2471 family = PF_UNSPEC;
2472 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2473 &hptr, &pobj, &family, &socktype,
2474 &protocol, &flags)) {
2475 return NULL;
2476 }
2477 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002478 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002479 pptr = pbuf;
2480 } else if (PyString_Check(pobj)) {
2481 pptr = PyString_AsString(pobj);
2482 } else if (pobj == Py_None) {
2483 pptr = (char *)NULL;
2484 } else {
2485 PyErr_SetString(PySocket_Error, "Int or String expected");
2486 return NULL;
2487 }
2488 memset(&hints, 0, sizeof(hints));
2489 hints.ai_family = family;
2490 hints.ai_socktype = socktype;
2491 hints.ai_protocol = protocol;
2492 hints.ai_flags = flags;
2493 error = getaddrinfo(hptr, pptr, &hints, &res0);
2494 if (error) {
2495 PyGAI_Err(error);
2496 return NULL;
2497 }
2498
2499 if ((all = PyList_New(0)) == NULL)
2500 goto err;
2501 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002502 PyObject *addr =
2503 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2504 if (addr == NULL)
2505 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002506 single = Py_BuildValue("iiisO", res->ai_family,
2507 res->ai_socktype, res->ai_protocol,
2508 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002509 addr);
2510 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002511 if (single == NULL)
2512 goto err;
2513
2514 if (PyList_Append(all, single))
2515 goto err;
2516 Py_XDECREF(single);
2517 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002518 return all;
2519 err:
2520 Py_XDECREF(single);
2521 Py_XDECREF(all);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002522 return (PyObject *)NULL;
2523}
2524
2525static char getaddrinfo_doc[] =
2526"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2527 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2528\n\
2529Resolve host and port into addrinfo struct.";
2530
2531/* Python interface to getnameinfo(sa, flags). */
2532
2533/*ARGSUSED*/
2534static PyObject *
2535PySocket_getnameinfo(PyObject *self, PyObject *args)
2536{
2537 PyObject *sa = (PyObject *)NULL;
2538 int flags;
2539 char *hostp;
2540 int n, port, flowinfo, scope_id;
2541 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2542 struct addrinfo hints, *res = NULL;
2543 int error;
2544 PyObject *ret = (PyObject *)NULL;
2545
2546 flags = flowinfo = scope_id = 0;
2547 if (PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags) == 0)
2548 return NULL;
2549 n = PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, scope_id);
2550 if (n == 0)
2551 goto fail;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002552 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002553 memset(&hints, 0, sizeof(hints));
2554 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002555 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002556 error = getaddrinfo(hostp, pbuf, &hints, &res);
2557 if (error) {
2558 PyGAI_Err(error);
2559 goto fail;
2560 }
2561 if (res->ai_next) {
2562 PyErr_SetString(PySocket_Error,
2563 "sockaddr resolved to multiple addresses");
2564 goto fail;
2565 }
2566 switch (res->ai_family) {
2567 case AF_INET:
2568 {
2569 char *t1;
2570 int t2;
2571 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2572 PyErr_SetString(PySocket_Error,
2573 "IPv4 sockaddr must be 2 tuple");
2574 goto fail;
2575 }
2576 break;
2577 }
2578#ifdef INET6
2579 case AF_INET6:
2580 {
2581 struct sockaddr_in6 *sin6;
2582 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2583 sin6->sin6_flowinfo = flowinfo;
2584 sin6->sin6_scope_id = scope_id;
2585 break;
2586 }
2587#endif
2588 }
2589 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2590 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2591 if (error) {
2592 PyGAI_Err(error);
2593 goto fail;
2594 }
2595 ret = Py_BuildValue("ss", hbuf, pbuf);
2596
2597fail:
2598 if (res)
2599 freeaddrinfo(res);
2600 Py_XDECREF(sa);
2601 return ret;
2602}
2603
2604static char getnameinfo_doc[] =
2605"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2606\n\
2607Get host and port for a sockaddr.";
2608
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002609/* XXX It might be helpful to augment the error message generated
2610 below with the name of the SSL function that generated the error.
2611 I expect it's obvious most of the time.
2612*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002613
2614#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002615static PyObject *
2616PySSL_SetError(SSL *ssl, int ret)
2617{
2618 PyObject *v, *n, *s;
2619 char *errstr;
2620 int err;
2621
2622 assert(ret <= 0);
2623
2624 err = SSL_get_error(ssl, ret);
2625 n = PyInt_FromLong(err);
2626 if (n == NULL)
2627 return NULL;
2628 v = PyTuple_New(2);
2629 if (v == NULL) {
2630 Py_DECREF(n);
2631 return NULL;
2632 }
2633
2634 switch (SSL_get_error(ssl, ret)) {
2635 case SSL_ERROR_ZERO_RETURN:
2636 errstr = "TLS/SSL connection has been closed";
2637 break;
2638 case SSL_ERROR_WANT_READ:
2639 errstr = "The operation did not complete (read)";
2640 break;
2641 case SSL_ERROR_WANT_WRITE:
2642 errstr = "The operation did not complete (write)";
2643 break;
2644 case SSL_ERROR_WANT_X509_LOOKUP:
2645 errstr = "The operation did not complete (X509 lookup)";
2646 break;
2647 case SSL_ERROR_SYSCALL:
2648 case SSL_ERROR_SSL:
2649 {
2650 unsigned long e = ERR_get_error();
2651 if (e == 0) {
2652 /* an EOF was observed that violates the protocol */
2653 errstr = "EOF occurred in violation of protocol";
2654 } else if (e == -1) {
2655 /* the underlying BIO reported an I/O error */
2656 Py_DECREF(v);
2657 Py_DECREF(n);
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +00002658 return PySocket_Err();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002659 } else {
2660 /* XXX Protected by global interpreter lock */
2661 errstr = ERR_error_string(e, NULL);
2662 }
2663 break;
2664 }
2665 default:
2666 errstr = "Invalid error code";
2667 }
2668 s = PyString_FromString(errstr);
2669 if (s == NULL) {
2670 Py_DECREF(v);
2671 Py_DECREF(n);
2672 }
2673 PyTuple_SET_ITEM(v, 0, n);
2674 PyTuple_SET_ITEM(v, 1, s);
2675 PyErr_SetObject(PySSLErrorObject, v);
2676 return NULL;
2677}
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002678
2679/* This is a C function to be called for new object initialization */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002680static PySSLObject *
2681newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002682{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002683 PySSLObject *self;
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002684 char *errstr = NULL;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002685 int ret;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002686
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002687 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002688 if (self == NULL){
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002689 errstr = "newPySSLObject error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002690 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002691 }
Jeremy Hyltonba699362001-10-11 17:23:34 +00002692 memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
2693 memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002694 self->server_cert = NULL;
2695 self->ssl = NULL;
2696 self->ctx = NULL;
2697 self->Socket = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002698
Jeremy Hylton22738b92001-10-10 22:37:48 +00002699 if ((key_file && !cert_file) || (!key_file && cert_file)) {
2700 errstr = "Both the key & certificate files must be specified";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002701 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002702 }
2703
Jeremy Hylton22738b92001-10-10 22:37:48 +00002704 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2705 if (self->ctx == NULL) {
2706 errstr = "SSL_CTX_new error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002707 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002708 }
2709
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002710 if (key_file) {
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002711 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002712 SSL_FILETYPE_PEM) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002713 errstr = "SSL_CTX_use_PrivateKey_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002714 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002715 }
2716
2717 if (SSL_CTX_use_certificate_chain_file(self->ctx,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002718 cert_file) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002719 errstr = "SSL_CTX_use_certificate_chain_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002720 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002721 }
2722 }
2723
2724 SSL_CTX_set_verify(self->ctx,
2725 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2726 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2727 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2728 SSL_set_connect_state(self->ssl);
2729
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002730 /* Actually negotiate SSL connection */
2731 /* XXX If SSL_connect() returns 0, it's also a failure. */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002732 ret = SSL_connect(self->ssl);
2733 if (ret <= 0) {
2734 PySSL_SetError(self->ssl, ret);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002735 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002736 }
2737 self->ssl->debug = 1;
2738
2739 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2740 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002741 self->server, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002742 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002743 self->issuer, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002744 }
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002745 self->Socket = Sock;
2746 Py_INCREF(self->Socket);
2747 return self;
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002748 fail:
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002749 if (errstr)
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002750 PyErr_SetString(PySSLErrorObject, errstr);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002751 Py_DECREF(self);
2752 return NULL;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002753}
2754
2755/* This is the Python function called for new object initialization */
2756static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002757PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002758{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002759 PySSLObject *rv;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002760 PySocketSockObject *Sock;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002761 char *key_file = NULL;
2762 char *cert_file = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002763
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002764 if (!PyArg_ParseTuple(args, "O!|zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002765 &PySocketSock_Type, (PyObject*)&Sock,
Jeremy Hyltonab006452001-10-10 03:33:24 +00002766 &key_file, &cert_file))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002767 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002768
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002769 rv = newPySSLObject(Sock, key_file, cert_file);
Jeremy Hyltonab006452001-10-10 03:33:24 +00002770 if (rv == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002771 return NULL;
2772 return (PyObject *)rv;
2773}
2774
2775static char ssl_doc[] =
Jeremy Hyltonba699362001-10-11 17:23:34 +00002776"ssl(socket, [keyfile, certfile]) -> sslobject";
2777
2778/* SSL object methods */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002779
2780static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002781PySSL_server(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002782{
2783 return PyString_FromString(self->server);
2784}
2785
2786static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002787PySSL_issuer(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002788{
2789 return PyString_FromString(self->issuer);
2790}
2791
2792
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002793static void PySSL_dealloc(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002794{
2795 if (self->server_cert) /* Possible not to have one? */
2796 X509_free (self->server_cert);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002797 if (self->ssl)
2798 SSL_free(self->ssl);
2799 if (self->ctx)
2800 SSL_CTX_free(self->ctx);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002801 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002802 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002803}
2804
Jeremy Hyltonba699362001-10-11 17:23:34 +00002805static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
2806{
2807 char *data;
2808 int len;
2809
2810 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
2811 return NULL;
2812
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002813 Py_BEGIN_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002814 len = SSL_write(self->ssl, data, len);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002815 Py_END_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002816 if (len > 0)
2817 return PyInt_FromLong(len);
2818 else
2819 return PySSL_SetError(self->ssl, len);
2820}
2821
2822static char PySSL_SSLwrite_doc[] =
2823"write(s) -> len\n\
2824\n\
2825Writes the string s into the SSL object. Returns the number\n\
2826of bytes written.";
2827
2828static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
2829{
2830 PyObject *buf;
2831 int count = 0;
2832 int len = 1024;
2833
2834 if (!PyArg_ParseTuple(args, "|i:read", &len))
2835 return NULL;
2836
2837 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2838 return NULL;
2839
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002840 Py_BEGIN_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002841 count = SSL_read(self->ssl, PyString_AsString(buf), len);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002842 Py_END_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002843 if (count <= 0) {
2844 Py_DECREF(buf);
2845 return PySSL_SetError(self->ssl, count);
2846 }
2847 if (count != len && _PyString_Resize(&buf, count) < 0)
2848 return NULL;
2849 return buf;
2850}
2851
2852static char PySSL_SSLread_doc[] =
2853"read([len]) -> string\n\
2854\n\
2855Read up to len bytes from the SSL socket.";
2856
2857static PyMethodDef PySSLMethods[] = {
2858 {"write", (PyCFunction)PySSL_SSLwrite, 1,
2859 PySSL_SSLwrite_doc},
2860 {"read", (PyCFunction)PySSL_SSLread, 1,
2861 PySSL_SSLread_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00002862 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
2863 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Jeremy Hyltonba699362001-10-11 17:23:34 +00002864 {NULL, NULL}
2865};
2866
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002867static PyObject *PySSL_getattr(PySSLObject *self, char *name)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002868{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002869 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002870}
2871
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002872staticforward PyTypeObject PySSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002873 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002874 0, /*ob_size*/
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002875 "_socket.SSL", /*tp_name*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002876 sizeof(PySSLObject), /*tp_basicsize*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002877 0, /*tp_itemsize*/
2878 /* methods */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002879 (destructor)PySSL_dealloc, /*tp_dealloc*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002880 0, /*tp_print*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002881 (getattrfunc)PySSL_getattr, /*tp_getattr*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002882 0, /*tp_setattr*/
2883 0, /*tp_compare*/
2884 0, /*tp_repr*/
2885 0, /*tp_as_number*/
2886 0, /*tp_as_sequence*/
2887 0, /*tp_as_mapping*/
2888 0, /*tp_hash*/
2889};
2890
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002891/* helper routines for seeding the SSL PRNG */
2892static PyObject *
2893PySSL_RAND_add(PyObject *self, PyObject *args)
2894{
2895 char *buf;
2896 int len;
2897 double entropy;
2898
2899 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
2900 return NULL;
2901 RAND_add(buf, len, entropy);
2902 Py_INCREF(Py_None);
2903 return Py_None;
2904}
2905
2906static char PySSL_RAND_add_doc[] =
2907"RAND_add(string, entropy)\n\
2908\n\
2909Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
2910bound on the entropy contained in string.";
2911
2912static PyObject *
2913PySSL_RAND_status(PyObject *self)
2914{
2915 return PyInt_FromLong(RAND_status());
2916}
2917
2918static char PySSL_RAND_status_doc[] =
2919"RAND_status() -> 0 or 1\n\
2920\n\
2921Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
2922It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
2923using the ssl() function.";
2924
2925static PyObject *
2926PySSL_RAND_egd(PyObject *self, PyObject *arg)
2927{
2928 int bytes;
2929
2930 if (!PyString_Check(arg))
2931 return PyErr_Format(PyExc_TypeError,
2932 "RAND_egd() expected string, found %s",
2933 arg->ob_type->tp_name);
2934 bytes = RAND_egd(PyString_AS_STRING(arg));
2935 if (bytes == -1) {
2936 PyErr_SetString(PySSLErrorObject,
2937 "EGD connection failed or EGD did not return "
2938 "enough data to seed the PRNG");
2939 return NULL;
2940 }
2941 return PyInt_FromLong(bytes);
2942}
2943
2944static char PySSL_RAND_egd_doc[] =
Guido van Rossumcad8fa12001-10-19 12:40:40 +00002945"RAND_egd(path) -> bytes\n\
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002946\n\
2947Queries the entropy gather daemon (EGD) on socket path. Returns number\n\
2948of bytes read. Raises socket.sslerror if connection to EGD fails or\n\
2949if it does provide enough data to seed PRNG.";
2950
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002951#endif /* USE_SSL */
2952
2953
Guido van Rossum30a685f1991-06-27 15:51:29 +00002954/* List of functions exported by this module. */
2955
Guido van Rossum73624e91994-10-10 17:59:00 +00002956static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002957 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002958 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002959 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002960 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002961 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002962 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002963 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002964 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002965 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002966 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002967 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002968 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002969#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002970 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002971 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002972#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002973 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002974 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002975 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002976 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002977 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002978 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002979 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002980 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002981 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002982 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002983 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002984 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002985 {"getaddrinfo", PySocket_getaddrinfo,
2986 METH_VARARGS, getaddrinfo_doc},
2987 {"getnameinfo", PySocket_getnameinfo,
2988 METH_VARARGS, getnameinfo_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002989#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002990 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002991 METH_VARARGS, ssl_doc},
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002992 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
2993 PySSL_RAND_add_doc},
2994 {"RAND_egd", PySSL_RAND_egd, METH_O,
2995 PySSL_RAND_egd_doc},
2996 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
2997 PySSL_RAND_status_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002998#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002999 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003000};
3001
Guido van Rossum30a685f1991-06-27 15:51:29 +00003002
3003/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00003004 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003005 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00003006 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003007static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00003008insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003009{
Guido van Rossum73624e91994-10-10 17:59:00 +00003010 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00003011 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003012 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00003013
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003014 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003015}
3016
Guido van Rossum30a685f1991-06-27 15:51:29 +00003017
Guido van Rossum8d665e61996-06-26 18:22:49 +00003018#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00003019
3020/* Additional initialization and cleanup for NT/Windows */
3021
3022static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003023NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003024{
3025 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003026}
3027
3028static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003029NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003030{
3031 WSADATA WSAData;
3032 int ret;
3033 char buf[100];
3034 ret = WSAStartup(0x0101, &WSAData);
3035 switch (ret) {
3036 case 0: /* no error */
3037 atexit(NTcleanup);
3038 return 1;
3039 case WSASYSNOTREADY:
3040 PyErr_SetString(PyExc_ImportError,
3041 "WSAStartup failed: network not ready");
3042 break;
3043 case WSAVERNOTSUPPORTED:
3044 case WSAEINVAL:
3045 PyErr_SetString(PyExc_ImportError,
3046 "WSAStartup failed: requested version not supported");
3047 break;
3048 default:
3049 sprintf(buf, "WSAStartup failed: error code %d", ret);
3050 PyErr_SetString(PyExc_ImportError, buf);
3051 break;
3052 }
3053 return 0;
3054}
3055
Guido van Rossum8d665e61996-06-26 18:22:49 +00003056#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003057
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003058#if defined(PYOS_OS2)
3059
3060/* Additional initialization and cleanup for OS/2 */
3061
3062static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003063OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003064{
3065 /* No cleanup is necessary for OS/2 Sockets */
3066}
3067
3068static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003069OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003070{
3071 char reason[64];
3072 int rc = sock_init();
3073
3074 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00003075 atexit(OS2cleanup);
3076 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003077 }
3078
3079 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
3080 PyErr_SetString(PyExc_ImportError, reason);
3081
Guido van Rossum32c575d1997-12-02 20:37:32 +00003082 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003083}
3084
3085#endif /* PYOS_OS2 */
3086
Guido van Rossum30a685f1991-06-27 15:51:29 +00003087/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003088 * This is called when the first 'import socket' is done,
3089 * via a table in config.c, if config.c is compiled with USE_SOCKET
3090 * defined.
3091 *
3092 * For MS_WINDOWS (which means any Windows variant), this module
3093 * is actually called "_socket", and there's a wrapper "socket.py"
3094 * which implements some missing functionality (such as makefile(),
3095 * dup() and fromfd()). The import of "_socket" may fail with an
3096 * ImportError exception if initialization of WINSOCK fails. When
3097 * WINSOCK is initialized succesfully, a call to WSACleanup() is
3098 * scheduled to be made at exit time.
3099 *
3100 * For OS/2, this module is also called "_socket" and uses a wrapper
3101 * "socket.py" which implements that functionality that is missing
3102 * when PC operating systems don't put socket descriptors in the
3103 * operating system's filesystem layer.
3104 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003105
Guido van Rossum82a5c661998-07-07 20:45:43 +00003106static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00003107"Implementation module for socket operations. See the socket module\n\
3108for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00003109
Guido van Rossum3886bb61998-12-04 18:50:17 +00003110DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003111init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003112{
Guido van Rossum73624e91994-10-10 17:59:00 +00003113 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003114#ifdef RISCOS
3115 _kernel_swi_regs r;
3116 r.r[0]=0;
3117 _kernel_swi(0x43380, &r, &r);
3118 taskwindow = r.r[0];
3119#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00003120#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00003121 if (!NTinit())
3122 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00003123#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00003124#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003125 if (!OS2init())
3126 return;
Fred Drakea136d492000-08-16 14:18:30 +00003127#endif /* __TOS_OS2__ */
3128#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00003129#endif /* RISCOS */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003130 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossuma120ffc2001-01-22 15:29:14 +00003131#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003132 PySSL_Type.ob_type = &PyType_Type;
Guido van Rossuma120ffc2001-01-22 15:29:14 +00003133#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00003134 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00003135 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003136 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
3137 if (PySocket_Error == NULL)
3138 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003139 PyDict_SetItemString(d, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003140 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
3141 if (PyH_Error == NULL)
3142 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003143 PyDict_SetItemString(d, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003144 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
3145 NULL);
3146 if (PyGAI_Error == NULL)
3147 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003148 PyDict_SetItemString(d, "gaierror", PyGAI_Error);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003149#ifdef USE_SSL
3150 SSL_load_error_strings();
3151 SSLeay_add_ssl_algorithms();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003152 PySSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
3153 if (PySSLErrorObject == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003154 return;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003155 PyDict_SetItemString(d, "sslerror", PySSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003156 if (PyDict_SetItemString(d, "SSLType",
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003157 (PyObject *)&PySSL_Type) != 0)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003158 return;
Jeremy Hylton57ca8732001-10-11 00:00:17 +00003159 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
3160 SSL_ERROR_ZERO_RETURN);
3161 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
3162 SSL_ERROR_WANT_READ);
3163 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
3164 SSL_ERROR_WANT_WRITE);
3165 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
3166 SSL_ERROR_WANT_X509_LOOKUP);
3167 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
3168 SSL_ERROR_SYSCALL);
3169 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
3170 SSL_ERROR_SSL);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003171#endif /* USE_SSL */
Guido van Rossum91ba64d1997-06-02 22:18:09 +00003172 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00003173 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003174 return;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003175 if (PyDict_SetItemString(d, "socket",
3176 (PyObject *)&PySocketSock_Type) != 0)
3177 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003178
3179 /* Address families (we only support AF_INET and AF_UNIX) */
3180#ifdef AF_UNSPEC
3181 insint(d, "AF_UNSPEC", AF_UNSPEC);
3182#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003183 insint(d, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003184#ifdef AF_INET6
3185 insint(d, "AF_INET6", AF_INET6);
3186#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003187#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003188 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003189#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003190#ifdef AF_AX25
3191 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
3192#endif
3193#ifdef AF_IPX
3194 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
3195#endif
3196#ifdef AF_APPLETALK
3197 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
3198#endif
3199#ifdef AF_NETROM
3200 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
3201#endif
3202#ifdef AF_BRIDGE
3203 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
3204#endif
3205#ifdef AF_AAL5
3206 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
3207#endif
3208#ifdef AF_X25
3209 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
3210#endif
3211#ifdef AF_INET6
3212 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
3213#endif
3214#ifdef AF_ROSE
3215 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
3216#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003217#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00003218 insint(d, "AF_PACKET", AF_PACKET);
3219 insint(d, "PF_PACKET", PF_PACKET);
3220 insint(d, "PACKET_HOST", PACKET_HOST);
3221 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
3222 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
3223 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3224 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
3225 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3226 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003227#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003228
3229 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003230 insint(d, "SOCK_STREAM", SOCK_STREAM);
3231 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003232#ifndef __BEOS__
3233/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003234 insint(d, "SOCK_RAW", SOCK_RAW);
3235 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3236 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003237#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003238
3239#ifdef SO_DEBUG
3240 insint(d, "SO_DEBUG", SO_DEBUG);
3241#endif
3242#ifdef SO_ACCEPTCONN
3243 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
3244#endif
3245#ifdef SO_REUSEADDR
3246 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
3247#endif
3248#ifdef SO_KEEPALIVE
3249 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
3250#endif
3251#ifdef SO_DONTROUTE
3252 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
3253#endif
3254#ifdef SO_BROADCAST
3255 insint(d, "SO_BROADCAST", SO_BROADCAST);
3256#endif
3257#ifdef SO_USELOOPBACK
3258 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
3259#endif
3260#ifdef SO_LINGER
3261 insint(d, "SO_LINGER", SO_LINGER);
3262#endif
3263#ifdef SO_OOBINLINE
3264 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
3265#endif
3266#ifdef SO_REUSEPORT
3267 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
3268#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003269#ifdef SO_SNDBUF
3270 insint(d, "SO_SNDBUF", SO_SNDBUF);
3271#endif
3272#ifdef SO_RCVBUF
3273 insint(d, "SO_RCVBUF", SO_RCVBUF);
3274#endif
3275#ifdef SO_SNDLOWAT
3276 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
3277#endif
3278#ifdef SO_RCVLOWAT
3279 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
3280#endif
3281#ifdef SO_SNDTIMEO
3282 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
3283#endif
3284#ifdef SO_RCVTIMEO
3285 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
3286#endif
3287#ifdef SO_ERROR
3288 insint(d, "SO_ERROR", SO_ERROR);
3289#endif
3290#ifdef SO_TYPE
3291 insint(d, "SO_TYPE", SO_TYPE);
3292#endif
3293
3294 /* Maximum number of connections for "listen" */
3295#ifdef SOMAXCONN
3296 insint(d, "SOMAXCONN", SOMAXCONN);
3297#else
3298 insint(d, "SOMAXCONN", 5); /* Common value */
3299#endif
3300
3301 /* Flags for send, recv */
3302#ifdef MSG_OOB
3303 insint(d, "MSG_OOB", MSG_OOB);
3304#endif
3305#ifdef MSG_PEEK
3306 insint(d, "MSG_PEEK", MSG_PEEK);
3307#endif
3308#ifdef MSG_DONTROUTE
3309 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
3310#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003311#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00003312 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003313#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003314#ifdef MSG_EOR
3315 insint(d, "MSG_EOR", MSG_EOR);
3316#endif
3317#ifdef MSG_TRUNC
3318 insint(d, "MSG_TRUNC", MSG_TRUNC);
3319#endif
3320#ifdef MSG_CTRUNC
3321 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
3322#endif
3323#ifdef MSG_WAITALL
3324 insint(d, "MSG_WAITALL", MSG_WAITALL);
3325#endif
3326#ifdef MSG_BTAG
3327 insint(d, "MSG_BTAG", MSG_BTAG);
3328#endif
3329#ifdef MSG_ETAG
3330 insint(d, "MSG_ETAG", MSG_ETAG);
3331#endif
3332
3333 /* Protocol level and numbers, usable for [gs]etsockopt */
3334#ifdef SOL_SOCKET
3335 insint(d, "SOL_SOCKET", SOL_SOCKET);
3336#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003337#ifdef SOL_IP
3338 insint(d, "SOL_IP", SOL_IP);
3339#else
3340 insint(d, "SOL_IP", 0);
3341#endif
3342#ifdef SOL_IPX
3343 insint(d, "SOL_IPX", SOL_IPX);
3344#endif
3345#ifdef SOL_AX25
3346 insint(d, "SOL_AX25", SOL_AX25);
3347#endif
3348#ifdef SOL_ATALK
3349 insint(d, "SOL_ATALK", SOL_ATALK);
3350#endif
3351#ifdef SOL_NETROM
3352 insint(d, "SOL_NETROM", SOL_NETROM);
3353#endif
3354#ifdef SOL_ROSE
3355 insint(d, "SOL_ROSE", SOL_ROSE);
3356#endif
3357#ifdef SOL_TCP
3358 insint(d, "SOL_TCP", SOL_TCP);
3359#else
3360 insint(d, "SOL_TCP", 6);
3361#endif
3362#ifdef SOL_UDP
3363 insint(d, "SOL_UDP", SOL_UDP);
3364#else
3365 insint(d, "SOL_UDP", 17);
3366#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003367#ifdef IPPROTO_IP
3368 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003369#else
3370 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003371#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003372#ifdef IPPROTO_HOPOPTS
3373 insint(d, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
3374#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003375#ifdef IPPROTO_ICMP
3376 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003377#else
3378 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003379#endif
3380#ifdef IPPROTO_IGMP
3381 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
3382#endif
3383#ifdef IPPROTO_GGP
3384 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
3385#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003386#ifdef IPPROTO_IPV4
3387 insint(d, "IPPROTO_IPV4", IPPROTO_IPV4);
3388#endif
3389#ifdef IPPROTO_IPIP
3390 insint(d, "IPPROTO_IPIP", IPPROTO_IPIP);
3391#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003392#ifdef IPPROTO_TCP
3393 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003394#else
3395 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003396#endif
3397#ifdef IPPROTO_EGP
3398 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
3399#endif
3400#ifdef IPPROTO_PUP
3401 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
3402#endif
3403#ifdef IPPROTO_UDP
3404 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003405#else
3406 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003407#endif
3408#ifdef IPPROTO_IDP
3409 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
3410#endif
3411#ifdef IPPROTO_HELLO
3412 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
3413#endif
3414#ifdef IPPROTO_ND
3415 insint(d, "IPPROTO_ND", IPPROTO_ND);
3416#endif
3417#ifdef IPPROTO_TP
3418 insint(d, "IPPROTO_TP", IPPROTO_TP);
3419#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003420#ifdef IPPROTO_IPV6
3421 insint(d, "IPPROTO_IPV6", IPPROTO_IPV6);
3422#endif
3423#ifdef IPPROTO_ROUTING
3424 insint(d, "IPPROTO_ROUTING", IPPROTO_ROUTING);
3425#endif
3426#ifdef IPPROTO_FRAGMENT
3427 insint(d, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
3428#endif
3429#ifdef IPPROTO_RSVP
3430 insint(d, "IPPROTO_RSVP", IPPROTO_RSVP);
3431#endif
3432#ifdef IPPROTO_GRE
3433 insint(d, "IPPROTO_GRE", IPPROTO_GRE);
3434#endif
3435#ifdef IPPROTO_ESP
3436 insint(d, "IPPROTO_ESP", IPPROTO_ESP);
3437#endif
3438#ifdef IPPROTO_AH
3439 insint(d, "IPPROTO_AH", IPPROTO_AH);
3440#endif
3441#ifdef IPPROTO_MOBILE
3442 insint(d, "IPPROTO_MOBILE", IPPROTO_MOBILE);
3443#endif
3444#ifdef IPPROTO_ICMPV6
3445 insint(d, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
3446#endif
3447#ifdef IPPROTO_NONE
3448 insint(d, "IPPROTO_NONE", IPPROTO_NONE);
3449#endif
3450#ifdef IPPROTO_DSTOPTS
3451 insint(d, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
3452#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003453#ifdef IPPROTO_XTP
3454 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
3455#endif
3456#ifdef IPPROTO_EON
3457 insint(d, "IPPROTO_EON", IPPROTO_EON);
3458#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003459#ifdef IPPROTO_PIM
3460 insint(d, "IPPROTO_PIM", IPPROTO_PIM);
3461#endif
3462#ifdef IPPROTO_IPCOMP
3463 insint(d, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
3464#endif
3465#ifdef IPPROTO_VRRP
3466 insint(d, "IPPROTO_VRRP", IPPROTO_VRRP);
3467#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003468#ifdef IPPROTO_BIP
3469 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
3470#endif
3471/**/
3472#ifdef IPPROTO_RAW
3473 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003474#else
3475 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003476#endif
3477#ifdef IPPROTO_MAX
3478 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
3479#endif
3480
3481 /* Some port configuration */
3482#ifdef IPPORT_RESERVED
3483 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
3484#else
3485 insint(d, "IPPORT_RESERVED", 1024);
3486#endif
3487#ifdef IPPORT_USERRESERVED
3488 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
3489#else
3490 insint(d, "IPPORT_USERRESERVED", 5000);
3491#endif
3492
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003493 /* Some reserved IP v.4 addresses */
3494#ifdef INADDR_ANY
3495 insint(d, "INADDR_ANY", INADDR_ANY);
3496#else
3497 insint(d, "INADDR_ANY", 0x00000000);
3498#endif
3499#ifdef INADDR_BROADCAST
3500 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
3501#else
3502 insint(d, "INADDR_BROADCAST", 0xffffffff);
3503#endif
3504#ifdef INADDR_LOOPBACK
3505 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
3506#else
3507 insint(d, "INADDR_LOOPBACK", 0x7F000001);
3508#endif
3509#ifdef INADDR_UNSPEC_GROUP
3510 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
3511#else
3512 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
3513#endif
3514#ifdef INADDR_ALLHOSTS_GROUP
3515 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
3516#else
3517 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
3518#endif
3519#ifdef INADDR_MAX_LOCAL_GROUP
3520 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
3521#else
3522 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
3523#endif
3524#ifdef INADDR_NONE
3525 insint(d, "INADDR_NONE", INADDR_NONE);
3526#else
3527 insint(d, "INADDR_NONE", 0xffffffff);
3528#endif
3529
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003530 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003531#ifdef IP_OPTIONS
3532 insint(d, "IP_OPTIONS", IP_OPTIONS);
3533#endif
3534#ifdef IP_HDRINCL
3535 insint(d, "IP_HDRINCL", IP_HDRINCL);
3536#endif
3537#ifdef IP_TOS
3538 insint(d, "IP_TOS", IP_TOS);
3539#endif
3540#ifdef IP_TTL
3541 insint(d, "IP_TTL", IP_TTL);
3542#endif
3543#ifdef IP_RECVOPTS
3544 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
3545#endif
3546#ifdef IP_RECVRETOPTS
3547 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
3548#endif
3549#ifdef IP_RECVDSTADDR
3550 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
3551#endif
3552#ifdef IP_RETOPTS
3553 insint(d, "IP_RETOPTS", IP_RETOPTS);
3554#endif
3555#ifdef IP_MULTICAST_IF
3556 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
3557#endif
3558#ifdef IP_MULTICAST_TTL
3559 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
3560#endif
3561#ifdef IP_MULTICAST_LOOP
3562 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
3563#endif
3564#ifdef IP_ADD_MEMBERSHIP
3565 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
3566#endif
3567#ifdef IP_DROP_MEMBERSHIP
3568 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
3569#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003570#ifdef IP_DEFAULT_MULTICAST_TTL
3571 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
3572#endif
3573#ifdef IP_DEFAULT_MULTICAST_LOOP
3574 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
3575#endif
3576#ifdef IP_MAX_MEMBERSHIPS
3577 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
3578#endif
3579
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003580 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3581#ifdef IPV6_JOIN_GROUP
3582 insint(d, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
3583#endif
3584#ifdef IPV6_LEAVE_GROUP
3585 insint(d, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
3586#endif
3587#ifdef IPV6_MULTICAST_HOPS
3588 insint(d, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
3589#endif
3590#ifdef IPV6_MULTICAST_IF
3591 insint(d, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
3592#endif
3593#ifdef IPV6_MULTICAST_LOOP
3594 insint(d, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
3595#endif
3596#ifdef IPV6_UNICAST_HOPS
3597 insint(d, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
3598#endif
3599
Guido van Rossum09be4091999-08-09 14:40:40 +00003600 /* TCP options */
3601#ifdef TCP_NODELAY
3602 insint(d, "TCP_NODELAY", TCP_NODELAY);
3603#endif
3604#ifdef TCP_MAXSEG
3605 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
3606#endif
3607
3608 /* IPX options */
3609#ifdef IPX_TYPE
3610 insint(d, "IPX_TYPE", IPX_TYPE);
3611#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003612
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003613 /* get{addr,name}info parameters */
3614#ifdef EAI_ADDRFAMILY
3615 insint(d, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
3616#endif
3617#ifdef EAI_AGAIN
3618 insint(d, "EAI_AGAIN", EAI_AGAIN);
3619#endif
3620#ifdef EAI_BADFLAGS
3621 insint(d, "EAI_BADFLAGS", EAI_BADFLAGS);
3622#endif
3623#ifdef EAI_FAIL
3624 insint(d, "EAI_FAIL", EAI_FAIL);
3625#endif
3626#ifdef EAI_FAMILY
3627 insint(d, "EAI_FAMILY", EAI_FAMILY);
3628#endif
3629#ifdef EAI_MEMORY
3630 insint(d, "EAI_MEMORY", EAI_MEMORY);
3631#endif
3632#ifdef EAI_NODATA
3633 insint(d, "EAI_NODATA", EAI_NODATA);
3634#endif
3635#ifdef EAI_NONAME
3636 insint(d, "EAI_NONAME", EAI_NONAME);
3637#endif
3638#ifdef EAI_SERVICE
3639 insint(d, "EAI_SERVICE", EAI_SERVICE);
3640#endif
3641#ifdef EAI_SOCKTYPE
3642 insint(d, "EAI_SOCKTYPE", EAI_SOCKTYPE);
3643#endif
3644#ifdef EAI_SYSTEM
3645 insint(d, "EAI_SYSTEM", EAI_SYSTEM);
3646#endif
3647#ifdef EAI_BADHINTS
3648 insint(d, "EAI_BADHINTS", EAI_BADHINTS);
3649#endif
3650#ifdef EAI_PROTOCOL
3651 insint(d, "EAI_PROTOCOL", EAI_PROTOCOL);
3652#endif
3653#ifdef EAI_MAX
3654 insint(d, "EAI_MAX", EAI_MAX);
3655#endif
3656#ifdef AI_PASSIVE
3657 insint(d, "AI_PASSIVE", AI_PASSIVE);
3658#endif
3659#ifdef AI_CANONNAME
3660 insint(d, "AI_CANONNAME", AI_CANONNAME);
3661#endif
3662#ifdef AI_NUMERICHOST
3663 insint(d, "AI_NUMERICHOST", AI_NUMERICHOST);
3664#endif
3665#ifdef AI_MASK
3666 insint(d, "AI_MASK", AI_MASK);
3667#endif
3668#ifdef AI_ALL
3669 insint(d, "AI_ALL", AI_ALL);
3670#endif
3671#ifdef AI_V4MAPPED_CFG
3672 insint(d, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
3673#endif
3674#ifdef AI_ADDRCONFIG
3675 insint(d, "AI_ADDRCONFIG", AI_ADDRCONFIG);
3676#endif
3677#ifdef AI_V4MAPPED
3678 insint(d, "AI_V4MAPPED", AI_V4MAPPED);
3679#endif
3680#ifdef AI_DEFAULT
3681 insint(d, "AI_DEFAULT", AI_DEFAULT);
3682#endif
3683#ifdef NI_MAXHOST
3684 insint(d, "NI_MAXHOST", NI_MAXHOST);
3685#endif
3686#ifdef NI_MAXSERV
3687 insint(d, "NI_MAXSERV", NI_MAXSERV);
3688#endif
3689#ifdef NI_NOFQDN
3690 insint(d, "NI_NOFQDN", NI_NOFQDN);
3691#endif
3692#ifdef NI_NUMERICHOST
3693 insint(d, "NI_NUMERICHOST", NI_NUMERICHOST);
3694#endif
3695#ifdef NI_NAMEREQD
3696 insint(d, "NI_NAMEREQD", NI_NAMEREQD);
3697#endif
3698#ifdef NI_NUMERICSERV
3699 insint(d, "NI_NUMERICSERV", NI_NUMERICSERV);
3700#endif
3701#ifdef NI_DGRAM
3702 insint(d, "NI_DGRAM", NI_DGRAM);
3703#endif
3704
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003705 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003706#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003707 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003708#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003709}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003710
3711/* Simplistic emulation code for inet_pton that only works for IPv4 */
3712#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003713int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003714inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003715{
3716 if(af == AF_INET){
3717 long packed_addr;
3718#ifdef USE_GUSI1
3719 packed_addr = (long)inet_addr(src).s_addr;
3720#else
3721 packed_addr = inet_addr(src);
3722#endif
3723 if (packed_addr == INADDR_NONE)
3724 return 0;
3725 memcpy(dst, &packed_addr, 4);
3726 return 1;
3727 }
3728 /* Should set errno to EAFNOSUPPORT */
3729 return -1;
3730}
3731
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003732const char *
3733inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003734{
3735 if (af == AF_INET) {
3736 struct in_addr packed_addr;
3737 if (size < 16)
3738 /* Should set errno to ENOSPC. */
3739 return NULL;
3740 memcpy(&packed_addr, src, sizeof(packed_addr));
3741 return strncpy(dst, inet_ntoa(packed_addr), size);
3742 }
3743 /* Should set errno to EAFNOSUPPORT */
3744 return NULL;
3745}
3746#endif