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