blob: 99761f4b1a42057786c9034a6ee0c087ddf2e67f [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
1270 if (res != 0)
1271 res = errno;
1272 return PyInt_FromLong((long) res);
1273}
1274
Guido van Rossum82a5c661998-07-07 20:45:43 +00001275static char connect_ex_doc[] =
1276"connect_ex(address)\n\
1277\n\
1278This is like connect(address), but returns an error code (the errno value)\n\
1279instead of raising an exception when an error occurs.";
1280
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001281
Guido van Rossumed233a51992-06-23 09:07:03 +00001282/* s.fileno() method */
1283
Guido van Rossum73624e91994-10-10 17:59:00 +00001284static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001285PySocketSock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001286{
Fred Drakea04eaad2000-06-30 02:46:07 +00001287#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001288 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001289#else
1290 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1291#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001292}
1293
Guido van Rossum82a5c661998-07-07 20:45:43 +00001294static char fileno_doc[] =
1295"fileno() -> integer\n\
1296\n\
1297Return the integer file descriptor of the socket.";
1298
Guido van Rossumed233a51992-06-23 09:07:03 +00001299
Guido van Rossumbe32c891996-06-20 16:25:29 +00001300#ifndef NO_DUP
1301/* s.dup() method */
1302
1303static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001304PySocketSock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001305{
Fred Drakea04eaad2000-06-30 02:46:07 +00001306 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001307 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001308
Guido van Rossumbe32c891996-06-20 16:25:29 +00001309 newfd = dup(s->sock_fd);
1310 if (newfd < 0)
1311 return PySocket_Err();
1312 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001313 s->sock_family,
1314 s->sock_type,
1315 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001316 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001317 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001318 return sock;
1319}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001320
1321static char dup_doc[] =
1322"dup() -> socket object\n\
1323\n\
1324Return a new socket object connected to the same system resource.";
1325
Guido van Rossumbe32c891996-06-20 16:25:29 +00001326#endif
1327
1328
Guido van Rossumc89705d1992-11-26 08:54:07 +00001329/* s.getsockname() method */
1330
Guido van Rossum73624e91994-10-10 17:59:00 +00001331static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001332PySocketSock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001333{
1334 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001335 int res;
1336 socklen_t addrlen;
1337
Guido van Rossumc89705d1992-11-26 08:54:07 +00001338 if (!getsockaddrlen(s, &addrlen))
1339 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001340 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001341 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001342 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001343 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001344 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001345 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001346 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001347}
1348
Guido van Rossum82a5c661998-07-07 20:45:43 +00001349static char getsockname_doc[] =
1350"getsockname() -> address info\n\
1351\n\
1352Return the address of the local endpoint. For IP sockets, the address\n\
1353info is a pair (hostaddr, port).";
1354
Guido van Rossumc89705d1992-11-26 08:54:07 +00001355
Guido van Rossumb6775db1994-08-01 11:34:53 +00001356#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001357/* s.getpeername() method */
1358
Guido van Rossum73624e91994-10-10 17:59:00 +00001359static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001360PySocketSock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001361{
1362 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001363 int res;
1364 socklen_t addrlen;
1365
Guido van Rossumc89705d1992-11-26 08:54:07 +00001366 if (!getsockaddrlen(s, &addrlen))
1367 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001368 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001369 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001370 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001371 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001372 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001373 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001374 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001375}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001376
1377static char getpeername_doc[] =
1378"getpeername() -> address info\n\
1379\n\
1380Return the address of the remote endpoint. For IP sockets, the address\n\
1381info is a pair (hostaddr, port).";
1382
Guido van Rossumb6775db1994-08-01 11:34:53 +00001383#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001384
1385
Guido van Rossum30a685f1991-06-27 15:51:29 +00001386/* s.listen(n) method */
1387
Guido van Rossum73624e91994-10-10 17:59:00 +00001388static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001389PySocketSock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001390{
1391 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001392 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001393
1394 backlog = PyInt_AsLong(arg);
1395 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001396 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001397 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001398 if (backlog < 1)
1399 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001400 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001401 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001402 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001403 return PySocket_Err();
1404 Py_INCREF(Py_None);
1405 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001406}
1407
Guido van Rossum82a5c661998-07-07 20:45:43 +00001408static char listen_doc[] =
1409"listen(backlog)\n\
1410\n\
1411Enable a server to accept connections. The backlog argument must be at\n\
1412least 1; it specifies the number of unaccepted connection that the system\n\
1413will allow before refusing new connections.";
1414
1415
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001416#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001417/* s.makefile(mode) method.
1418 Create a new open file object referring to a dupped version of
1419 the socket's file descriptor. (The dup() call is necessary so
1420 that the open file and socket objects may be closed independent
1421 of each other.)
1422 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1423
Guido van Rossum73624e91994-10-10 17:59:00 +00001424static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001425PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001426{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001427 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001428 char *mode = "r";
1429 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001430#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001431 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001432#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001433 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001434#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001435 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001436 PyObject *f;
1437
Guido van Rossum43713e52000-02-29 13:59:29 +00001438 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001439 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001440#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001441 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1442 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001443#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001444 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001445#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001446 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001447 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001448 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001449 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001450 }
1451 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1452 if (f != NULL)
1453 PyFile_SetBufSize(f, bufsize);
1454 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001455}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001456
1457static char makefile_doc[] =
1458"makefile([mode[, buffersize]]) -> file object\n\
1459\n\
1460Return a regular file object corresponding to the socket.\n\
1461The mode and buffersize arguments are as for the built-in open() function.";
1462
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001463#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001464
Guido van Rossum48a680c2001-03-02 06:34:14 +00001465
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001466/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001467
Guido van Rossum73624e91994-10-10 17:59:00 +00001468static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001469PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001470{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001471 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001472 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001473 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001474 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001475 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001476 if (buf == NULL)
1477 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001478 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001479 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001480 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001481 if (n < 0) {
1482 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001483 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001484 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001485 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001486 return NULL;
1487 return buf;
1488}
1489
Guido van Rossum82a5c661998-07-07 20:45:43 +00001490static char recv_doc[] =
1491"recv(buffersize[, flags]) -> data\n\
1492\n\
1493Receive up to buffersize bytes from the socket. For the optional flags\n\
1494argument, see the Unix manual. When no data is available, block until\n\
1495at least one byte is available or until the remote end is closed. When\n\
1496the remote end is closed and all data is read, return the empty string.";
1497
Guido van Rossum30a685f1991-06-27 15:51:29 +00001498
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001499/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001500
Guido van Rossum73624e91994-10-10 17:59:00 +00001501static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001502PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001503{
1504 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001505 PyObject *buf = NULL;
1506 PyObject *addr = NULL;
1507 PyObject *ret = NULL;
1508
Guido van Rossumff3ab422000-04-24 15:16:03 +00001509 int len, n, flags = 0;
1510 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001511 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001512 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001513 if (!getsockaddrlen(s, &addrlen))
1514 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001515 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001516 if (buf == NULL)
1517 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001518 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001519 memset(addrbuf, 0, addrlen);
1520 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001521#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001522#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001523 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001524#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001525 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001526#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001527#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001528 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001529#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001530 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001531 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001532 if (n < 0) {
1533 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001534 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001535 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001536 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001537 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001538
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001539 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001540 goto finally;
1541
Guido van Rossum73624e91994-10-10 17:59:00 +00001542 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001543 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001544 Py_XDECREF(addr);
1545 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001546 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001547}
1548
Guido van Rossum82a5c661998-07-07 20:45:43 +00001549static char recvfrom_doc[] =
1550"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1551\n\
1552Like recv(buffersize, flags) but also return the sender's address info.";
1553
Guido van Rossum30a685f1991-06-27 15:51:29 +00001554
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001555/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001556
Guido van Rossum73624e91994-10-10 17:59:00 +00001557static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001558PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001559{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001560 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001561 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001562 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001563 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001564 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001565 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001566 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001567 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001568 return PySocket_Err();
1569 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001570}
1571
Guido van Rossum82a5c661998-07-07 20:45:43 +00001572static char send_doc[] =
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001573"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001574\n\
1575Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001576argument, see the Unix manual. Return the number of bytes\n\
1577sent; this may be less than len(data) if the network is busy.";
1578
1579
1580/* s.sendall(data [,flags]) method */
1581
1582static PyObject *
1583PySocketSock_sendall(PySocketSockObject *s, PyObject *args)
1584{
1585 char *buf;
1586 int len, n, flags = 0, total = 0;
1587 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1588 return NULL;
1589 Py_BEGIN_ALLOW_THREADS
1590 do {
1591 n = send(s->sock_fd, buf, len, flags);
1592 if (n < 0)
1593 break;
1594 total += n;
1595 buf += n;
1596 len -= n;
1597 } while (len > 0);
1598 Py_END_ALLOW_THREADS
1599 if (n < 0)
1600 return PySocket_Err();
1601 Py_INCREF(Py_None);
1602 return Py_None;
1603}
1604
1605static char sendall_doc[] =
1606"sendall(data[, flags])\n\
1607\n\
1608Send a data string to the socket. For the optional flags\n\
1609argument, see the Unix manual. This calls send() repeatedly\n\
1610until all data is sent. If an error occurs, it's impossible\n\
1611to tell how much data has been sent.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001612
Guido van Rossum30a685f1991-06-27 15:51:29 +00001613
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001614/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001615
Guido van Rossum73624e91994-10-10 17:59:00 +00001616static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001617PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001618{
Guido van Rossum73624e91994-10-10 17:59:00 +00001619 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001620 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001621 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001622 int addrlen, len, n, flags;
1623 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001624 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001625 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001626 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1627 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001628 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001629 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001630 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001631 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001632 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001633 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001634 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001635 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001636 return PySocket_Err();
1637 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001638}
1639
Guido van Rossum82a5c661998-07-07 20:45:43 +00001640static char sendto_doc[] =
1641"sendto(data[, flags], address)\n\
1642\n\
1643Like send(data, flags) but allows specifying the destination address.\n\
1644For IP sockets, the address is a pair (hostaddr, port).";
1645
Guido van Rossum30a685f1991-06-27 15:51:29 +00001646
1647/* s.shutdown(how) method */
1648
Guido van Rossum73624e91994-10-10 17:59:00 +00001649static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001650PySocketSock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001651{
1652 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001653 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001654
1655 how = PyInt_AsLong(arg);
1656 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001657 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001658 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001659 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001660 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001661 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001662 return PySocket_Err();
1663 Py_INCREF(Py_None);
1664 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001665}
1666
Guido van Rossum82a5c661998-07-07 20:45:43 +00001667static char shutdown_doc[] =
1668"shutdown(flag)\n\
1669\n\
1670Shut down the reading side of the socket (flag == 0), the writing side\n\
1671of the socket (flag == 1), or both ends (flag == 2).";
1672
Guido van Rossum30a685f1991-06-27 15:51:29 +00001673
1674/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001675
Guido van Rossum73624e91994-10-10 17:59:00 +00001676static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum17209fc2001-10-15 21:12:54 +00001677 {"accept", (PyCFunction)PySocketSock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001678 accept_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001679 {"bind", (PyCFunction)PySocketSock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001680 bind_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00001681 {"close", (PyCFunction)PySocketSock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001682 close_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001683 {"connect", (PyCFunction)PySocketSock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001684 connect_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001685 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001686 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001687#ifndef NO_DUP
Guido van Rossum17209fc2001-10-15 21:12:54 +00001688 {"dup", (PyCFunction)PySocketSock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001689 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001690#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001691 {"fileno", (PyCFunction)PySocketSock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001692 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001693#ifdef HAVE_GETPEERNAME
Guido van Rossum17209fc2001-10-15 21:12:54 +00001694 {"getpeername", (PyCFunction)PySocketSock_getpeername,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001695 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001696#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001697 {"getsockname", (PyCFunction)PySocketSock_getsockname,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001698 METH_NOARGS, getsockname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001699 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1700 getsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001701 {"listen", (PyCFunction)PySocketSock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001702 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001703#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001704 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1705 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001706#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001707 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1708 recv_doc},
1709 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1710 recvfrom_doc},
1711 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1712 send_doc},
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001713 {"sendall", (PyCFunction)PySocketSock_sendall, METH_VARARGS,
1714 sendall_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001715 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1716 sendto_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001717 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001718 setblocking_doc},
1719 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1720 setsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001721 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001722 shutdown_doc},
1723#ifdef RISCOS
1724 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1725 sleeptaskw_doc},
1726#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001727 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001728};
1729
Guido van Rossum30a685f1991-06-27 15:51:29 +00001730
Guido van Rossum73624e91994-10-10 17:59:00 +00001731/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001732 First close the file description. */
1733
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001734static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001735PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001736{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001737 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001738 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001739 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001740}
1741
Guido van Rossum30a685f1991-06-27 15:51:29 +00001742
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001743static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001744PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001745{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001746 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001747#if SIZEOF_SOCKET_T > SIZEOF_LONG
1748 if (s->sock_fd > LONG_MAX) {
1749 /* this can occur on Win64, and actually there is a special
1750 ugly printf formatter for decimal pointer length integer
1751 printing, only bother if necessary*/
1752 PyErr_SetString(PyExc_OverflowError,
1753 "no printf formatter to display the socket descriptor in decimal");
1754 return NULL;
1755 }
1756#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001757 sprintf(buf,
1758 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001759 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001760 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001761}
1762
1763
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001764/* Create a new, uninitialized socket object. */
1765
1766static PyObject *
1767PySocketSock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1768{
1769 PyObject *new;
1770
1771 new = type->tp_alloc(type, 0);
1772 if (new != NULL)
1773 ((PySocketSockObject *)new)->sock_fd = -1;
1774 return new;
1775}
1776
1777
1778/* Initialize a new socket object. */
1779
1780/*ARGSUSED*/
1781static int
1782PySocketSock_init(PyObject *self, PyObject *args, PyObject *kwds)
1783{
1784 PySocketSockObject *s = (PySocketSockObject *)self;
1785 SOCKET_T fd;
1786 int family = AF_INET, type = SOCK_STREAM, proto = 0;
1787 static char *keywords[] = {"family", "type", "proto", 0};
1788
1789 if (!PyArg_ParseTupleAndKeywords(args, kwds,
1790 "|iii:socket", keywords,
1791 &family, &type, &proto))
1792 return -1;
1793 Py_BEGIN_ALLOW_THREADS
1794 fd = socket(family, type, proto);
1795 Py_END_ALLOW_THREADS
1796#ifdef MS_WINDOWS
1797 if (fd == INVALID_SOCKET)
1798#else
1799 if (fd < 0)
1800#endif
1801 {
1802 PySocket_Err();
1803 return -1;
1804 }
1805 init_sockobject(s, fd, family, type, proto);
1806 /* From now on, ignore SIGPIPE and let the error checking
1807 do the work. */
1808#ifdef SIGPIPE
1809 (void) signal(SIGPIPE, SIG_IGN);
1810#endif
1811 return 0;
1812}
1813
1814
Guido van Rossumb6775db1994-08-01 11:34:53 +00001815/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001816
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001817static char socket_doc[] =
1818"socket([family[, type[, proto]]]) -> socket object\n\
1819\n\
1820Open a socket of the given type. The family argument specifies the\n\
1821address family; it defaults to AF_INET. The type argument specifies\n\
1822whether this is a stream (SOCK_STREAM, this is the default)\n\
1823or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1824specifying the default protocol.\n\
1825\n\
1826A socket represents one endpoint of a network connection.\n\
1827\n\
1828Methods:\n\
1829\n\
1830accept() -- accept a connection, returning new socket and client address\n\
1831bind() -- bind the socket to a local address\n\
1832close() -- close the socket\n\
1833connect() -- connect the socket to a remote address\n\
1834connect_ex() -- connect, return an error code instead of an exception \n\
1835dup() -- return a new socket object identical to the current one (*)\n\
1836fileno() -- return underlying file descriptor\n\
1837getpeername() -- return remote address (*)\n\
1838getsockname() -- return local address\n\
1839getsockopt() -- get socket options\n\
1840listen() -- start listening for incoming connections\n\
1841makefile() -- return a file object corresponding tot the socket (*)\n\
1842recv() -- receive data\n\
1843recvfrom() -- receive data and sender's address\n\
1844send() -- send data, may not send all of it\n\
1845sendall() -- send all data\n\
1846sendto() -- send data to a given address\n\
1847setblocking() -- set or clear the blocking I/O flag\n\
1848setsockopt() -- set socket options\n\
1849shutdown() -- shut down traffic in one or both directions\n\
1850\n\
1851(*) not available on all platforms!)";
1852
Guido van Rossum73624e91994-10-10 17:59:00 +00001853static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001854 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001855 0, /* ob_size */
1856 "socket.socket", /* tp_name */
1857 sizeof(PySocketSockObject), /* tp_basicsize */
1858 0, /* tp_itemsize */
1859 (destructor)PySocketSock_dealloc, /* tp_dealloc */
1860 0, /* tp_print */
1861 0, /* tp_getattr */
1862 0, /* tp_setattr */
1863 0, /* tp_compare */
1864 (reprfunc)PySocketSock_repr, /* tp_repr */
1865 0, /* tp_as_number */
1866 0, /* tp_as_sequence */
1867 0, /* tp_as_mapping */
1868 0, /* tp_hash */
1869 0, /* tp_call */
1870 0, /* tp_str */
1871 PyObject_GenericGetAttr, /* tp_getattro */
1872 0, /* tp_setattro */
1873 0, /* tp_as_buffer */
1874 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1875 socket_doc, /* tp_doc */
1876 0, /* tp_traverse */
1877 0, /* tp_clear */
1878 0, /* tp_richcompare */
1879 0, /* tp_weaklistoffset */
1880 0, /* tp_iter */
1881 0, /* tp_iternext */
1882 PySocketSock_methods, /* tp_methods */
1883 0, /* tp_members */
1884 0, /* tp_getset */
1885 0, /* tp_base */
1886 0, /* tp_dict */
1887 0, /* tp_descr_get */
1888 0, /* tp_descr_set */
1889 0, /* tp_dictoffset */
1890 PySocketSock_init, /* tp_init */
1891 PyType_GenericAlloc, /* tp_alloc */
1892 PySocketSock_new, /* tp_new */
1893 _PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001894};
1895
Guido van Rossum30a685f1991-06-27 15:51:29 +00001896
Guido van Rossum81194471991-07-27 21:42:02 +00001897/* Python interface to gethostname(). */
1898
1899/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001900static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001901PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001902{
1903 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001904 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001905 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001906 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001907 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001908 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001909 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001910 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001911 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001912 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001913 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001914}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001915
Guido van Rossum82a5c661998-07-07 20:45:43 +00001916static char gethostname_doc[] =
1917"gethostname() -> string\n\
1918\n\
1919Return the current host name.";
1920
Guido van Rossumff4949e1992-08-05 19:58:53 +00001921
Guido van Rossum30a685f1991-06-27 15:51:29 +00001922/* Python interface to gethostbyname(name). */
1923
1924/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001925static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001926PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001927{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001928 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001929 struct sockaddr_storage addrbuf;
1930
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001931 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001932 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001933 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001934 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001935 return makeipaddr((struct sockaddr *)&addrbuf,
1936 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001937}
1938
Guido van Rossum82a5c661998-07-07 20:45:43 +00001939static char gethostbyname_doc[] =
1940"gethostbyname(host) -> address\n\
1941\n\
1942Return the IP address (a string of the form '255.255.255.255') for a host.";
1943
1944
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001945/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1946
1947static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001948gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001949{
1950 char **pch;
1951 PyObject *rtn_tuple = (PyObject *)NULL;
1952 PyObject *name_list = (PyObject *)NULL;
1953 PyObject *addr_list = (PyObject *)NULL;
1954 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001955
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001956 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001957 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001958#ifndef RISCOS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001959 PyH_Err(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001960#else
1961 PyErr_SetString(PySocket_Error, "host not found");
1962#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001963 return NULL;
1964 }
1965 if (h->h_addrtype != af) {
1966#ifdef HAVE_STRERROR
1967 /* Let's get real error message to return */
1968 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001969#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001970 PyErr_SetString(PySocket_Error,
1971 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001972#endif
1973 return NULL;
1974 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001975 switch (af) {
1976 case AF_INET:
1977 if (alen < sizeof(struct sockaddr_in))
1978 return NULL;
1979 break;
1980#ifdef INET6
1981 case AF_INET6:
1982 if (alen < sizeof(struct sockaddr_in6))
1983 return NULL;
1984 break;
1985#endif
1986 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001987 if ((name_list = PyList_New(0)) == NULL)
1988 goto err;
1989 if ((addr_list = PyList_New(0)) == NULL)
1990 goto err;
1991 for (pch = h->h_aliases; *pch != NULL; pch++) {
1992 int status;
1993 tmp = PyString_FromString(*pch);
1994 if (tmp == NULL)
1995 goto err;
1996 status = PyList_Append(name_list, tmp);
1997 Py_DECREF(tmp);
1998 if (status)
1999 goto err;
2000 }
2001 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2002 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002003 switch (af) {
2004 case AF_INET:
2005 {
2006 struct sockaddr_in sin;
2007 memset(&sin, 0, sizeof(sin));
2008 sin.sin_family = af;
2009#ifdef HAVE_SOCKADDR_SA_LEN
2010 sin.sin_len = sizeof(sin);
2011#endif
2012 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2013 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
2014 if (pch == h->h_addr_list && alen >= sizeof(sin))
2015 memcpy((char *) addr, &sin, sizeof(sin));
2016 break;
2017 }
2018#ifdef INET6
2019 case AF_INET6:
2020 {
2021 struct sockaddr_in6 sin6;
2022 memset(&sin6, 0, sizeof(sin6));
2023 sin6.sin6_family = af;
2024#ifdef HAVE_SOCKADDR_SA_LEN
2025 sin6.sin6_len = sizeof(sin6);
2026#endif
2027 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2028 tmp = makeipaddr((struct sockaddr *)&sin6,
2029 sizeof(sin6));
2030 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2031 memcpy((char *) addr, &sin6, sizeof(sin6));
2032 break;
2033 }
2034#endif
2035 default: /* can't happen */
2036 PyErr_SetString(PySocket_Error,
2037 "unsupported address family");
2038 return NULL;
2039 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002040 if (tmp == NULL)
2041 goto err;
2042 status = PyList_Append(addr_list, tmp);
2043 Py_DECREF(tmp);
2044 if (status)
2045 goto err;
2046 }
2047 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
2048 err:
2049 Py_XDECREF(name_list);
2050 Py_XDECREF(addr_list);
2051 return rtn_tuple;
2052}
2053
2054
2055/* Python interface to gethostbyname_ex(name). */
2056
2057/*ARGSUSED*/
2058static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002059PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002060{
2061 char *name;
2062 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002063 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002064 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002065 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002066#ifdef HAVE_GETHOSTBYNAME_R
2067 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002068#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2069 struct hostent_data data;
2070#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002071 char buf[16384];
2072 int buf_len = (sizeof buf) - 1;
2073 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002074#endif
2075#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002076 int result;
2077#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002078#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002079
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002080 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002081 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002082 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002083 return NULL;
2084 Py_BEGIN_ALLOW_THREADS
2085#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002086#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002087 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002088#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002089 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002090#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002091 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002092 result = gethostbyname_r(name, &hp_allocated, &data);
2093 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002094#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002095#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002096#ifdef USE_GETHOSTBYNAME_LOCK
2097 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002098#endif
2099 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002100#endif /* HAVE_GETHOSTBYNAME_R */
2101 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002102 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
2103 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
2104 sa = (struct sockaddr*)&addr;
2105 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002106#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002107 PyThread_release_lock(gethostbyname_lock);
2108#endif
2109 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002110}
2111
2112static char ghbn_ex_doc[] =
2113"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2114\n\
2115Return the true host name, a list of aliases, and a list of IP addresses,\n\
2116for a host. The host argument is a string giving a host name or IP number.";
2117
2118
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002119/* Python interface to gethostbyaddr(IP). */
2120
2121/*ARGSUSED*/
2122static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002123PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002124{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002125#ifdef INET6
2126 struct sockaddr_storage addr;
2127#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002128 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002129#endif
2130 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002131 char *ip_num;
2132 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002133 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002134#ifdef HAVE_GETHOSTBYNAME_R
2135 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002136#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2137 struct hostent_data data;
2138#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002139 char buf[16384];
2140 int buf_len = (sizeof buf) - 1;
2141 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002142#endif
2143#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002144 int result;
2145#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002146#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002147 char *ap;
2148 int al;
2149 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002150
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002151 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002152 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002153 af = PF_UNSPEC;
2154 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002155 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002156 af = sa->sa_family;
2157 ap = NULL;
2158 al = 0;
2159 switch (af) {
2160 case AF_INET:
2161 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2162 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2163 break;
2164#ifdef INET6
2165 case AF_INET6:
2166 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2167 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2168 break;
2169#endif
2170 default:
2171 PyErr_SetString(PySocket_Error, "unsupported address family");
2172 return NULL;
2173 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002174 Py_BEGIN_ALLOW_THREADS
2175#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002176#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002177 result = gethostbyaddr_r(ap, al, af,
2178 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002179 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002180#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002181 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002182 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002183#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002184 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002185 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002186 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002187#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002188#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002189#ifdef USE_GETHOSTBYNAME_LOCK
2190 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002191#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002192 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002193#endif /* HAVE_GETHOSTBYNAME_R */
2194 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002195 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002196#ifdef USE_GETHOSTBYNAME_LOCK
2197 PyThread_release_lock(gethostbyname_lock);
2198#endif
2199 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002200}
2201
Guido van Rossum82a5c661998-07-07 20:45:43 +00002202static char gethostbyaddr_doc[] =
2203"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2204\n\
2205Return the true host name, a list of aliases, and a list of IP addresses,\n\
2206for a host. The host argument is a string giving a host name or IP number.";
2207
Guido van Rossum30a685f1991-06-27 15:51:29 +00002208
2209/* Python interface to getservbyname(name).
2210 This only returns the port number, since the other info is already
2211 known or not useful (like the list of aliases). */
2212
2213/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002214static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002215PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002216{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002217 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002218 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002219 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002220 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002221 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002222 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002223 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002224 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002225 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002226 return NULL;
2227 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002228 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002229}
2230
Guido van Rossum82a5c661998-07-07 20:45:43 +00002231static char getservbyname_doc[] =
2232"getservbyname(servicename, protocolname) -> integer\n\
2233\n\
2234Return a port number from a service name and protocol name.\n\
2235The protocol name should be 'tcp' or 'udp'.";
2236
Guido van Rossum30a685f1991-06-27 15:51:29 +00002237
Guido van Rossum3901d851996-12-19 16:35:04 +00002238/* Python interface to getprotobyname(name).
2239 This only returns the protocol number, since the other info is
2240 already known or not useful (like the list of aliases). */
2241
2242/*ARGSUSED*/
2243static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002244PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002245{
2246 char *name;
2247 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002248#ifdef __BEOS__
2249/* Not available in BeOS yet. - [cjh] */
2250 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2251 return NULL;
2252#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002253 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002254 return NULL;
2255 Py_BEGIN_ALLOW_THREADS
2256 sp = getprotobyname(name);
2257 Py_END_ALLOW_THREADS
2258 if (sp == NULL) {
2259 PyErr_SetString(PySocket_Error, "protocol not found");
2260 return NULL;
2261 }
2262 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002263#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002264}
2265
Guido van Rossum82a5c661998-07-07 20:45:43 +00002266static char getprotobyname_doc[] =
2267"getprotobyname(name) -> integer\n\
2268\n\
2269Return the protocol number for the named protocol. (Rarely used.)";
2270
Guido van Rossum3901d851996-12-19 16:35:04 +00002271
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002272#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002273/* Create a socket object from a numeric file description.
2274 Useful e.g. if stdin is a socket.
2275 Additional arguments as for socket(). */
2276
2277/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002278static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002279PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002280{
Guido van Rossum73624e91994-10-10 17:59:00 +00002281 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002282 SOCKET_T fd;
2283 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002284 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2285 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002286 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002287 /* Dup the fd so it and the socket can be closed independently */
2288 fd = dup(fd);
2289 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002290 return PySocket_Err();
2291 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002292 /* From now on, ignore SIGPIPE and let the error checking
2293 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002294#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002295 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002296#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002297 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002298}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002299
2300static char fromfd_doc[] =
2301"fromfd(fd, family, type[, proto]) -> socket object\n\
2302\n\
2303Create a socket object from the given file descriptor.\n\
2304The remaining arguments are the same as for socket().";
2305
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002306#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002307
Guido van Rossum82a5c661998-07-07 20:45:43 +00002308
Guido van Rossum006bf911996-06-12 04:04:55 +00002309static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002310PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002311{
2312 int x1, x2;
2313
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002314 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002315 return NULL;
2316 }
2317 x2 = (int)ntohs((short)x1);
2318 return PyInt_FromLong(x2);
2319}
2320
Guido van Rossum82a5c661998-07-07 20:45:43 +00002321static char ntohs_doc[] =
2322"ntohs(integer) -> integer\n\
2323\n\
2324Convert a 16-bit integer from network to host byte order.";
2325
2326
Guido van Rossum006bf911996-06-12 04:04:55 +00002327static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002328PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002329{
2330 int x1, x2;
2331
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002332 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002333 return NULL;
2334 }
2335 x2 = ntohl(x1);
2336 return PyInt_FromLong(x2);
2337}
2338
Guido van Rossum82a5c661998-07-07 20:45:43 +00002339static char ntohl_doc[] =
2340"ntohl(integer) -> integer\n\
2341\n\
2342Convert a 32-bit integer from network to host byte order.";
2343
2344
Guido van Rossum006bf911996-06-12 04:04:55 +00002345static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002346PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002347{
2348 int x1, x2;
2349
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002350 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002351 return NULL;
2352 }
2353 x2 = (int)htons((short)x1);
2354 return PyInt_FromLong(x2);
2355}
2356
Guido van Rossum82a5c661998-07-07 20:45:43 +00002357static char htons_doc[] =
2358"htons(integer) -> integer\n\
2359\n\
2360Convert a 16-bit integer from host to network byte order.";
2361
2362
Guido van Rossum006bf911996-06-12 04:04:55 +00002363static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002364PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002365{
2366 int x1, x2;
2367
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002368 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002369 return NULL;
2370 }
2371 x2 = htonl(x1);
2372 return PyInt_FromLong(x2);
2373}
2374
Guido van Rossum82a5c661998-07-07 20:45:43 +00002375static char htonl_doc[] =
2376"htonl(integer) -> integer\n\
2377\n\
2378Convert a 32-bit integer from host to network byte order.";
2379
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002380/*
2381 * socket.inet_aton() and socket.inet_ntoa() functions
2382 *
2383 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2384 *
2385 */
2386
Guido van Rossum48a680c2001-03-02 06:34:14 +00002387static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002388"inet_aton(string) -> packed 32-bit IP representation\n\
2389\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002390Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002391binary format used in low-level network functions.";
2392
2393static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002394PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002395{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002396#ifndef INADDR_NONE
2397#define INADDR_NONE (-1)
2398#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002399
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002400 /* Have to use inet_addr() instead */
2401 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002402 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002403
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002404 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002405 return NULL;
2406 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002407#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002408 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002409#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002410 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002411#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002412
2413 if (packed_addr == INADDR_NONE) { /* invalid address */
2414 PyErr_SetString(PySocket_Error,
2415 "illegal IP address string passed to inet_aton");
2416 return NULL;
2417 }
2418
2419 return PyString_FromStringAndSize((char *) &packed_addr,
2420 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002421}
2422
Guido van Rossum48a680c2001-03-02 06:34:14 +00002423static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002424"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002425\n\
2426Convert an IP address from 32-bit packed binary format to string format";
2427
2428static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002429PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002430{
2431 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002432 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002433 struct in_addr packed_addr;
2434
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002435 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002436 return NULL;
2437 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002438
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002439 if (addr_len != sizeof(packed_addr)) {
2440 PyErr_SetString(PySocket_Error,
2441 "packed IP wrong length for inet_ntoa");
2442 return NULL;
2443 }
2444
2445 memcpy(&packed_addr, packed_str, addr_len);
2446
2447 return PyString_FromString(inet_ntoa(packed_addr));
2448}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002449
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002450/* Python interface to getaddrinfo(host, port). */
2451
2452/*ARGSUSED*/
2453static PyObject *
2454PySocket_getaddrinfo(PyObject *self, PyObject *args)
2455{
2456 struct addrinfo hints, *res0, *res;
2457 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002458 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002459 char *hptr, *pptr;
2460 int family, socktype, protocol, flags;
2461 int error;
2462 PyObject *all = (PyObject *)NULL;
2463 PyObject *single = (PyObject *)NULL;
2464
2465 family = socktype = protocol = flags = 0;
2466 family = PF_UNSPEC;
2467 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2468 &hptr, &pobj, &family, &socktype,
2469 &protocol, &flags)) {
2470 return NULL;
2471 }
2472 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002473 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002474 pptr = pbuf;
2475 } else if (PyString_Check(pobj)) {
2476 pptr = PyString_AsString(pobj);
2477 } else if (pobj == Py_None) {
2478 pptr = (char *)NULL;
2479 } else {
2480 PyErr_SetString(PySocket_Error, "Int or String expected");
2481 return NULL;
2482 }
2483 memset(&hints, 0, sizeof(hints));
2484 hints.ai_family = family;
2485 hints.ai_socktype = socktype;
2486 hints.ai_protocol = protocol;
2487 hints.ai_flags = flags;
2488 error = getaddrinfo(hptr, pptr, &hints, &res0);
2489 if (error) {
2490 PyGAI_Err(error);
2491 return NULL;
2492 }
2493
2494 if ((all = PyList_New(0)) == NULL)
2495 goto err;
2496 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002497 PyObject *addr =
2498 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2499 if (addr == NULL)
2500 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002501 single = Py_BuildValue("iiisO", res->ai_family,
2502 res->ai_socktype, res->ai_protocol,
2503 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002504 addr);
2505 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002506 if (single == NULL)
2507 goto err;
2508
2509 if (PyList_Append(all, single))
2510 goto err;
2511 Py_XDECREF(single);
2512 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002513 return all;
2514 err:
2515 Py_XDECREF(single);
2516 Py_XDECREF(all);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002517 return (PyObject *)NULL;
2518}
2519
2520static char getaddrinfo_doc[] =
2521"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2522 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2523\n\
2524Resolve host and port into addrinfo struct.";
2525
2526/* Python interface to getnameinfo(sa, flags). */
2527
2528/*ARGSUSED*/
2529static PyObject *
2530PySocket_getnameinfo(PyObject *self, PyObject *args)
2531{
2532 PyObject *sa = (PyObject *)NULL;
2533 int flags;
2534 char *hostp;
2535 int n, port, flowinfo, scope_id;
2536 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2537 struct addrinfo hints, *res = NULL;
2538 int error;
2539 PyObject *ret = (PyObject *)NULL;
2540
2541 flags = flowinfo = scope_id = 0;
2542 if (PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags) == 0)
2543 return NULL;
2544 n = PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, scope_id);
2545 if (n == 0)
2546 goto fail;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002547 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002548 memset(&hints, 0, sizeof(hints));
2549 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002550 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002551 error = getaddrinfo(hostp, pbuf, &hints, &res);
2552 if (error) {
2553 PyGAI_Err(error);
2554 goto fail;
2555 }
2556 if (res->ai_next) {
2557 PyErr_SetString(PySocket_Error,
2558 "sockaddr resolved to multiple addresses");
2559 goto fail;
2560 }
2561 switch (res->ai_family) {
2562 case AF_INET:
2563 {
2564 char *t1;
2565 int t2;
2566 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2567 PyErr_SetString(PySocket_Error,
2568 "IPv4 sockaddr must be 2 tuple");
2569 goto fail;
2570 }
2571 break;
2572 }
2573#ifdef INET6
2574 case AF_INET6:
2575 {
2576 struct sockaddr_in6 *sin6;
2577 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2578 sin6->sin6_flowinfo = flowinfo;
2579 sin6->sin6_scope_id = scope_id;
2580 break;
2581 }
2582#endif
2583 }
2584 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2585 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2586 if (error) {
2587 PyGAI_Err(error);
2588 goto fail;
2589 }
2590 ret = Py_BuildValue("ss", hbuf, pbuf);
2591
2592fail:
2593 if (res)
2594 freeaddrinfo(res);
2595 Py_XDECREF(sa);
2596 return ret;
2597}
2598
2599static char getnameinfo_doc[] =
2600"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2601\n\
2602Get host and port for a sockaddr.";
2603
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002604/* XXX It might be helpful to augment the error message generated
2605 below with the name of the SSL function that generated the error.
2606 I expect it's obvious most of the time.
2607*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002608
2609#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002610static PyObject *
2611PySSL_SetError(SSL *ssl, int ret)
2612{
2613 PyObject *v, *n, *s;
2614 char *errstr;
2615 int err;
2616
2617 assert(ret <= 0);
2618
2619 err = SSL_get_error(ssl, ret);
2620 n = PyInt_FromLong(err);
2621 if (n == NULL)
2622 return NULL;
2623 v = PyTuple_New(2);
2624 if (v == NULL) {
2625 Py_DECREF(n);
2626 return NULL;
2627 }
2628
2629 switch (SSL_get_error(ssl, ret)) {
2630 case SSL_ERROR_ZERO_RETURN:
2631 errstr = "TLS/SSL connection has been closed";
2632 break;
2633 case SSL_ERROR_WANT_READ:
2634 errstr = "The operation did not complete (read)";
2635 break;
2636 case SSL_ERROR_WANT_WRITE:
2637 errstr = "The operation did not complete (write)";
2638 break;
2639 case SSL_ERROR_WANT_X509_LOOKUP:
2640 errstr = "The operation did not complete (X509 lookup)";
2641 break;
2642 case SSL_ERROR_SYSCALL:
2643 case SSL_ERROR_SSL:
2644 {
2645 unsigned long e = ERR_get_error();
2646 if (e == 0) {
2647 /* an EOF was observed that violates the protocol */
2648 errstr = "EOF occurred in violation of protocol";
2649 } else if (e == -1) {
2650 /* the underlying BIO reported an I/O error */
2651 Py_DECREF(v);
2652 Py_DECREF(n);
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +00002653 return PySocket_Err();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002654 } else {
2655 /* XXX Protected by global interpreter lock */
2656 errstr = ERR_error_string(e, NULL);
2657 }
2658 break;
2659 }
2660 default:
2661 errstr = "Invalid error code";
2662 }
2663 s = PyString_FromString(errstr);
2664 if (s == NULL) {
2665 Py_DECREF(v);
2666 Py_DECREF(n);
2667 }
2668 PyTuple_SET_ITEM(v, 0, n);
2669 PyTuple_SET_ITEM(v, 1, s);
2670 PyErr_SetObject(PySSLErrorObject, v);
2671 return NULL;
2672}
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002673
2674/* This is a C function to be called for new object initialization */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002675static PySSLObject *
2676newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002677{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002678 PySSLObject *self;
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002679 char *errstr = NULL;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002680 int ret;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002681
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002682 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002683 if (self == NULL){
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002684 errstr = "newPySSLObject error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002685 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002686 }
Jeremy Hyltonba699362001-10-11 17:23:34 +00002687 memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
2688 memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002689 self->server_cert = NULL;
2690 self->ssl = NULL;
2691 self->ctx = NULL;
2692 self->Socket = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002693
Jeremy Hylton22738b92001-10-10 22:37:48 +00002694 if ((key_file && !cert_file) || (!key_file && cert_file)) {
2695 errstr = "Both the key & certificate files must be specified";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002696 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002697 }
2698
Jeremy Hylton22738b92001-10-10 22:37:48 +00002699 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2700 if (self->ctx == NULL) {
2701 errstr = "SSL_CTX_new error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002702 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002703 }
2704
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002705 if (key_file) {
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002706 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002707 SSL_FILETYPE_PEM) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002708 errstr = "SSL_CTX_use_PrivateKey_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002709 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002710 }
2711
2712 if (SSL_CTX_use_certificate_chain_file(self->ctx,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002713 cert_file) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002714 errstr = "SSL_CTX_use_certificate_chain_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002715 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002716 }
2717 }
2718
2719 SSL_CTX_set_verify(self->ctx,
2720 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2721 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2722 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2723 SSL_set_connect_state(self->ssl);
2724
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002725 /* Actually negotiate SSL connection */
2726 /* XXX If SSL_connect() returns 0, it's also a failure. */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002727 ret = SSL_connect(self->ssl);
2728 if (ret <= 0) {
2729 PySSL_SetError(self->ssl, ret);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002730 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002731 }
2732 self->ssl->debug = 1;
2733
2734 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2735 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002736 self->server, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002737 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002738 self->issuer, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002739 }
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002740 self->Socket = Sock;
2741 Py_INCREF(self->Socket);
2742 return self;
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002743 fail:
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002744 if (errstr)
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002745 PyErr_SetString(PySSLErrorObject, errstr);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002746 Py_DECREF(self);
2747 return NULL;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002748}
2749
2750/* This is the Python function called for new object initialization */
2751static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002752PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002753{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002754 PySSLObject *rv;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002755 PySocketSockObject *Sock;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002756 char *key_file = NULL;
2757 char *cert_file = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002758
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002759 if (!PyArg_ParseTuple(args, "O!|zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002760 &PySocketSock_Type, (PyObject*)&Sock,
Jeremy Hyltonab006452001-10-10 03:33:24 +00002761 &key_file, &cert_file))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002762 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002763
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002764 rv = newPySSLObject(Sock, key_file, cert_file);
Jeremy Hyltonab006452001-10-10 03:33:24 +00002765 if (rv == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002766 return NULL;
2767 return (PyObject *)rv;
2768}
2769
2770static char ssl_doc[] =
Jeremy Hyltonba699362001-10-11 17:23:34 +00002771"ssl(socket, [keyfile, certfile]) -> sslobject";
2772
2773/* SSL object methods */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002774
2775static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002776PySSL_server(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002777{
2778 return PyString_FromString(self->server);
2779}
2780
2781static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002782PySSL_issuer(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002783{
2784 return PyString_FromString(self->issuer);
2785}
2786
2787
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002788static void PySSL_dealloc(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002789{
2790 if (self->server_cert) /* Possible not to have one? */
2791 X509_free (self->server_cert);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002792 if (self->ssl)
2793 SSL_free(self->ssl);
2794 if (self->ctx)
2795 SSL_CTX_free(self->ctx);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002796 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002797 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002798}
2799
Jeremy Hyltonba699362001-10-11 17:23:34 +00002800static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
2801{
2802 char *data;
2803 int len;
2804
2805 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
2806 return NULL;
2807
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002808 Py_BEGIN_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002809 len = SSL_write(self->ssl, data, len);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002810 Py_END_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002811 if (len > 0)
2812 return PyInt_FromLong(len);
2813 else
2814 return PySSL_SetError(self->ssl, len);
2815}
2816
2817static char PySSL_SSLwrite_doc[] =
2818"write(s) -> len\n\
2819\n\
2820Writes the string s into the SSL object. Returns the number\n\
2821of bytes written.";
2822
2823static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
2824{
2825 PyObject *buf;
2826 int count = 0;
2827 int len = 1024;
2828
2829 if (!PyArg_ParseTuple(args, "|i:read", &len))
2830 return NULL;
2831
2832 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2833 return NULL;
2834
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002835 Py_BEGIN_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002836 count = SSL_read(self->ssl, PyString_AsString(buf), len);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002837 Py_END_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002838 if (count <= 0) {
2839 Py_DECREF(buf);
2840 return PySSL_SetError(self->ssl, count);
2841 }
2842 if (count != len && _PyString_Resize(&buf, count) < 0)
2843 return NULL;
2844 return buf;
2845}
2846
2847static char PySSL_SSLread_doc[] =
2848"read([len]) -> string\n\
2849\n\
2850Read up to len bytes from the SSL socket.";
2851
2852static PyMethodDef PySSLMethods[] = {
2853 {"write", (PyCFunction)PySSL_SSLwrite, 1,
2854 PySSL_SSLwrite_doc},
2855 {"read", (PyCFunction)PySSL_SSLread, 1,
2856 PySSL_SSLread_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00002857 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
2858 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Jeremy Hyltonba699362001-10-11 17:23:34 +00002859 {NULL, NULL}
2860};
2861
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002862static PyObject *PySSL_getattr(PySSLObject *self, char *name)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002863{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002864 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002865}
2866
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002867staticforward PyTypeObject PySSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002868 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002869 0, /*ob_size*/
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002870 "SSL", /*tp_name*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002871 sizeof(PySSLObject), /*tp_basicsize*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002872 0, /*tp_itemsize*/
2873 /* methods */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002874 (destructor)PySSL_dealloc, /*tp_dealloc*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002875 0, /*tp_print*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002876 (getattrfunc)PySSL_getattr, /*tp_getattr*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002877 0, /*tp_setattr*/
2878 0, /*tp_compare*/
2879 0, /*tp_repr*/
2880 0, /*tp_as_number*/
2881 0, /*tp_as_sequence*/
2882 0, /*tp_as_mapping*/
2883 0, /*tp_hash*/
2884};
2885
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002886/* helper routines for seeding the SSL PRNG */
2887static PyObject *
2888PySSL_RAND_add(PyObject *self, PyObject *args)
2889{
2890 char *buf;
2891 int len;
2892 double entropy;
2893
2894 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
2895 return NULL;
2896 RAND_add(buf, len, entropy);
2897 Py_INCREF(Py_None);
2898 return Py_None;
2899}
2900
2901static char PySSL_RAND_add_doc[] =
2902"RAND_add(string, entropy)\n\
2903\n\
2904Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
2905bound on the entropy contained in string.";
2906
2907static PyObject *
2908PySSL_RAND_status(PyObject *self)
2909{
2910 return PyInt_FromLong(RAND_status());
2911}
2912
2913static char PySSL_RAND_status_doc[] =
2914"RAND_status() -> 0 or 1\n\
2915\n\
2916Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
2917It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
2918using the ssl() function.";
2919
2920static PyObject *
2921PySSL_RAND_egd(PyObject *self, PyObject *arg)
2922{
2923 int bytes;
2924
2925 if (!PyString_Check(arg))
2926 return PyErr_Format(PyExc_TypeError,
2927 "RAND_egd() expected string, found %s",
2928 arg->ob_type->tp_name);
2929 bytes = RAND_egd(PyString_AS_STRING(arg));
2930 if (bytes == -1) {
2931 PyErr_SetString(PySSLErrorObject,
2932 "EGD connection failed or EGD did not return "
2933 "enough data to seed the PRNG");
2934 return NULL;
2935 }
2936 return PyInt_FromLong(bytes);
2937}
2938
2939static char PySSL_RAND_egd_doc[] =
Guido van Rossumcad8fa12001-10-19 12:40:40 +00002940"RAND_egd(path) -> bytes\n\
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002941\n\
2942Queries the entropy gather daemon (EGD) on socket path. Returns number\n\
2943of bytes read. Raises socket.sslerror if connection to EGD fails or\n\
2944if it does provide enough data to seed PRNG.";
2945
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002946#endif /* USE_SSL */
2947
2948
Guido van Rossum30a685f1991-06-27 15:51:29 +00002949/* List of functions exported by this module. */
2950
Guido van Rossum73624e91994-10-10 17:59:00 +00002951static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002952 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002953 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002954 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002955 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002956 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002957 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002958 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002959 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002960 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002961 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002962 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002963 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002964#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002965 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002966 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002967#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002968 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002969 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002970 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002971 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002972 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002973 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002974 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002975 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002976 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002977 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002978 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002979 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002980 {"getaddrinfo", PySocket_getaddrinfo,
2981 METH_VARARGS, getaddrinfo_doc},
2982 {"getnameinfo", PySocket_getnameinfo,
2983 METH_VARARGS, getnameinfo_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002984#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002985 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002986 METH_VARARGS, ssl_doc},
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002987 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
2988 PySSL_RAND_add_doc},
2989 {"RAND_egd", PySSL_RAND_egd, METH_O,
2990 PySSL_RAND_egd_doc},
2991 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
2992 PySSL_RAND_status_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002993#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002994 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002995};
2996
Guido van Rossum30a685f1991-06-27 15:51:29 +00002997
2998/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002999 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003000 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00003001 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003002static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00003003insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003004{
Guido van Rossum73624e91994-10-10 17:59:00 +00003005 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00003006 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003007 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00003008
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003009 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003010}
3011
Guido van Rossum30a685f1991-06-27 15:51:29 +00003012
Guido van Rossum8d665e61996-06-26 18:22:49 +00003013#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00003014
3015/* Additional initialization and cleanup for NT/Windows */
3016
3017static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003018NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003019{
3020 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003021}
3022
3023static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003024NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003025{
3026 WSADATA WSAData;
3027 int ret;
3028 char buf[100];
3029 ret = WSAStartup(0x0101, &WSAData);
3030 switch (ret) {
3031 case 0: /* no error */
3032 atexit(NTcleanup);
3033 return 1;
3034 case WSASYSNOTREADY:
3035 PyErr_SetString(PyExc_ImportError,
3036 "WSAStartup failed: network not ready");
3037 break;
3038 case WSAVERNOTSUPPORTED:
3039 case WSAEINVAL:
3040 PyErr_SetString(PyExc_ImportError,
3041 "WSAStartup failed: requested version not supported");
3042 break;
3043 default:
3044 sprintf(buf, "WSAStartup failed: error code %d", ret);
3045 PyErr_SetString(PyExc_ImportError, buf);
3046 break;
3047 }
3048 return 0;
3049}
3050
Guido van Rossum8d665e61996-06-26 18:22:49 +00003051#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003052
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003053#if defined(PYOS_OS2)
3054
3055/* Additional initialization and cleanup for OS/2 */
3056
3057static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003058OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003059{
3060 /* No cleanup is necessary for OS/2 Sockets */
3061}
3062
3063static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00003064OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003065{
3066 char reason[64];
3067 int rc = sock_init();
3068
3069 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00003070 atexit(OS2cleanup);
3071 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003072 }
3073
3074 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
3075 PyErr_SetString(PyExc_ImportError, reason);
3076
Guido van Rossum32c575d1997-12-02 20:37:32 +00003077 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003078}
3079
3080#endif /* PYOS_OS2 */
3081
Guido van Rossum30a685f1991-06-27 15:51:29 +00003082/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003083 * This is called when the first 'import socket' is done,
3084 * via a table in config.c, if config.c is compiled with USE_SOCKET
3085 * defined.
3086 *
3087 * For MS_WINDOWS (which means any Windows variant), this module
3088 * is actually called "_socket", and there's a wrapper "socket.py"
3089 * which implements some missing functionality (such as makefile(),
3090 * dup() and fromfd()). The import of "_socket" may fail with an
3091 * ImportError exception if initialization of WINSOCK fails. When
3092 * WINSOCK is initialized succesfully, a call to WSACleanup() is
3093 * scheduled to be made at exit time.
3094 *
3095 * For OS/2, this module is also called "_socket" and uses a wrapper
3096 * "socket.py" which implements that functionality that is missing
3097 * when PC operating systems don't put socket descriptors in the
3098 * operating system's filesystem layer.
3099 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003100
Guido van Rossum82a5c661998-07-07 20:45:43 +00003101static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00003102"Implementation module for socket operations. See the socket module\n\
3103for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00003104
Guido van Rossum3886bb61998-12-04 18:50:17 +00003105DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003106init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003107{
Guido van Rossum73624e91994-10-10 17:59:00 +00003108 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003109#ifdef RISCOS
3110 _kernel_swi_regs r;
3111 r.r[0]=0;
3112 _kernel_swi(0x43380, &r, &r);
3113 taskwindow = r.r[0];
3114#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00003115#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00003116 if (!NTinit())
3117 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00003118#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00003119#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003120 if (!OS2init())
3121 return;
Fred Drakea136d492000-08-16 14:18:30 +00003122#endif /* __TOS_OS2__ */
3123#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00003124#endif /* RISCOS */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003125 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossuma120ffc2001-01-22 15:29:14 +00003126#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003127 PySSL_Type.ob_type = &PyType_Type;
Guido van Rossuma120ffc2001-01-22 15:29:14 +00003128#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00003129 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00003130 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003131 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
3132 if (PySocket_Error == NULL)
3133 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003134 PyDict_SetItemString(d, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003135 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
3136 if (PyH_Error == NULL)
3137 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003138 PyDict_SetItemString(d, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003139 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
3140 NULL);
3141 if (PyGAI_Error == NULL)
3142 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003143 PyDict_SetItemString(d, "gaierror", PyGAI_Error);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003144#ifdef USE_SSL
3145 SSL_load_error_strings();
3146 SSLeay_add_ssl_algorithms();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003147 PySSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
3148 if (PySSLErrorObject == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003149 return;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003150 PyDict_SetItemString(d, "sslerror", PySSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003151 if (PyDict_SetItemString(d, "SSLType",
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003152 (PyObject *)&PySSL_Type) != 0)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003153 return;
Jeremy Hylton57ca8732001-10-11 00:00:17 +00003154 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
3155 SSL_ERROR_ZERO_RETURN);
3156 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
3157 SSL_ERROR_WANT_READ);
3158 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
3159 SSL_ERROR_WANT_WRITE);
3160 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
3161 SSL_ERROR_WANT_X509_LOOKUP);
3162 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
3163 SSL_ERROR_SYSCALL);
3164 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
3165 SSL_ERROR_SSL);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003166#endif /* USE_SSL */
Guido van Rossum91ba64d1997-06-02 22:18:09 +00003167 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00003168 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003169 return;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003170 if (PyDict_SetItemString(d, "socket",
3171 (PyObject *)&PySocketSock_Type) != 0)
3172 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003173
3174 /* Address families (we only support AF_INET and AF_UNIX) */
3175#ifdef AF_UNSPEC
3176 insint(d, "AF_UNSPEC", AF_UNSPEC);
3177#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003178 insint(d, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003179#ifdef AF_INET6
3180 insint(d, "AF_INET6", AF_INET6);
3181#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003182#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003183 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003184#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003185#ifdef AF_AX25
3186 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
3187#endif
3188#ifdef AF_IPX
3189 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
3190#endif
3191#ifdef AF_APPLETALK
3192 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
3193#endif
3194#ifdef AF_NETROM
3195 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
3196#endif
3197#ifdef AF_BRIDGE
3198 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
3199#endif
3200#ifdef AF_AAL5
3201 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
3202#endif
3203#ifdef AF_X25
3204 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
3205#endif
3206#ifdef AF_INET6
3207 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
3208#endif
3209#ifdef AF_ROSE
3210 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
3211#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003212#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00003213 insint(d, "AF_PACKET", AF_PACKET);
3214 insint(d, "PF_PACKET", PF_PACKET);
3215 insint(d, "PACKET_HOST", PACKET_HOST);
3216 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
3217 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
3218 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3219 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
3220 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3221 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003222#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003223
3224 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003225 insint(d, "SOCK_STREAM", SOCK_STREAM);
3226 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003227#ifndef __BEOS__
3228/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003229 insint(d, "SOCK_RAW", SOCK_RAW);
3230 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3231 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003232#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003233
3234#ifdef SO_DEBUG
3235 insint(d, "SO_DEBUG", SO_DEBUG);
3236#endif
3237#ifdef SO_ACCEPTCONN
3238 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
3239#endif
3240#ifdef SO_REUSEADDR
3241 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
3242#endif
3243#ifdef SO_KEEPALIVE
3244 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
3245#endif
3246#ifdef SO_DONTROUTE
3247 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
3248#endif
3249#ifdef SO_BROADCAST
3250 insint(d, "SO_BROADCAST", SO_BROADCAST);
3251#endif
3252#ifdef SO_USELOOPBACK
3253 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
3254#endif
3255#ifdef SO_LINGER
3256 insint(d, "SO_LINGER", SO_LINGER);
3257#endif
3258#ifdef SO_OOBINLINE
3259 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
3260#endif
3261#ifdef SO_REUSEPORT
3262 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
3263#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003264#ifdef SO_SNDBUF
3265 insint(d, "SO_SNDBUF", SO_SNDBUF);
3266#endif
3267#ifdef SO_RCVBUF
3268 insint(d, "SO_RCVBUF", SO_RCVBUF);
3269#endif
3270#ifdef SO_SNDLOWAT
3271 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
3272#endif
3273#ifdef SO_RCVLOWAT
3274 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
3275#endif
3276#ifdef SO_SNDTIMEO
3277 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
3278#endif
3279#ifdef SO_RCVTIMEO
3280 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
3281#endif
3282#ifdef SO_ERROR
3283 insint(d, "SO_ERROR", SO_ERROR);
3284#endif
3285#ifdef SO_TYPE
3286 insint(d, "SO_TYPE", SO_TYPE);
3287#endif
3288
3289 /* Maximum number of connections for "listen" */
3290#ifdef SOMAXCONN
3291 insint(d, "SOMAXCONN", SOMAXCONN);
3292#else
3293 insint(d, "SOMAXCONN", 5); /* Common value */
3294#endif
3295
3296 /* Flags for send, recv */
3297#ifdef MSG_OOB
3298 insint(d, "MSG_OOB", MSG_OOB);
3299#endif
3300#ifdef MSG_PEEK
3301 insint(d, "MSG_PEEK", MSG_PEEK);
3302#endif
3303#ifdef MSG_DONTROUTE
3304 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
3305#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003306#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00003307 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003308#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003309#ifdef MSG_EOR
3310 insint(d, "MSG_EOR", MSG_EOR);
3311#endif
3312#ifdef MSG_TRUNC
3313 insint(d, "MSG_TRUNC", MSG_TRUNC);
3314#endif
3315#ifdef MSG_CTRUNC
3316 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
3317#endif
3318#ifdef MSG_WAITALL
3319 insint(d, "MSG_WAITALL", MSG_WAITALL);
3320#endif
3321#ifdef MSG_BTAG
3322 insint(d, "MSG_BTAG", MSG_BTAG);
3323#endif
3324#ifdef MSG_ETAG
3325 insint(d, "MSG_ETAG", MSG_ETAG);
3326#endif
3327
3328 /* Protocol level and numbers, usable for [gs]etsockopt */
3329#ifdef SOL_SOCKET
3330 insint(d, "SOL_SOCKET", SOL_SOCKET);
3331#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003332#ifdef SOL_IP
3333 insint(d, "SOL_IP", SOL_IP);
3334#else
3335 insint(d, "SOL_IP", 0);
3336#endif
3337#ifdef SOL_IPX
3338 insint(d, "SOL_IPX", SOL_IPX);
3339#endif
3340#ifdef SOL_AX25
3341 insint(d, "SOL_AX25", SOL_AX25);
3342#endif
3343#ifdef SOL_ATALK
3344 insint(d, "SOL_ATALK", SOL_ATALK);
3345#endif
3346#ifdef SOL_NETROM
3347 insint(d, "SOL_NETROM", SOL_NETROM);
3348#endif
3349#ifdef SOL_ROSE
3350 insint(d, "SOL_ROSE", SOL_ROSE);
3351#endif
3352#ifdef SOL_TCP
3353 insint(d, "SOL_TCP", SOL_TCP);
3354#else
3355 insint(d, "SOL_TCP", 6);
3356#endif
3357#ifdef SOL_UDP
3358 insint(d, "SOL_UDP", SOL_UDP);
3359#else
3360 insint(d, "SOL_UDP", 17);
3361#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003362#ifdef IPPROTO_IP
3363 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003364#else
3365 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003366#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003367#ifdef IPPROTO_HOPOPTS
3368 insint(d, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
3369#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003370#ifdef IPPROTO_ICMP
3371 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003372#else
3373 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003374#endif
3375#ifdef IPPROTO_IGMP
3376 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
3377#endif
3378#ifdef IPPROTO_GGP
3379 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
3380#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003381#ifdef IPPROTO_IPV4
3382 insint(d, "IPPROTO_IPV4", IPPROTO_IPV4);
3383#endif
3384#ifdef IPPROTO_IPIP
3385 insint(d, "IPPROTO_IPIP", IPPROTO_IPIP);
3386#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003387#ifdef IPPROTO_TCP
3388 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003389#else
3390 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003391#endif
3392#ifdef IPPROTO_EGP
3393 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
3394#endif
3395#ifdef IPPROTO_PUP
3396 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
3397#endif
3398#ifdef IPPROTO_UDP
3399 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003400#else
3401 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003402#endif
3403#ifdef IPPROTO_IDP
3404 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
3405#endif
3406#ifdef IPPROTO_HELLO
3407 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
3408#endif
3409#ifdef IPPROTO_ND
3410 insint(d, "IPPROTO_ND", IPPROTO_ND);
3411#endif
3412#ifdef IPPROTO_TP
3413 insint(d, "IPPROTO_TP", IPPROTO_TP);
3414#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003415#ifdef IPPROTO_IPV6
3416 insint(d, "IPPROTO_IPV6", IPPROTO_IPV6);
3417#endif
3418#ifdef IPPROTO_ROUTING
3419 insint(d, "IPPROTO_ROUTING", IPPROTO_ROUTING);
3420#endif
3421#ifdef IPPROTO_FRAGMENT
3422 insint(d, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
3423#endif
3424#ifdef IPPROTO_RSVP
3425 insint(d, "IPPROTO_RSVP", IPPROTO_RSVP);
3426#endif
3427#ifdef IPPROTO_GRE
3428 insint(d, "IPPROTO_GRE", IPPROTO_GRE);
3429#endif
3430#ifdef IPPROTO_ESP
3431 insint(d, "IPPROTO_ESP", IPPROTO_ESP);
3432#endif
3433#ifdef IPPROTO_AH
3434 insint(d, "IPPROTO_AH", IPPROTO_AH);
3435#endif
3436#ifdef IPPROTO_MOBILE
3437 insint(d, "IPPROTO_MOBILE", IPPROTO_MOBILE);
3438#endif
3439#ifdef IPPROTO_ICMPV6
3440 insint(d, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
3441#endif
3442#ifdef IPPROTO_NONE
3443 insint(d, "IPPROTO_NONE", IPPROTO_NONE);
3444#endif
3445#ifdef IPPROTO_DSTOPTS
3446 insint(d, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
3447#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003448#ifdef IPPROTO_XTP
3449 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
3450#endif
3451#ifdef IPPROTO_EON
3452 insint(d, "IPPROTO_EON", IPPROTO_EON);
3453#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003454#ifdef IPPROTO_PIM
3455 insint(d, "IPPROTO_PIM", IPPROTO_PIM);
3456#endif
3457#ifdef IPPROTO_IPCOMP
3458 insint(d, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
3459#endif
3460#ifdef IPPROTO_VRRP
3461 insint(d, "IPPROTO_VRRP", IPPROTO_VRRP);
3462#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003463#ifdef IPPROTO_BIP
3464 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
3465#endif
3466/**/
3467#ifdef IPPROTO_RAW
3468 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003469#else
3470 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003471#endif
3472#ifdef IPPROTO_MAX
3473 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
3474#endif
3475
3476 /* Some port configuration */
3477#ifdef IPPORT_RESERVED
3478 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
3479#else
3480 insint(d, "IPPORT_RESERVED", 1024);
3481#endif
3482#ifdef IPPORT_USERRESERVED
3483 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
3484#else
3485 insint(d, "IPPORT_USERRESERVED", 5000);
3486#endif
3487
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003488 /* Some reserved IP v.4 addresses */
3489#ifdef INADDR_ANY
3490 insint(d, "INADDR_ANY", INADDR_ANY);
3491#else
3492 insint(d, "INADDR_ANY", 0x00000000);
3493#endif
3494#ifdef INADDR_BROADCAST
3495 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
3496#else
3497 insint(d, "INADDR_BROADCAST", 0xffffffff);
3498#endif
3499#ifdef INADDR_LOOPBACK
3500 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
3501#else
3502 insint(d, "INADDR_LOOPBACK", 0x7F000001);
3503#endif
3504#ifdef INADDR_UNSPEC_GROUP
3505 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
3506#else
3507 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
3508#endif
3509#ifdef INADDR_ALLHOSTS_GROUP
3510 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
3511#else
3512 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
3513#endif
3514#ifdef INADDR_MAX_LOCAL_GROUP
3515 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
3516#else
3517 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
3518#endif
3519#ifdef INADDR_NONE
3520 insint(d, "INADDR_NONE", INADDR_NONE);
3521#else
3522 insint(d, "INADDR_NONE", 0xffffffff);
3523#endif
3524
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003525 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003526#ifdef IP_OPTIONS
3527 insint(d, "IP_OPTIONS", IP_OPTIONS);
3528#endif
3529#ifdef IP_HDRINCL
3530 insint(d, "IP_HDRINCL", IP_HDRINCL);
3531#endif
3532#ifdef IP_TOS
3533 insint(d, "IP_TOS", IP_TOS);
3534#endif
3535#ifdef IP_TTL
3536 insint(d, "IP_TTL", IP_TTL);
3537#endif
3538#ifdef IP_RECVOPTS
3539 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
3540#endif
3541#ifdef IP_RECVRETOPTS
3542 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
3543#endif
3544#ifdef IP_RECVDSTADDR
3545 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
3546#endif
3547#ifdef IP_RETOPTS
3548 insint(d, "IP_RETOPTS", IP_RETOPTS);
3549#endif
3550#ifdef IP_MULTICAST_IF
3551 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
3552#endif
3553#ifdef IP_MULTICAST_TTL
3554 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
3555#endif
3556#ifdef IP_MULTICAST_LOOP
3557 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
3558#endif
3559#ifdef IP_ADD_MEMBERSHIP
3560 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
3561#endif
3562#ifdef IP_DROP_MEMBERSHIP
3563 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
3564#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003565#ifdef IP_DEFAULT_MULTICAST_TTL
3566 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
3567#endif
3568#ifdef IP_DEFAULT_MULTICAST_LOOP
3569 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
3570#endif
3571#ifdef IP_MAX_MEMBERSHIPS
3572 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
3573#endif
3574
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003575 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3576#ifdef IPV6_JOIN_GROUP
3577 insint(d, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
3578#endif
3579#ifdef IPV6_LEAVE_GROUP
3580 insint(d, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
3581#endif
3582#ifdef IPV6_MULTICAST_HOPS
3583 insint(d, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
3584#endif
3585#ifdef IPV6_MULTICAST_IF
3586 insint(d, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
3587#endif
3588#ifdef IPV6_MULTICAST_LOOP
3589 insint(d, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
3590#endif
3591#ifdef IPV6_UNICAST_HOPS
3592 insint(d, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
3593#endif
3594
Guido van Rossum09be4091999-08-09 14:40:40 +00003595 /* TCP options */
3596#ifdef TCP_NODELAY
3597 insint(d, "TCP_NODELAY", TCP_NODELAY);
3598#endif
3599#ifdef TCP_MAXSEG
3600 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
3601#endif
3602
3603 /* IPX options */
3604#ifdef IPX_TYPE
3605 insint(d, "IPX_TYPE", IPX_TYPE);
3606#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003607
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003608 /* get{addr,name}info parameters */
3609#ifdef EAI_ADDRFAMILY
3610 insint(d, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
3611#endif
3612#ifdef EAI_AGAIN
3613 insint(d, "EAI_AGAIN", EAI_AGAIN);
3614#endif
3615#ifdef EAI_BADFLAGS
3616 insint(d, "EAI_BADFLAGS", EAI_BADFLAGS);
3617#endif
3618#ifdef EAI_FAIL
3619 insint(d, "EAI_FAIL", EAI_FAIL);
3620#endif
3621#ifdef EAI_FAMILY
3622 insint(d, "EAI_FAMILY", EAI_FAMILY);
3623#endif
3624#ifdef EAI_MEMORY
3625 insint(d, "EAI_MEMORY", EAI_MEMORY);
3626#endif
3627#ifdef EAI_NODATA
3628 insint(d, "EAI_NODATA", EAI_NODATA);
3629#endif
3630#ifdef EAI_NONAME
3631 insint(d, "EAI_NONAME", EAI_NONAME);
3632#endif
3633#ifdef EAI_SERVICE
3634 insint(d, "EAI_SERVICE", EAI_SERVICE);
3635#endif
3636#ifdef EAI_SOCKTYPE
3637 insint(d, "EAI_SOCKTYPE", EAI_SOCKTYPE);
3638#endif
3639#ifdef EAI_SYSTEM
3640 insint(d, "EAI_SYSTEM", EAI_SYSTEM);
3641#endif
3642#ifdef EAI_BADHINTS
3643 insint(d, "EAI_BADHINTS", EAI_BADHINTS);
3644#endif
3645#ifdef EAI_PROTOCOL
3646 insint(d, "EAI_PROTOCOL", EAI_PROTOCOL);
3647#endif
3648#ifdef EAI_MAX
3649 insint(d, "EAI_MAX", EAI_MAX);
3650#endif
3651#ifdef AI_PASSIVE
3652 insint(d, "AI_PASSIVE", AI_PASSIVE);
3653#endif
3654#ifdef AI_CANONNAME
3655 insint(d, "AI_CANONNAME", AI_CANONNAME);
3656#endif
3657#ifdef AI_NUMERICHOST
3658 insint(d, "AI_NUMERICHOST", AI_NUMERICHOST);
3659#endif
3660#ifdef AI_MASK
3661 insint(d, "AI_MASK", AI_MASK);
3662#endif
3663#ifdef AI_ALL
3664 insint(d, "AI_ALL", AI_ALL);
3665#endif
3666#ifdef AI_V4MAPPED_CFG
3667 insint(d, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
3668#endif
3669#ifdef AI_ADDRCONFIG
3670 insint(d, "AI_ADDRCONFIG", AI_ADDRCONFIG);
3671#endif
3672#ifdef AI_V4MAPPED
3673 insint(d, "AI_V4MAPPED", AI_V4MAPPED);
3674#endif
3675#ifdef AI_DEFAULT
3676 insint(d, "AI_DEFAULT", AI_DEFAULT);
3677#endif
3678#ifdef NI_MAXHOST
3679 insint(d, "NI_MAXHOST", NI_MAXHOST);
3680#endif
3681#ifdef NI_MAXSERV
3682 insint(d, "NI_MAXSERV", NI_MAXSERV);
3683#endif
3684#ifdef NI_NOFQDN
3685 insint(d, "NI_NOFQDN", NI_NOFQDN);
3686#endif
3687#ifdef NI_NUMERICHOST
3688 insint(d, "NI_NUMERICHOST", NI_NUMERICHOST);
3689#endif
3690#ifdef NI_NAMEREQD
3691 insint(d, "NI_NAMEREQD", NI_NAMEREQD);
3692#endif
3693#ifdef NI_NUMERICSERV
3694 insint(d, "NI_NUMERICSERV", NI_NUMERICSERV);
3695#endif
3696#ifdef NI_DGRAM
3697 insint(d, "NI_DGRAM", NI_DGRAM);
3698#endif
3699
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003700 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003701#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003702 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003703#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003704}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003705
3706/* Simplistic emulation code for inet_pton that only works for IPv4 */
3707#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003708int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003709inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003710{
3711 if(af == AF_INET){
3712 long packed_addr;
3713#ifdef USE_GUSI1
3714 packed_addr = (long)inet_addr(src).s_addr;
3715#else
3716 packed_addr = inet_addr(src);
3717#endif
3718 if (packed_addr == INADDR_NONE)
3719 return 0;
3720 memcpy(dst, &packed_addr, 4);
3721 return 1;
3722 }
3723 /* Should set errno to EAFNOSUPPORT */
3724 return -1;
3725}
3726
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003727const char *
3728inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003729{
3730 if (af == AF_INET) {
3731 struct in_addr packed_addr;
3732 if (size < 16)
3733 /* Should set errno to ENOSPC. */
3734 return NULL;
3735 memcpy(&packed_addr, src, sizeof(packed_addr));
3736 return strncpy(dst, inet_ntoa(packed_addr), size);
3737 }
3738 /* Should set errno to EAFNOSUPPORT */
3739 return NULL;
3740}
3741#endif