blob: 4890b73a27519ff0fafbd87ead4ae6be351b1446 [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 Rossum81194471991-07-27 21:42:02 +000012- no read/write operations (use send/recv or makefile instead)
Guido van Rossumbe32c891996-06-20 16:25:29 +000013- additional restrictions apply on Windows
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 Rossum9376b741999-09-15 22:01:40 +000080/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
81 script doesn't get this right, so we hardcode some platform checks below.
82 On the other hand, not all Linux versions agree, so there the settings
83 computed by the configure script are needed! */
84
85#ifndef linux
Guido van Rossume7de2061999-03-24 17:24:33 +000086#undef HAVE_GETHOSTBYNAME_R_3_ARG
87#undef HAVE_GETHOSTBYNAME_R_5_ARG
88#undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +000089#endif
Guido van Rossume7de2061999-03-24 17:24:33 +000090
Guido van Rossum7a122991999-04-13 04:07:32 +000091#ifndef WITH_THREAD
92#undef HAVE_GETHOSTBYNAME_R
93#endif
94
Guido van Rossume7de2061999-03-24 17:24:33 +000095#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +000096#if defined(_AIX) || defined(__osf__)
Guido van Rossume7de2061999-03-24 17:24:33 +000097#define HAVE_GETHOSTBYNAME_R_3_ARG
Martin v. Löwis1c07b4b2001-10-13 09:00:42 +000098#elif defined(__sun) || defined(__sgi)
Guido van Rossume7de2061999-03-24 17:24:33 +000099#define HAVE_GETHOSTBYNAME_R_5_ARG
100#elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000101/* Rely on the configure script */
Guido van Rossume7de2061999-03-24 17:24:33 +0000102#else
103#undef HAVE_GETHOSTBYNAME_R
104#endif
105#endif
106
Guido van Rossum3baaa131999-03-22 21:44:51 +0000107#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
108#define USE_GETHOSTBYNAME_LOCK
109#endif
110
111#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum49b56061998-10-01 20:42:43 +0000112#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000113#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000114
Guido van Rossuma376cc51996-12-05 23:43:35 +0000115#ifdef HAVE_UNISTD_H
116#include <unistd.h>
117#endif
118
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000119#if defined(PYCC_VACPP)
120#include <types.h>
121#include <io.h>
122#include <sys/ioctl.h>
123#include <utils.h>
124#include <ctype.h>
125#endif
126
127#if defined(PYOS_OS2)
128#define INCL_DOS
129#define INCL_DOSERRORS
130#define INCL_NOPMAPI
131#include <os2.h>
132#endif
133
Guido van Rossum48a680c2001-03-02 06:34:14 +0000134
Guido van Rossumb6775db1994-08-01 11:34:53 +0000135#include <sys/types.h>
Guido van Rossumed233a51992-06-23 09:07:03 +0000136
Guido van Rossum81194471991-07-27 21:42:02 +0000137#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000138#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000139#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000140#include <sys/socket.h>
141#include <netinet/in.h>
Fred Drake51d90362000-10-06 15:37:06 +0000142#if !(defined(__BEOS__) || defined(__CYGWIN__))
Andrew M. Kuchling52a644c2000-03-31 17:24:30 +0000143#include <netinet/tcp.h>
Fred Drake11b09362000-05-16 13:30:12 +0000144#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000145
Guido van Rossum9376b741999-09-15 22:01:40 +0000146/* Headers needed for inet_ntoa() and inet_addr() */
147#ifdef __BEOS__
148#include <net/netdb.h>
149#else
Guido van Rossumff3ab422000-04-24 15:16:03 +0000150#ifndef USE_GUSI1
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000151#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000152#endif
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000153#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000154
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000155#ifndef RISCOS
Guido van Rossume4485b01994-09-07 14:32:49 +0000156#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000157#else
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000158#include <sys/fcntl.h>
159#define NO_DUP
160int h_errno; /* not used */
161#endif
162#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000163#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000164#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000165#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000166
Guido van Rossum48a680c2001-03-02 06:34:14 +0000167
Guido van Rossumb6775db1994-08-01 11:34:53 +0000168#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000169#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000170#else
171#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000172#endif
173
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000174#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000175#include <sys/ioctl.h>
176#include <net/if.h>
177#include <netpacket/packet.h>
178#endif
179
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000180#ifdef HAVE_STDDEF_H
181#include <stddef.h>
182#endif
183
184#ifndef offsetof
185#define offsetof(type, member) ((size_t)(&((type *)0)->member))
186#endif
187
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000188#ifndef O_NDELAY
189#define O_NDELAY O_NONBLOCK /* For QNX only? */
190#endif
191
Guido van Rossumff3ab422000-04-24 15:16:03 +0000192#ifdef USE_GUSI1
Jack Jansen508537b1996-02-14 15:57:45 +0000193/* fdopen() isn't declared in stdio.h (sigh) */
194#include <GUSI.h>
195#endif
196
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000197#include "addrinfo.h"
198
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000199#ifdef USE_SSL
Andrew M. Kuchling697a0b02001-01-18 17:41:41 +0000200#include "openssl/rsa.h"
201#include "openssl/crypto.h"
202#include "openssl/x509.h"
203#include "openssl/pem.h"
204#include "openssl/ssl.h"
205#include "openssl/err.h"
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +0000206#include "openssl/rand.h"
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000207#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000208
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000209#ifndef HAVE_INET_PTON
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000210int inet_pton (int af, const char *src, void *dst);
211const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000212#endif
213
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000214#ifdef __APPLE__
215/* On OS X, getaddrinfo returns no error indication of lookup
216 failure, so we must use the emulation instead of the libinfo
217 implementation. Unfortunately, performing an autoconf test
218 for this bug would require DNS access for the machine performing
219 the configuration, which is not acceptable. Therefore, we
220 determine the bug just by checking for __APPLE__. If this bug
221 gets ever fixed, perhaps checking for sys/version.h would be
222 appropriate, which is 10/0 on the system with the bug. */
223#undef HAVE_GETADDRINFO
224/* avoid clashes with the C library definition of the symbol. */
225#define getaddrinfo fake_getaddrinfo
226#endif
227
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000228/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000229#if !defined(HAVE_GETADDRINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000230#include "getaddrinfo.c"
231#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000232#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000233#include "getnameinfo.c"
234#endif
235
Guido van Rossumbcc20741998-08-04 22:53:56 +0000236#if defined(MS_WINDOWS) || defined(__BEOS__)
237/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000238/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000239#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000240#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000241#endif
242
Fred Drakea04eaad2000-06-30 02:46:07 +0000243/* abstract the socket file descriptor type */
244#ifdef MS_WINDOWS
245typedef SOCKET SOCKET_T;
246# ifdef MS_WIN64
247# define SIZEOF_SOCKET_T 8
248# else
249# define SIZEOF_SOCKET_T 4
250# endif
251#else
252typedef int SOCKET_T;
253# define SIZEOF_SOCKET_T SIZEOF_INT
254#endif
255
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000256#ifdef MS_WIN32
257# define EAFNOSUPPORT WSAEAFNOSUPPORT
258# define snprintf _snprintf
259#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000260
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000261#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000262#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000263#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000264#endif
265
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000266#ifndef SOCKETCLOSE
267#define SOCKETCLOSE close
268#endif
269
Guido van Rossum30a685f1991-06-27 15:51:29 +0000270/* Global variable holding the exception type for errors detected
271 by this module (but not argument type or memory errors, etc.). */
272
Guido van Rossum73624e91994-10-10 17:59:00 +0000273static PyObject *PySocket_Error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000274static PyObject *PyH_Error;
275static PyObject *PyGAI_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000276
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000277#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000278static PyObject *PySSLErrorObject;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000279#endif /* USE_SSL */
280
Guido van Rossum30a685f1991-06-27 15:51:29 +0000281
Guido van Rossum48a680c2001-03-02 06:34:14 +0000282#ifdef RISCOS
283/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
284static int taskwindow;
285#endif
286
287
Guido van Rossum30a685f1991-06-27 15:51:29 +0000288/* Convenience function to raise an error according to errno
289 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000290
Guido van Rossum73624e91994-10-10 17:59:00 +0000291static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000292PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000293{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000294#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000295 int err_no = WSAGetLastError();
296 if (err_no) {
297 static struct { int no; const char *msg; } *msgp, msgs[] = {
298 { WSAEINTR, "Interrupted system call" },
299 { WSAEBADF, "Bad file descriptor" },
300 { WSAEACCES, "Permission denied" },
301 { WSAEFAULT, "Bad address" },
302 { WSAEINVAL, "Invalid argument" },
303 { WSAEMFILE, "Too many open files" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000304 { WSAEWOULDBLOCK,
Mark Hammond46a733d2000-07-24 01:45:11 +0000305 "The socket operation could not complete "
306 "without blocking" },
307 { WSAEINPROGRESS, "Operation now in progress" },
308 { WSAEALREADY, "Operation already in progress" },
309 { WSAENOTSOCK, "Socket operation on non-socket" },
310 { WSAEDESTADDRREQ, "Destination address required" },
311 { WSAEMSGSIZE, "Message too long" },
312 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
313 { WSAENOPROTOOPT, "Protocol not available" },
314 { WSAEPROTONOSUPPORT, "Protocol not supported" },
315 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
316 { WSAEOPNOTSUPP, "Operation not supported" },
317 { WSAEPFNOSUPPORT, "Protocol family not supported" },
318 { WSAEAFNOSUPPORT, "Address family not supported" },
319 { WSAEADDRINUSE, "Address already in use" },
320 { WSAEADDRNOTAVAIL,
321 "Can't assign requested address" },
322 { WSAENETDOWN, "Network is down" },
323 { WSAENETUNREACH, "Network is unreachable" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000324 { WSAENETRESET,
Mark Hammond46a733d2000-07-24 01:45:11 +0000325 "Network dropped connection on reset" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000326 { WSAECONNABORTED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000327 "Software caused connection abort" },
328 { WSAECONNRESET, "Connection reset by peer" },
329 { WSAENOBUFS, "No buffer space available" },
330 { WSAEISCONN, "Socket is already connected" },
331 { WSAENOTCONN, "Socket is not connected" },
332 { WSAESHUTDOWN, "Can't send after socket shutdown" },
333 { WSAETOOMANYREFS,
334 "Too many references: can't splice" },
335 { WSAETIMEDOUT, "Operation timed out" },
336 { WSAECONNREFUSED, "Connection refused" },
337 { WSAELOOP, "Too many levels of symbolic links" },
338 { WSAENAMETOOLONG, "File name too long" },
339 { WSAEHOSTDOWN, "Host is down" },
340 { WSAEHOSTUNREACH, "No route to host" },
341 { WSAENOTEMPTY, "Directory not empty" },
342 { WSAEPROCLIM, "Too many processes" },
343 { WSAEUSERS, "Too many users" },
344 { WSAEDQUOT, "Disc quota exceeded" },
345 { WSAESTALE, "Stale NFS file handle" },
346 { WSAEREMOTE, "Too many levels of remote in path" },
347 { WSASYSNOTREADY,
348 "Network subsystem is unvailable" },
349 { WSAVERNOTSUPPORTED,
350 "WinSock version is not supported" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000351 { WSANOTINITIALISED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000352 "Successful WSAStartup() not yet performed" },
353 { WSAEDISCON, "Graceful shutdown in progress" },
354 /* Resolver errors */
355 { WSAHOST_NOT_FOUND, "No such host is known" },
356 { WSATRY_AGAIN, "Host not found, or server failed" },
357 { WSANO_RECOVERY,
358 "Unexpected server error encountered" },
359 { WSANO_DATA, "Valid name without requested data" },
360 { WSANO_ADDRESS, "No address, look for MX record" },
361 { 0, NULL }
362 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000363 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000364 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000365
Mark Hammond46a733d2000-07-24 01:45:11 +0000366 for (msgp = msgs; msgp->msg; msgp++) {
367 if (err_no == msgp->no) {
368 msg = msgp->msg;
369 break;
370 }
371 }
372
373 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000374 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000375 PyErr_SetObject(PySocket_Error, v);
376 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000377 }
378 return NULL;
379 }
380 else
381#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000382
383#if defined(PYOS_OS2)
384 if (sock_errno() != NO_ERROR) {
385 APIRET rc;
386 ULONG msglen;
387 char outbuf[100];
388 int myerrorcode = sock_errno();
389
390 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
391 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
392 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
393 if (rc == NO_ERROR) {
394 PyObject *v;
395
396 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
397 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
398 char *lastc = &outbuf[ strlen(outbuf)-1 ];
399 while (lastc > outbuf && isspace(*lastc))
400 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
401 }
402 v = Py_BuildValue("(is)", myerrorcode, outbuf);
403 if (v != NULL) {
404 PyErr_SetObject(PySocket_Error, v);
405 Py_DECREF(v);
406 }
407 return NULL;
408 }
409 }
410#endif
411
Guido van Rossum73624e91994-10-10 17:59:00 +0000412 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000413}
414
Guido van Rossum30a685f1991-06-27 15:51:29 +0000415
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000416static PyObject *
417PyH_Err(int h_error)
418{
419 PyObject *v;
420
421#ifdef HAVE_HSTRERROR
422 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
423#else
424 v = Py_BuildValue("(is)", h_error, "host not found");
425#endif
426 if (v != NULL) {
Martin v. Löwis864e9ff2001-08-04 22:32:03 +0000427 PyErr_SetObject(PyH_Error, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000428 Py_DECREF(v);
429 }
430
431 return NULL;
432}
433
434
435static PyObject *
436PyGAI_Err(int error)
437{
438 PyObject *v;
439
440 if (error == EAI_SYSTEM)
441 return PySocket_Err();
442
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000443#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000444 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000445#else
446 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
447#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000448 if (v != NULL) {
449 PyErr_SetObject(PyGAI_Error, v);
450 Py_DECREF(v);
451 }
452
453 return NULL;
454}
455
456
Guido van Rossum30a685f1991-06-27 15:51:29 +0000457/* The object holding a socket. It holds some extra information,
458 like the address family, which is used to decode socket address
459 arguments properly. */
460
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000461typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000462 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000463 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000464 int sock_family; /* Address family, e.g., AF_INET */
465 int sock_type; /* Socket type, e.g., SOCK_STREAM */
466 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000467 union sock_addr {
468 struct sockaddr_in in;
469#ifdef AF_UNIX
470 struct sockaddr_un un;
471#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000472#ifdef INET6
473 struct sockaddr_in6 in6;
474 struct sockaddr_storage storage;
475#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000476#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000477 struct sockaddr_ll ll;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000478#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000479 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000480} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000481
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000482#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000483
Jeremy Hyltonba699362001-10-11 17:23:34 +0000484#define X509_NAME_MAXLEN 256
485
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000486typedef struct {
487 PyObject_HEAD
488 PySocketSockObject *Socket; /* Socket on which we're layered */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000489 SSL_CTX* ctx;
490 SSL* ssl;
491 X509* server_cert;
492 BIO* sbio;
Jeremy Hyltonba699362001-10-11 17:23:34 +0000493 char server[X509_NAME_MAXLEN];
494 char issuer[X509_NAME_MAXLEN];
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000495
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000496} PySSLObject;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000497
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000498staticforward PyTypeObject PySSL_Type;
499staticforward PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args);
500staticforward PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000501
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000502#define PySSLObject_Check(v) ((v)->ob_type == &PySSL_Type)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000503
504#endif /* USE_SSL */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000505
Guido van Rossum30a685f1991-06-27 15:51:29 +0000506/* A forward reference to the Socktype type object.
507 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000508 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000509 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000510
Guido van Rossum73624e91994-10-10 17:59:00 +0000511staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000512
Guido van Rossum30a685f1991-06-27 15:51:29 +0000513
514/* Create a new socket object.
515 This just creates the object and initializes it.
516 If the creation fails, return NULL and set an exception (implicit
517 in NEWOBJ()). */
518
Guido van Rossum73624e91994-10-10 17:59:00 +0000519static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000520PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000521{
Guido van Rossum48a680c2001-03-02 06:34:14 +0000522#ifdef RISCOS
523 int block = 1;
524#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000525 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000526 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000527 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000528 if (s != NULL) {
529 s->sock_fd = fd;
530 s->sock_family = family;
531 s->sock_type = type;
532 s->sock_proto = proto;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000533#ifdef RISCOS
534 if(taskwindow) {
535 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
536 }
537#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000538 }
539 return s;
540}
541
Guido van Rossum30a685f1991-06-27 15:51:29 +0000542
Guido van Rossum48a680c2001-03-02 06:34:14 +0000543/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000544 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000545#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000546PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000547#endif
548
549
Guido van Rossum30a685f1991-06-27 15:51:29 +0000550/* Convert a string specifying a host name or one of a few symbolic
551 names to a numeric IP address. This usually calls gethostbyname()
552 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000553 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000554 an error occurred; then an exception is raised. */
555
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000556static int
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000557setipaddr(char* name, struct sockaddr * addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000558{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000559 struct addrinfo hints, *res;
560 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000561
Guido van Rossuma376cc51996-12-05 23:43:35 +0000562 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000563 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000564 int siz;
565 memset(&hints, 0, sizeof(hints));
566 hints.ai_family = af;
567 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
568 hints.ai_flags = AI_PASSIVE;
569 error = getaddrinfo(NULL, "0", &hints, &res);
570 if (error) {
571 PyGAI_Err(error);
572 return -1;
573 }
574 switch (res->ai_family) {
575 case AF_INET:
576 siz = 4;
577 break;
578#ifdef INET6
579 case AF_INET6:
580 siz = 16;
581 break;
582#endif
583 default:
584 freeaddrinfo(res);
585 PyErr_SetString(PySocket_Error,
586 "unsupported address family");
587 return -1;
588 }
589 if (res->ai_next) {
590 PyErr_SetString(PySocket_Error,
591 "wildcard resolved to multiple address");
592 return -1;
593 }
594 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
595 freeaddrinfo(res);
596 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000597 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000598 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000599 struct sockaddr_in *sin;
600 if (af != PF_INET && af != PF_UNSPEC) {
601 PyErr_SetString(PySocket_Error,
602 "address family mismatched");
603 return -1;
604 }
605 sin = (struct sockaddr_in *)addr_ret;
606 memset((void *) sin, '\0', sizeof(*sin));
607 sin->sin_family = AF_INET;
608#ifdef HAVE_SOCKADDR_SA_LEN
609 sin->sin_len = sizeof(*sin);
610#endif
611 sin->sin_addr.s_addr = INADDR_BROADCAST;
612 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000613 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000614 memset(&hints, 0, sizeof(hints));
615 hints.ai_family = af;
616 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000617#if defined(__digital__) && defined(__unix__)
Martin v. Löwisb8fc9722001-10-24 17:35:46 +0000618 if (error == EAI_NONAME && af == AF_UNSPEC) {
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000619 /* On Tru64 V5.1, numeric-to-addr conversion
Martin v. Löwis861a65b2001-10-24 14:36:00 +0000620 fails if no address family is given. Assume IPv4 for now.*/
621 hints.ai_family = AF_INET;
622 error = getaddrinfo(name, NULL, &hints, &res);
623 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000624#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000625 if (error) {
626 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000627 return -1;
628 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000629 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
630 freeaddrinfo(res);
631 switch (addr_ret->sa_family) {
632 case AF_INET:
633 return 4;
634#ifdef INET6
635 case AF_INET6:
636 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000637#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000638 default:
639 PyErr_SetString(PySocket_Error, "unknown address family");
640 return -1;
641 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000642}
643
Guido van Rossum30a685f1991-06-27 15:51:29 +0000644
Guido van Rossum30a685f1991-06-27 15:51:29 +0000645/* Create a string object representing an IP address.
646 This is always a string of the form 'dd.dd.dd.dd' (with variable
647 size numbers). */
648
Guido van Rossum73624e91994-10-10 17:59:00 +0000649static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000650makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000651{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000652 char buf[NI_MAXHOST];
653 int error;
654
655 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
656 NI_NUMERICHOST);
657 if (error) {
658 PyGAI_Err(error);
659 return NULL;
660 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000661 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000662}
663
664
665/* Create an object representing the given socket address,
666 suitable for passing it back to bind(), connect() etc.
667 The family field of the sockaddr structure is inspected
668 to determine what kind of address it really is. */
669
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000670/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000671static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000672makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000673{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000674 if (addrlen == 0) {
675 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000676 Py_INCREF(Py_None);
677 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000678 }
679
Guido van Rossumbcc20741998-08-04 22:53:56 +0000680#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000681 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000682 addr->sa_family = AF_INET;
683#endif
684
Guido van Rossum30a685f1991-06-27 15:51:29 +0000685 switch (addr->sa_family) {
686
687 case AF_INET:
688 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000689 struct sockaddr_in *a;
690 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000691 PyObject *ret = NULL;
692 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000693 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000694 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
695 Py_DECREF(addrobj);
696 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000697 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000698 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000699
Guido van Rossumb6775db1994-08-01 11:34:53 +0000700#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000701 case AF_UNIX:
702 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000703 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000704 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000705 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000706#endif /* AF_UNIX */
707
708#ifdef INET6
709 case AF_INET6:
710 {
711 struct sockaddr_in6 *a;
712 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
713 PyObject *ret = NULL;
714 if (addrobj) {
715 a = (struct sockaddr_in6 *)addr;
716 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
717 a->sin6_flowinfo, a->sin6_scope_id);
718 Py_DECREF(addrobj);
719 }
720 return ret;
721 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000722#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000723
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000724#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000725 case AF_PACKET:
726 {
727 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
728 char *ifname = "";
729 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000730 /* need to look up interface name give index */
731 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000732 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000733 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000734 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000735 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000736 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000737 a->sll_pkttype, a->sll_hatype,
738 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000739 }
740#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000741
Guido van Rossum30a685f1991-06-27 15:51:29 +0000742 /* More cases here... */
743
744 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000745 /* If we don't know the address family, don't raise an
746 exception -- return it as a tuple. */
747 return Py_BuildValue("is#",
748 addr->sa_family,
749 addr->sa_data,
750 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000751
Guido van Rossum30a685f1991-06-27 15:51:29 +0000752 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000753}
754
Guido van Rossum30a685f1991-06-27 15:51:29 +0000755
756/* Parse a socket address argument according to the socket object's
757 address family. Return 1 if the address was in the proper format,
758 0 of not. The address is returned through addr_ret, its length
759 through len_ret. */
760
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000761static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000762getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000763 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000764{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000765 switch (s->sock_family) {
766
Guido van Rossumb6775db1994-08-01 11:34:53 +0000767#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000768 case AF_UNIX:
769 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000770 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000771 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000772 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000773 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000774 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000775 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000776 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000777 PyErr_SetString(PySocket_Error,
778 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000779 return 0;
780 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000781 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000782 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000783 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000784 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000785 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000786 return 1;
787 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000788#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000789
Guido van Rossum30a685f1991-06-27 15:51:29 +0000790 case AF_INET:
791 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000792 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000793 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000794 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000795 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000796 if (!PyTuple_Check(args)) {
797 PyErr_Format(PyExc_TypeError,
798 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
799 args->ob_type->tp_name);
800 return 0;
801 }
802 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000803 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000804 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000805 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000806 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000807 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000808 *addr_ret = (struct sockaddr *) addr;
809 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000810 return 1;
811 }
812
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000813#ifdef INET6
814 case AF_INET6:
815 {
816 struct sockaddr_in6* addr;
817 char *host;
818 int port, flowinfo, scope_id;
819 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
820 flowinfo = scope_id = 0;
821 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
822 &scope_id)) {
823 return 0;
824 }
825 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
826 return 0;
827 addr->sin6_family = s->sock_family;
828 addr->sin6_port = htons((short)port);
829 addr->sin6_flowinfo = flowinfo;
830 addr->sin6_scope_id = scope_id;
831 *addr_ret = (struct sockaddr *) addr;
832 *len_ret = sizeof *addr;
833 return 1;
834 }
835#endif
836
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000837#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000838 case AF_PACKET:
839 {
840 struct sockaddr_ll* addr;
841 struct ifreq ifr;
842 char *interfaceName;
843 int protoNumber;
844 int hatype = 0;
845 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000846 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000847
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000848 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
849 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000850 return 0;
851 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
852 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000853 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +0000854 PySocket_Err();
Jeremy Hylton22308652001-02-02 03:23:09 +0000855 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000856 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000857 addr = &(s->sock_addr.ll);
858 addr->sll_family = AF_PACKET;
859 addr->sll_protocol = htons((short)protoNumber);
860 addr->sll_ifindex = ifr.ifr_ifindex;
861 addr->sll_pkttype = pkttype;
862 addr->sll_hatype = hatype;
863 *addr_ret = (struct sockaddr *) addr;
864 *len_ret = sizeof *addr;
865 return 1;
866 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000867#endif
868
Guido van Rossum30a685f1991-06-27 15:51:29 +0000869 /* More cases here... */
870
871 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000872 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000873 return 0;
874
875 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000876}
877
Guido van Rossum30a685f1991-06-27 15:51:29 +0000878
Guido van Rossum48a680c2001-03-02 06:34:14 +0000879/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000880 Return 1 if the family is known, 0 otherwise. The length is returned
881 through len_ret. */
882
883static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000884getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000885{
886 switch (s->sock_family) {
887
Guido van Rossumb6775db1994-08-01 11:34:53 +0000888#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000889 case AF_UNIX:
890 {
891 *len_ret = sizeof (struct sockaddr_un);
892 return 1;
893 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000894#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000895
896 case AF_INET:
897 {
898 *len_ret = sizeof (struct sockaddr_in);
899 return 1;
900 }
901
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000902#ifdef INET6
903 case AF_INET6:
904 {
905 *len_ret = sizeof (struct sockaddr_in6);
906 return 1;
907 }
908#endif
909
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000910#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000911 case AF_PACKET:
912 {
913 *len_ret = sizeof (struct sockaddr_ll);
914 return 1;
915 }
916#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000917
Guido van Rossum710e1df1992-06-12 10:39:36 +0000918 /* More cases here... */
919
920 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000921 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000922 return 0;
923
924 }
925}
926
927
Guido van Rossum30a685f1991-06-27 15:51:29 +0000928/* s.accept() method */
929
Guido van Rossum73624e91994-10-10 17:59:00 +0000930static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000931PySocketSock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000932{
933 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000934 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000935 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000936 PyObject *sock = NULL;
937 PyObject *addr = NULL;
938 PyObject *res = NULL;
939
Guido van Rossum710e1df1992-06-12 10:39:36 +0000940 if (!getsockaddrlen(s, &addrlen))
941 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000942 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000943 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000944 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000945 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000946#ifdef MS_WINDOWS
947 if (newfd == INVALID_SOCKET)
948#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000949 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000950#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000951 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000952
Guido van Rossum30a685f1991-06-27 15:51:29 +0000953 /* Create the new object with unspecified family,
954 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000955 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000956 s->sock_family,
957 s->sock_type,
958 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000959 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000960 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000961 goto finally;
962 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000963 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000964 addrlen);
965 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000966 goto finally;
967
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000968 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000969
970 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000971 Py_XDECREF(sock);
972 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000973 return res;
974}
975
Guido van Rossum82a5c661998-07-07 20:45:43 +0000976static char accept_doc[] =
977"accept() -> (socket object, address info)\n\
978\n\
979Wait for an incoming connection. Return a new socket representing the\n\
980connection, and the address of the client. For IP sockets, the address\n\
981info is a pair (hostaddr, port).";
982
Guido van Rossum30a685f1991-06-27 15:51:29 +0000983
Guido van Rossume4485b01994-09-07 14:32:49 +0000984/* s.setblocking(1 | 0) method */
985
Guido van Rossum73624e91994-10-10 17:59:00 +0000986static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000987PySocketSock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +0000988{
989 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000990#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000991#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000992 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000993#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000994#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000995 block = PyInt_AsLong(arg);
996 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +0000997 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000998 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000999#ifdef __BEOS__
1000 block = !block;
1001 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
1002 (void *)(&block), sizeof( int ) );
1003#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001004#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001005#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001006#ifdef PYOS_OS2
1007 block = !block;
1008 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
1009#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +00001010 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
1011 if (block)
1012 delay_flag &= (~O_NDELAY);
1013 else
1014 delay_flag |= O_NDELAY;
1015 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001016#endif /* !PYOS_OS2 */
1017#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001018 block = !block;
1019 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001020#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +00001021#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001022#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001023 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +00001024
Guido van Rossum73624e91994-10-10 17:59:00 +00001025 Py_INCREF(Py_None);
1026 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001027}
Guido van Rossume4485b01994-09-07 14:32:49 +00001028
Guido van Rossum82a5c661998-07-07 20:45:43 +00001029static char setblocking_doc[] =
1030"setblocking(flag)\n\
1031\n\
1032Set the socket to blocking (flag is true) or non-blocking (false).\n\
1033This uses the FIONBIO ioctl with the O_NDELAY flag.";
1034
Guido van Rossume4485b01994-09-07 14:32:49 +00001035
Guido van Rossum48a680c2001-03-02 06:34:14 +00001036#ifdef RISCOS
1037/* s.sleeptaskw(1 | 0) method */
1038
1039static PyObject *
1040PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
1041{
1042 int block;
1043 int delay_flag;
1044 if (!PyArg_GetInt(args, &block))
1045 return NULL;
1046 Py_BEGIN_ALLOW_THREADS
1047 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1048 Py_END_ALLOW_THREADS
1049
1050 Py_INCREF(Py_None);
1051 return Py_None;
1052}
1053static char sleeptaskw_doc[] =
1054"sleeptaskw(flag)\n\
1055\n\
1056Allow sleeps in taskwindows.";
1057#endif
1058
1059
Guido van Rossumaee08791992-09-08 09:05:33 +00001060/* s.setsockopt() method.
1061 With an integer third argument, sets an integer option.
1062 With a string third argument, sets an option from a buffer;
1063 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001064
Guido van Rossum73624e91994-10-10 17:59:00 +00001065static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001066PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001067{
1068 int level;
1069 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001070 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001071 char *buf;
1072 int buflen;
1073 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001074
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001075 if (PyArg_ParseTuple(args, "iii:setsockopt",
1076 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001077 buf = (char *) &flag;
1078 buflen = sizeof flag;
1079 }
1080 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001081 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001082 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1083 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001084 return NULL;
1085 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001086 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001087 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001088 return PySocket_Err();
1089 Py_INCREF(Py_None);
1090 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001091}
1092
Guido van Rossum82a5c661998-07-07 20:45:43 +00001093static char setsockopt_doc[] =
1094"setsockopt(level, option, value)\n\
1095\n\
1096Set a socket option. See the Unix manual for level and option.\n\
1097The value argument can either be an integer or a string.";
1098
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001099
Guido van Rossumaee08791992-09-08 09:05:33 +00001100/* s.getsockopt() method.
1101 With two arguments, retrieves an integer option.
1102 With a third integer argument, retrieves a string buffer of that size;
1103 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001104
Guido van Rossum73624e91994-10-10 17:59:00 +00001105static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001106PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001107{
1108 int level;
1109 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001110 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001111 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001112 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001113
Guido van Rossumbcc20741998-08-04 22:53:56 +00001114#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001115 /* We have incomplete socket support. */
1116 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001117 return NULL;
1118#else
1119
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001120 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1121 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001122 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001123
Guido van Rossumbe32c891996-06-20 16:25:29 +00001124 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001125 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001126 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001127 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001128 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001129 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001130 return PySocket_Err();
1131 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001132 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001133 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001134 PyErr_SetString(PySocket_Error,
1135 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001136 return NULL;
1137 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001138 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001139 if (buf == NULL)
1140 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001141 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001142 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001143 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001144 Py_DECREF(buf);
1145 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +00001146 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001147 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001148 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001149#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001150}
1151
Guido van Rossum82a5c661998-07-07 20:45:43 +00001152static char getsockopt_doc[] =
1153"getsockopt(level, option[, buffersize]) -> value\n\
1154\n\
1155Get a socket option. See the Unix manual for level and option.\n\
1156If a nonzero buffersize argument is given, the return value is a\n\
1157string of that length; otherwise it is an integer.";
1158
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001159
Fred Drake728819a2000-07-01 03:40:12 +00001160/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001161
Guido van Rossum73624e91994-10-10 17:59:00 +00001162static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001163PySocketSock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001164{
1165 struct sockaddr *addr;
1166 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001167 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001168
Fred Drake728819a2000-07-01 03:40:12 +00001169 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001170 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001171 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001172 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001173 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001174 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001175 return PySocket_Err();
1176 Py_INCREF(Py_None);
1177 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001178}
1179
Guido van Rossum82a5c661998-07-07 20:45:43 +00001180static char bind_doc[] =
1181"bind(address)\n\
1182\n\
1183Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001184pair (host, port); the host must refer to the local host. For raw packet\n\
1185sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001186
Guido van Rossum30a685f1991-06-27 15:51:29 +00001187
1188/* s.close() method.
1189 Set the file descriptor to -1 so operations tried subsequently
1190 will surely fail. */
1191
Guido van Rossum73624e91994-10-10 17:59:00 +00001192static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001193PySocketSock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001194{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001195 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001196
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001197 if ((fd = s->sock_fd) != -1) {
1198 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001199 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001200 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001201 Py_END_ALLOW_THREADS
1202 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001203 Py_INCREF(Py_None);
1204 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001205}
1206
Guido van Rossum82a5c661998-07-07 20:45:43 +00001207static char close_doc[] =
1208"close()\n\
1209\n\
1210Close the socket. It cannot be used after this call.";
1211
Guido van Rossum30a685f1991-06-27 15:51:29 +00001212
Fred Drake728819a2000-07-01 03:40:12 +00001213/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001214
Guido van Rossum73624e91994-10-10 17:59:00 +00001215static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001216PySocketSock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001217{
1218 struct sockaddr *addr;
1219 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001220 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001221
Fred Drake728819a2000-07-01 03:40:12 +00001222 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001223 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001224 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001225 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001226 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001227 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001228 return PySocket_Err();
1229 Py_INCREF(Py_None);
1230 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001231}
1232
Guido van Rossum82a5c661998-07-07 20:45:43 +00001233static char connect_doc[] =
1234"connect(address)\n\
1235\n\
1236Connect the socket to a remote address. For IP sockets, the address\n\
1237is a pair (host, port).";
1238
Guido van Rossum30a685f1991-06-27 15:51:29 +00001239
Fred Drake728819a2000-07-01 03:40:12 +00001240/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001241
1242static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001243PySocketSock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001244{
1245 struct sockaddr *addr;
1246 int addrlen;
1247 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001248
Fred Drake728819a2000-07-01 03:40:12 +00001249 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001250 return NULL;
1251 Py_BEGIN_ALLOW_THREADS
1252 res = connect(s->sock_fd, addr, addrlen);
1253 Py_END_ALLOW_THREADS
1254 if (res != 0)
1255 res = errno;
1256 return PyInt_FromLong((long) res);
1257}
1258
Guido van Rossum82a5c661998-07-07 20:45:43 +00001259static char connect_ex_doc[] =
1260"connect_ex(address)\n\
1261\n\
1262This is like connect(address), but returns an error code (the errno value)\n\
1263instead of raising an exception when an error occurs.";
1264
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001265
Guido van Rossumed233a51992-06-23 09:07:03 +00001266/* s.fileno() method */
1267
Guido van Rossum73624e91994-10-10 17:59:00 +00001268static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001269PySocketSock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001270{
Fred Drakea04eaad2000-06-30 02:46:07 +00001271#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001272 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001273#else
1274 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1275#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001276}
1277
Guido van Rossum82a5c661998-07-07 20:45:43 +00001278static char fileno_doc[] =
1279"fileno() -> integer\n\
1280\n\
1281Return the integer file descriptor of the socket.";
1282
Guido van Rossumed233a51992-06-23 09:07:03 +00001283
Guido van Rossumbe32c891996-06-20 16:25:29 +00001284#ifndef NO_DUP
1285/* s.dup() method */
1286
1287static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001288PySocketSock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001289{
Fred Drakea04eaad2000-06-30 02:46:07 +00001290 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001291 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001292
Guido van Rossumbe32c891996-06-20 16:25:29 +00001293 newfd = dup(s->sock_fd);
1294 if (newfd < 0)
1295 return PySocket_Err();
1296 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001297 s->sock_family,
1298 s->sock_type,
1299 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001300 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001301 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001302 return sock;
1303}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001304
1305static char dup_doc[] =
1306"dup() -> socket object\n\
1307\n\
1308Return a new socket object connected to the same system resource.";
1309
Guido van Rossumbe32c891996-06-20 16:25:29 +00001310#endif
1311
1312
Guido van Rossumc89705d1992-11-26 08:54:07 +00001313/* s.getsockname() method */
1314
Guido van Rossum73624e91994-10-10 17:59:00 +00001315static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001316PySocketSock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001317{
1318 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001319 int res;
1320 socklen_t addrlen;
1321
Guido van Rossumc89705d1992-11-26 08:54:07 +00001322 if (!getsockaddrlen(s, &addrlen))
1323 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001324 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001325 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001326 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001327 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001328 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001329 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001330 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001331}
1332
Guido van Rossum82a5c661998-07-07 20:45:43 +00001333static char getsockname_doc[] =
1334"getsockname() -> address info\n\
1335\n\
1336Return the address of the local endpoint. For IP sockets, the address\n\
1337info is a pair (hostaddr, port).";
1338
Guido van Rossumc89705d1992-11-26 08:54:07 +00001339
Guido van Rossumb6775db1994-08-01 11:34:53 +00001340#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001341/* s.getpeername() method */
1342
Guido van Rossum73624e91994-10-10 17:59:00 +00001343static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001344PySocketSock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001345{
1346 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001347 int res;
1348 socklen_t addrlen;
1349
Guido van Rossumc89705d1992-11-26 08:54:07 +00001350 if (!getsockaddrlen(s, &addrlen))
1351 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001352 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001353 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001354 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001355 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001356 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001357 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001358 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001359}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001360
1361static char getpeername_doc[] =
1362"getpeername() -> address info\n\
1363\n\
1364Return the address of the remote endpoint. For IP sockets, the address\n\
1365info is a pair (hostaddr, port).";
1366
Guido van Rossumb6775db1994-08-01 11:34:53 +00001367#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001368
1369
Guido van Rossum30a685f1991-06-27 15:51:29 +00001370/* s.listen(n) method */
1371
Guido van Rossum73624e91994-10-10 17:59:00 +00001372static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001373PySocketSock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001374{
1375 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001376 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001377
1378 backlog = PyInt_AsLong(arg);
1379 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001380 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001381 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001382 if (backlog < 1)
1383 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001384 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001385 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001386 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001387 return PySocket_Err();
1388 Py_INCREF(Py_None);
1389 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001390}
1391
Guido van Rossum82a5c661998-07-07 20:45:43 +00001392static char listen_doc[] =
1393"listen(backlog)\n\
1394\n\
1395Enable a server to accept connections. The backlog argument must be at\n\
1396least 1; it specifies the number of unaccepted connection that the system\n\
1397will allow before refusing new connections.";
1398
1399
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001400#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001401/* s.makefile(mode) method.
1402 Create a new open file object referring to a dupped version of
1403 the socket's file descriptor. (The dup() call is necessary so
1404 that the open file and socket objects may be closed independent
1405 of each other.)
1406 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1407
Guido van Rossum73624e91994-10-10 17:59:00 +00001408static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001409PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001410{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001411 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001412 char *mode = "r";
1413 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001414#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001415 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001416#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001417 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001418#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001419 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001420 PyObject *f;
1421
Guido van Rossum43713e52000-02-29 13:59:29 +00001422 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001423 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001424#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001425 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1426 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001427#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001428 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001429#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001430 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001431 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001432 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001433 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001434 }
1435 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1436 if (f != NULL)
1437 PyFile_SetBufSize(f, bufsize);
1438 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001439}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001440
1441static char makefile_doc[] =
1442"makefile([mode[, buffersize]]) -> file object\n\
1443\n\
1444Return a regular file object corresponding to the socket.\n\
1445The mode and buffersize arguments are as for the built-in open() function.";
1446
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001447#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001448
Guido van Rossum48a680c2001-03-02 06:34:14 +00001449
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001450/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001451
Guido van Rossum73624e91994-10-10 17:59:00 +00001452static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001453PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001454{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001455 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001456 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001457 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001458 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001459 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001460 if (buf == NULL)
1461 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001462 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001463 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001464 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001465 if (n < 0) {
1466 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001467 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001468 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001469 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001470 return NULL;
1471 return buf;
1472}
1473
Guido van Rossum82a5c661998-07-07 20:45:43 +00001474static char recv_doc[] =
1475"recv(buffersize[, flags]) -> data\n\
1476\n\
1477Receive up to buffersize bytes from the socket. For the optional flags\n\
1478argument, see the Unix manual. When no data is available, block until\n\
1479at least one byte is available or until the remote end is closed. When\n\
1480the remote end is closed and all data is read, return the empty string.";
1481
Guido van Rossum30a685f1991-06-27 15:51:29 +00001482
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001483/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001484
Guido van Rossum73624e91994-10-10 17:59:00 +00001485static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001486PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001487{
1488 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001489 PyObject *buf = NULL;
1490 PyObject *addr = NULL;
1491 PyObject *ret = NULL;
1492
Guido van Rossumff3ab422000-04-24 15:16:03 +00001493 int len, n, flags = 0;
1494 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001495 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001496 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001497 if (!getsockaddrlen(s, &addrlen))
1498 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001499 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001500 if (buf == NULL)
1501 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001502 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001503 memset(addrbuf, 0, addrlen);
1504 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001505#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001506#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001507 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001508#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001509 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001510#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001511#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001512 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001513#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001514 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001515 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001516 if (n < 0) {
1517 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001518 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001519 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001520 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001521 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001522
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001523 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001524 goto finally;
1525
Guido van Rossum73624e91994-10-10 17:59:00 +00001526 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001527 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001528 Py_XDECREF(addr);
1529 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001530 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001531}
1532
Guido van Rossum82a5c661998-07-07 20:45:43 +00001533static char recvfrom_doc[] =
1534"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1535\n\
1536Like recv(buffersize, flags) but also return the sender's address info.";
1537
Guido van Rossum30a685f1991-06-27 15:51:29 +00001538
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001539/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001540
Guido van Rossum73624e91994-10-10 17:59:00 +00001541static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001542PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001543{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001544 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001545 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001546 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001547 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001548 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001549 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001550 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001551 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001552 return PySocket_Err();
1553 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001554}
1555
Guido van Rossum82a5c661998-07-07 20:45:43 +00001556static char send_doc[] =
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001557"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001558\n\
1559Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001560argument, see the Unix manual. Return the number of bytes\n\
1561sent; this may be less than len(data) if the network is busy.";
1562
1563
1564/* s.sendall(data [,flags]) method */
1565
1566static PyObject *
1567PySocketSock_sendall(PySocketSockObject *s, PyObject *args)
1568{
1569 char *buf;
1570 int len, n, flags = 0, total = 0;
1571 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1572 return NULL;
1573 Py_BEGIN_ALLOW_THREADS
1574 do {
1575 n = send(s->sock_fd, buf, len, flags);
1576 if (n < 0)
1577 break;
1578 total += n;
1579 buf += n;
1580 len -= n;
1581 } while (len > 0);
1582 Py_END_ALLOW_THREADS
1583 if (n < 0)
1584 return PySocket_Err();
1585 Py_INCREF(Py_None);
1586 return Py_None;
1587}
1588
1589static char sendall_doc[] =
1590"sendall(data[, flags])\n\
1591\n\
1592Send a data string to the socket. For the optional flags\n\
1593argument, see the Unix manual. This calls send() repeatedly\n\
1594until all data is sent. If an error occurs, it's impossible\n\
1595to tell how much data has been sent.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001596
Guido van Rossum30a685f1991-06-27 15:51:29 +00001597
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001598/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001599
Guido van Rossum73624e91994-10-10 17:59:00 +00001600static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001601PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001602{
Guido van Rossum73624e91994-10-10 17:59:00 +00001603 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001604 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001605 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001606 int addrlen, len, n, flags;
1607 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001608 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001609 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001610 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1611 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001612 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001613 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001614 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001615 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001616 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001617 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001618 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001619 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001620 return PySocket_Err();
1621 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001622}
1623
Guido van Rossum82a5c661998-07-07 20:45:43 +00001624static char sendto_doc[] =
1625"sendto(data[, flags], address)\n\
1626\n\
1627Like send(data, flags) but allows specifying the destination address.\n\
1628For IP sockets, the address is a pair (hostaddr, port).";
1629
Guido van Rossum30a685f1991-06-27 15:51:29 +00001630
1631/* s.shutdown(how) method */
1632
Guido van Rossum73624e91994-10-10 17:59:00 +00001633static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001634PySocketSock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001635{
1636 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001637 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001638
1639 how = PyInt_AsLong(arg);
1640 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001641 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001642 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001643 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001644 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001645 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001646 return PySocket_Err();
1647 Py_INCREF(Py_None);
1648 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001649}
1650
Guido van Rossum82a5c661998-07-07 20:45:43 +00001651static char shutdown_doc[] =
1652"shutdown(flag)\n\
1653\n\
1654Shut down the reading side of the socket (flag == 0), the writing side\n\
1655of the socket (flag == 1), or both ends (flag == 2).";
1656
Guido van Rossum30a685f1991-06-27 15:51:29 +00001657
1658/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001659
Guido van Rossum73624e91994-10-10 17:59:00 +00001660static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum17209fc2001-10-15 21:12:54 +00001661 {"accept", (PyCFunction)PySocketSock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001662 accept_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001663 {"bind", (PyCFunction)PySocketSock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001664 bind_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00001665 {"close", (PyCFunction)PySocketSock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001666 close_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001667 {"connect", (PyCFunction)PySocketSock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001668 connect_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001669 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001670 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001671#ifndef NO_DUP
Guido van Rossum17209fc2001-10-15 21:12:54 +00001672 {"dup", (PyCFunction)PySocketSock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001673 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001674#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001675 {"fileno", (PyCFunction)PySocketSock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001676 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001677#ifdef HAVE_GETPEERNAME
Guido van Rossum17209fc2001-10-15 21:12:54 +00001678 {"getpeername", (PyCFunction)PySocketSock_getpeername,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001679 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001680#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001681 {"getsockname", (PyCFunction)PySocketSock_getsockname,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001682 METH_NOARGS, getsockname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001683 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1684 getsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001685 {"listen", (PyCFunction)PySocketSock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001686 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001687#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001688 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1689 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001690#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001691 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1692 recv_doc},
1693 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1694 recvfrom_doc},
1695 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1696 send_doc},
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001697 {"sendall", (PyCFunction)PySocketSock_sendall, METH_VARARGS,
1698 sendall_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001699 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1700 sendto_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001701 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001702 setblocking_doc},
1703 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1704 setsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001705 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001706 shutdown_doc},
1707#ifdef RISCOS
1708 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1709 sleeptaskw_doc},
1710#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001711 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001712};
1713
Guido van Rossum30a685f1991-06-27 15:51:29 +00001714
Guido van Rossum73624e91994-10-10 17:59:00 +00001715/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001716 First close the file description. */
1717
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001718static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001719PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001720{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001721 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001722 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001723 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001724}
1725
Guido van Rossum30a685f1991-06-27 15:51:29 +00001726
1727/* Return a socket object's named attribute. */
1728
Guido van Rossum73624e91994-10-10 17:59:00 +00001729static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001730PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001731{
Guido van Rossum73624e91994-10-10 17:59:00 +00001732 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001733}
1734
Guido van Rossum30a685f1991-06-27 15:51:29 +00001735
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001736static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001737PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001738{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001739 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001740#if SIZEOF_SOCKET_T > SIZEOF_LONG
1741 if (s->sock_fd > LONG_MAX) {
1742 /* this can occur on Win64, and actually there is a special
1743 ugly printf formatter for decimal pointer length integer
1744 printing, only bother if necessary*/
1745 PyErr_SetString(PyExc_OverflowError,
1746 "no printf formatter to display the socket descriptor in decimal");
1747 return NULL;
1748 }
1749#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001750 sprintf(buf,
1751 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001752 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001753 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001754}
1755
1756
Guido van Rossumb6775db1994-08-01 11:34:53 +00001757/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001758
Guido van Rossum73624e91994-10-10 17:59:00 +00001759static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001760 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001761 0,
1762 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001763 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001764 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001765 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001766 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001767 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001768 0, /*tp_setattr*/
1769 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001770 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001771 0, /*tp_as_number*/
1772 0, /*tp_as_sequence*/
1773 0, /*tp_as_mapping*/
1774};
1775
Guido van Rossum30a685f1991-06-27 15:51:29 +00001776
Guido van Rossum81194471991-07-27 21:42:02 +00001777/* Python interface to gethostname(). */
1778
1779/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001780static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001781PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001782{
1783 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001784 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001785 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001786 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001787 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001788 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001789 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001790 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001791 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001792 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001793 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001794}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001795
Guido van Rossum82a5c661998-07-07 20:45:43 +00001796static char gethostname_doc[] =
1797"gethostname() -> string\n\
1798\n\
1799Return the current host name.";
1800
Guido van Rossumff4949e1992-08-05 19:58:53 +00001801
Guido van Rossum30a685f1991-06-27 15:51:29 +00001802/* Python interface to gethostbyname(name). */
1803
1804/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001805static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001806PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001807{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001808 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001809 struct sockaddr_storage addrbuf;
1810
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001811 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001812 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001813 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001814 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001815 return makeipaddr((struct sockaddr *)&addrbuf,
1816 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001817}
1818
Guido van Rossum82a5c661998-07-07 20:45:43 +00001819static char gethostbyname_doc[] =
1820"gethostbyname(host) -> address\n\
1821\n\
1822Return the IP address (a string of the form '255.255.255.255') for a host.";
1823
1824
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001825/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1826
1827static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001828gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001829{
1830 char **pch;
1831 PyObject *rtn_tuple = (PyObject *)NULL;
1832 PyObject *name_list = (PyObject *)NULL;
1833 PyObject *addr_list = (PyObject *)NULL;
1834 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001835
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001836 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001837 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001838#ifndef RISCOS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001839 PyH_Err(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001840#else
1841 PyErr_SetString(PySocket_Error, "host not found");
1842#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001843 return NULL;
1844 }
1845 if (h->h_addrtype != af) {
1846#ifdef HAVE_STRERROR
1847 /* Let's get real error message to return */
1848 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001849#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001850 PyErr_SetString(PySocket_Error,
1851 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001852#endif
1853 return NULL;
1854 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001855 switch (af) {
1856 case AF_INET:
1857 if (alen < sizeof(struct sockaddr_in))
1858 return NULL;
1859 break;
1860#ifdef INET6
1861 case AF_INET6:
1862 if (alen < sizeof(struct sockaddr_in6))
1863 return NULL;
1864 break;
1865#endif
1866 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001867 if ((name_list = PyList_New(0)) == NULL)
1868 goto err;
1869 if ((addr_list = PyList_New(0)) == NULL)
1870 goto err;
1871 for (pch = h->h_aliases; *pch != NULL; pch++) {
1872 int status;
1873 tmp = PyString_FromString(*pch);
1874 if (tmp == NULL)
1875 goto err;
1876 status = PyList_Append(name_list, tmp);
1877 Py_DECREF(tmp);
1878 if (status)
1879 goto err;
1880 }
1881 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1882 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001883 switch (af) {
1884 case AF_INET:
1885 {
1886 struct sockaddr_in sin;
1887 memset(&sin, 0, sizeof(sin));
1888 sin.sin_family = af;
1889#ifdef HAVE_SOCKADDR_SA_LEN
1890 sin.sin_len = sizeof(sin);
1891#endif
1892 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
1893 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
1894 if (pch == h->h_addr_list && alen >= sizeof(sin))
1895 memcpy((char *) addr, &sin, sizeof(sin));
1896 break;
1897 }
1898#ifdef INET6
1899 case AF_INET6:
1900 {
1901 struct sockaddr_in6 sin6;
1902 memset(&sin6, 0, sizeof(sin6));
1903 sin6.sin6_family = af;
1904#ifdef HAVE_SOCKADDR_SA_LEN
1905 sin6.sin6_len = sizeof(sin6);
1906#endif
1907 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
1908 tmp = makeipaddr((struct sockaddr *)&sin6,
1909 sizeof(sin6));
1910 if (pch == h->h_addr_list && alen >= sizeof(sin6))
1911 memcpy((char *) addr, &sin6, sizeof(sin6));
1912 break;
1913 }
1914#endif
1915 default: /* can't happen */
1916 PyErr_SetString(PySocket_Error,
1917 "unsupported address family");
1918 return NULL;
1919 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001920 if (tmp == NULL)
1921 goto err;
1922 status = PyList_Append(addr_list, tmp);
1923 Py_DECREF(tmp);
1924 if (status)
1925 goto err;
1926 }
1927 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1928 err:
1929 Py_XDECREF(name_list);
1930 Py_XDECREF(addr_list);
1931 return rtn_tuple;
1932}
1933
1934
1935/* Python interface to gethostbyname_ex(name). */
1936
1937/*ARGSUSED*/
1938static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001939PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001940{
1941 char *name;
1942 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001943 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001944 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00001945 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001946#ifdef HAVE_GETHOSTBYNAME_R
1947 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001948#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1949 struct hostent_data data;
1950#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001951 char buf[16384];
1952 int buf_len = (sizeof buf) - 1;
1953 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001954#endif
1955#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001956 int result;
1957#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001958#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001959
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001960 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001961 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001962 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001963 return NULL;
1964 Py_BEGIN_ALLOW_THREADS
1965#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001966#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001967 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001968#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001969 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001970#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001971 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001972 result = gethostbyname_r(name, &hp_allocated, &data);
1973 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001974#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001975#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001976#ifdef USE_GETHOSTBYNAME_LOCK
1977 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001978#endif
1979 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001980#endif /* HAVE_GETHOSTBYNAME_R */
1981 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001982 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
1983 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
1984 sa = (struct sockaddr*)&addr;
1985 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00001986#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001987 PyThread_release_lock(gethostbyname_lock);
1988#endif
1989 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001990}
1991
1992static char ghbn_ex_doc[] =
1993"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1994\n\
1995Return the true host name, a list of aliases, and a list of IP addresses,\n\
1996for a host. The host argument is a string giving a host name or IP number.";
1997
1998
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001999/* Python interface to gethostbyaddr(IP). */
2000
2001/*ARGSUSED*/
2002static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002003PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002004{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002005#ifdef INET6
2006 struct sockaddr_storage addr;
2007#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002008 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002009#endif
2010 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002011 char *ip_num;
2012 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002013 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002014#ifdef HAVE_GETHOSTBYNAME_R
2015 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002016#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2017 struct hostent_data data;
2018#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002019 char buf[16384];
2020 int buf_len = (sizeof buf) - 1;
2021 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002022#endif
2023#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002024 int result;
2025#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002026#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002027 char *ap;
2028 int al;
2029 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002030
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002031 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002032 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002033 af = PF_UNSPEC;
2034 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002035 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002036 af = sa->sa_family;
2037 ap = NULL;
2038 al = 0;
2039 switch (af) {
2040 case AF_INET:
2041 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2042 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2043 break;
2044#ifdef INET6
2045 case AF_INET6:
2046 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2047 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2048 break;
2049#endif
2050 default:
2051 PyErr_SetString(PySocket_Error, "unsupported address family");
2052 return NULL;
2053 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002054 Py_BEGIN_ALLOW_THREADS
2055#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002056#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002057 result = gethostbyaddr_r(ap, al, af,
2058 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002059 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002060#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002061 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002062 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002063#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002064 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002065 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002066 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002067#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002068#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002069#ifdef USE_GETHOSTBYNAME_LOCK
2070 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002071#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002072 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002073#endif /* HAVE_GETHOSTBYNAME_R */
2074 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002075 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002076#ifdef USE_GETHOSTBYNAME_LOCK
2077 PyThread_release_lock(gethostbyname_lock);
2078#endif
2079 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002080}
2081
Guido van Rossum82a5c661998-07-07 20:45:43 +00002082static char gethostbyaddr_doc[] =
2083"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2084\n\
2085Return the true host name, a list of aliases, and a list of IP addresses,\n\
2086for a host. The host argument is a string giving a host name or IP number.";
2087
Guido van Rossum30a685f1991-06-27 15:51:29 +00002088
2089/* Python interface to getservbyname(name).
2090 This only returns the port number, since the other info is already
2091 known or not useful (like the list of aliases). */
2092
2093/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002094static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002095PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002096{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002097 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002098 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002099 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002100 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002101 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002102 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002103 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002104 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002105 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002106 return NULL;
2107 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002108 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002109}
2110
Guido van Rossum82a5c661998-07-07 20:45:43 +00002111static char getservbyname_doc[] =
2112"getservbyname(servicename, protocolname) -> integer\n\
2113\n\
2114Return a port number from a service name and protocol name.\n\
2115The protocol name should be 'tcp' or 'udp'.";
2116
Guido van Rossum30a685f1991-06-27 15:51:29 +00002117
Guido van Rossum3901d851996-12-19 16:35:04 +00002118/* Python interface to getprotobyname(name).
2119 This only returns the protocol number, since the other info is
2120 already known or not useful (like the list of aliases). */
2121
2122/*ARGSUSED*/
2123static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002124PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002125{
2126 char *name;
2127 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002128#ifdef __BEOS__
2129/* Not available in BeOS yet. - [cjh] */
2130 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2131 return NULL;
2132#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002133 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002134 return NULL;
2135 Py_BEGIN_ALLOW_THREADS
2136 sp = getprotobyname(name);
2137 Py_END_ALLOW_THREADS
2138 if (sp == NULL) {
2139 PyErr_SetString(PySocket_Error, "protocol not found");
2140 return NULL;
2141 }
2142 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002143#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002144}
2145
Guido van Rossum82a5c661998-07-07 20:45:43 +00002146static char getprotobyname_doc[] =
2147"getprotobyname(name) -> integer\n\
2148\n\
2149Return the protocol number for the named protocol. (Rarely used.)";
2150
Guido van Rossum3901d851996-12-19 16:35:04 +00002151
Guido van Rossum30a685f1991-06-27 15:51:29 +00002152/* Python interface to socket(family, type, proto).
2153 The third (protocol) argument is optional.
2154 Return a new socket object. */
2155
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002156/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002157static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002158PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002159{
Guido van Rossum73624e91994-10-10 17:59:00 +00002160 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002161 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002162 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00002163 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002164 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002165 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002166 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002167 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00002168#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002169 if (fd == INVALID_SOCKET)
2170#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002171 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002172#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002173 return PySocket_Err();
2174 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002175 /* If the object can't be created, don't forget to close the
2176 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002177 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002178 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00002179 /* From now on, ignore SIGPIPE and let the error checking
2180 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002181#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00002182 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002183#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002184 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002185}
2186
Guido van Rossum82a5c661998-07-07 20:45:43 +00002187static char socket_doc[] =
2188"socket(family, type[, proto]) -> socket object\n\
2189\n\
2190Open a socket of the given type. The family argument specifies the\n\
2191address family; it is normally AF_INET, sometimes AF_UNIX.\n\
2192The type argument specifies whether this is a stream (SOCK_STREAM)\n\
2193or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
2194specifying the default protocol.";
2195
2196
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002197#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002198/* Create a socket object from a numeric file description.
2199 Useful e.g. if stdin is a socket.
2200 Additional arguments as for socket(). */
2201
2202/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002203static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002204PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002205{
Guido van Rossum73624e91994-10-10 17:59:00 +00002206 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002207 SOCKET_T fd;
2208 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002209 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2210 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002211 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002212 /* Dup the fd so it and the socket can be closed independently */
2213 fd = dup(fd);
2214 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002215 return PySocket_Err();
2216 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002217 /* From now on, ignore SIGPIPE and let the error checking
2218 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002219#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002220 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002221#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002222 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002223}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002224
2225static char fromfd_doc[] =
2226"fromfd(fd, family, type[, proto]) -> socket object\n\
2227\n\
2228Create a socket object from the given file descriptor.\n\
2229The remaining arguments are the same as for socket().";
2230
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002231#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002232
Guido van Rossum82a5c661998-07-07 20:45:43 +00002233
Guido van Rossum006bf911996-06-12 04:04:55 +00002234static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002235PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002236{
2237 int x1, x2;
2238
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002239 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002240 return NULL;
2241 }
2242 x2 = (int)ntohs((short)x1);
2243 return PyInt_FromLong(x2);
2244}
2245
Guido van Rossum82a5c661998-07-07 20:45:43 +00002246static char ntohs_doc[] =
2247"ntohs(integer) -> integer\n\
2248\n\
2249Convert a 16-bit integer from network to host byte order.";
2250
2251
Guido van Rossum006bf911996-06-12 04:04:55 +00002252static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002253PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002254{
2255 int x1, x2;
2256
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002257 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002258 return NULL;
2259 }
2260 x2 = ntohl(x1);
2261 return PyInt_FromLong(x2);
2262}
2263
Guido van Rossum82a5c661998-07-07 20:45:43 +00002264static char ntohl_doc[] =
2265"ntohl(integer) -> integer\n\
2266\n\
2267Convert a 32-bit integer from network to host byte order.";
2268
2269
Guido van Rossum006bf911996-06-12 04:04:55 +00002270static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002271PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002272{
2273 int x1, x2;
2274
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002275 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002276 return NULL;
2277 }
2278 x2 = (int)htons((short)x1);
2279 return PyInt_FromLong(x2);
2280}
2281
Guido van Rossum82a5c661998-07-07 20:45:43 +00002282static char htons_doc[] =
2283"htons(integer) -> integer\n\
2284\n\
2285Convert a 16-bit integer from host to network byte order.";
2286
2287
Guido van Rossum006bf911996-06-12 04:04:55 +00002288static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002289PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002290{
2291 int x1, x2;
2292
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002293 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002294 return NULL;
2295 }
2296 x2 = htonl(x1);
2297 return PyInt_FromLong(x2);
2298}
2299
Guido van Rossum82a5c661998-07-07 20:45:43 +00002300static char htonl_doc[] =
2301"htonl(integer) -> integer\n\
2302\n\
2303Convert a 32-bit integer from host to network byte order.";
2304
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002305/*
2306 * socket.inet_aton() and socket.inet_ntoa() functions
2307 *
2308 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2309 *
2310 */
2311
Guido van Rossum48a680c2001-03-02 06:34:14 +00002312static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002313"inet_aton(string) -> packed 32-bit IP representation\n\
2314\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002315Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002316binary format used in low-level network functions.";
2317
2318static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002319PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002320{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002321#ifndef INADDR_NONE
2322#define INADDR_NONE (-1)
2323#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002324
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002325 /* Have to use inet_addr() instead */
2326 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002327 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002328
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002329 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002330 return NULL;
2331 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002332#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002333 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002334#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002335 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002336#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002337
2338 if (packed_addr == INADDR_NONE) { /* invalid address */
2339 PyErr_SetString(PySocket_Error,
2340 "illegal IP address string passed to inet_aton");
2341 return NULL;
2342 }
2343
2344 return PyString_FromStringAndSize((char *) &packed_addr,
2345 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002346}
2347
Guido van Rossum48a680c2001-03-02 06:34:14 +00002348static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002349"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002350\n\
2351Convert an IP address from 32-bit packed binary format to string format";
2352
2353static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002354PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002355{
2356 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002357 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002358 struct in_addr packed_addr;
2359
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002360 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002361 return NULL;
2362 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002363
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002364 if (addr_len != sizeof(packed_addr)) {
2365 PyErr_SetString(PySocket_Error,
2366 "packed IP wrong length for inet_ntoa");
2367 return NULL;
2368 }
2369
2370 memcpy(&packed_addr, packed_str, addr_len);
2371
2372 return PyString_FromString(inet_ntoa(packed_addr));
2373}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002374
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002375/* Python interface to getaddrinfo(host, port). */
2376
2377/*ARGSUSED*/
2378static PyObject *
2379PySocket_getaddrinfo(PyObject *self, PyObject *args)
2380{
2381 struct addrinfo hints, *res0, *res;
2382 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002383 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002384 char *hptr, *pptr;
2385 int family, socktype, protocol, flags;
2386 int error;
2387 PyObject *all = (PyObject *)NULL;
2388 PyObject *single = (PyObject *)NULL;
2389
2390 family = socktype = protocol = flags = 0;
2391 family = PF_UNSPEC;
2392 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2393 &hptr, &pobj, &family, &socktype,
2394 &protocol, &flags)) {
2395 return NULL;
2396 }
2397 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002398 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002399 pptr = pbuf;
2400 } else if (PyString_Check(pobj)) {
2401 pptr = PyString_AsString(pobj);
2402 } else if (pobj == Py_None) {
2403 pptr = (char *)NULL;
2404 } else {
2405 PyErr_SetString(PySocket_Error, "Int or String expected");
2406 return NULL;
2407 }
2408 memset(&hints, 0, sizeof(hints));
2409 hints.ai_family = family;
2410 hints.ai_socktype = socktype;
2411 hints.ai_protocol = protocol;
2412 hints.ai_flags = flags;
2413 error = getaddrinfo(hptr, pptr, &hints, &res0);
2414 if (error) {
2415 PyGAI_Err(error);
2416 return NULL;
2417 }
2418
2419 if ((all = PyList_New(0)) == NULL)
2420 goto err;
2421 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002422 PyObject *addr =
2423 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2424 if (addr == NULL)
2425 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002426 single = Py_BuildValue("iiisO", res->ai_family,
2427 res->ai_socktype, res->ai_protocol,
2428 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002429 addr);
2430 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002431 if (single == NULL)
2432 goto err;
2433
2434 if (PyList_Append(all, single))
2435 goto err;
2436 Py_XDECREF(single);
2437 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002438 return all;
2439 err:
2440 Py_XDECREF(single);
2441 Py_XDECREF(all);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002442 return (PyObject *)NULL;
2443}
2444
2445static char getaddrinfo_doc[] =
2446"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2447 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2448\n\
2449Resolve host and port into addrinfo struct.";
2450
2451/* Python interface to getnameinfo(sa, flags). */
2452
2453/*ARGSUSED*/
2454static PyObject *
2455PySocket_getnameinfo(PyObject *self, PyObject *args)
2456{
2457 PyObject *sa = (PyObject *)NULL;
2458 int flags;
2459 char *hostp;
2460 int n, port, flowinfo, scope_id;
2461 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2462 struct addrinfo hints, *res = NULL;
2463 int error;
2464 PyObject *ret = (PyObject *)NULL;
2465
2466 flags = flowinfo = scope_id = 0;
2467 if (PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags) == 0)
2468 return NULL;
2469 n = PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, scope_id);
2470 if (n == 0)
2471 goto fail;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002472 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002473 memset(&hints, 0, sizeof(hints));
2474 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002475 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002476 error = getaddrinfo(hostp, pbuf, &hints, &res);
2477 if (error) {
2478 PyGAI_Err(error);
2479 goto fail;
2480 }
2481 if (res->ai_next) {
2482 PyErr_SetString(PySocket_Error,
2483 "sockaddr resolved to multiple addresses");
2484 goto fail;
2485 }
2486 switch (res->ai_family) {
2487 case AF_INET:
2488 {
2489 char *t1;
2490 int t2;
2491 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2492 PyErr_SetString(PySocket_Error,
2493 "IPv4 sockaddr must be 2 tuple");
2494 goto fail;
2495 }
2496 break;
2497 }
2498#ifdef INET6
2499 case AF_INET6:
2500 {
2501 struct sockaddr_in6 *sin6;
2502 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2503 sin6->sin6_flowinfo = flowinfo;
2504 sin6->sin6_scope_id = scope_id;
2505 break;
2506 }
2507#endif
2508 }
2509 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2510 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2511 if (error) {
2512 PyGAI_Err(error);
2513 goto fail;
2514 }
2515 ret = Py_BuildValue("ss", hbuf, pbuf);
2516
2517fail:
2518 if (res)
2519 freeaddrinfo(res);
2520 Py_XDECREF(sa);
2521 return ret;
2522}
2523
2524static char getnameinfo_doc[] =
2525"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2526\n\
2527Get host and port for a sockaddr.";
2528
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002529/* XXX It might be helpful to augment the error message generated
2530 below with the name of the SSL function that generated the error.
2531 I expect it's obvious most of the time.
2532*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002533
2534#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002535static PyObject *
2536PySSL_SetError(SSL *ssl, int ret)
2537{
2538 PyObject *v, *n, *s;
2539 char *errstr;
2540 int err;
2541
2542 assert(ret <= 0);
2543
2544 err = SSL_get_error(ssl, ret);
2545 n = PyInt_FromLong(err);
2546 if (n == NULL)
2547 return NULL;
2548 v = PyTuple_New(2);
2549 if (v == NULL) {
2550 Py_DECREF(n);
2551 return NULL;
2552 }
2553
2554 switch (SSL_get_error(ssl, ret)) {
2555 case SSL_ERROR_ZERO_RETURN:
2556 errstr = "TLS/SSL connection has been closed";
2557 break;
2558 case SSL_ERROR_WANT_READ:
2559 errstr = "The operation did not complete (read)";
2560 break;
2561 case SSL_ERROR_WANT_WRITE:
2562 errstr = "The operation did not complete (write)";
2563 break;
2564 case SSL_ERROR_WANT_X509_LOOKUP:
2565 errstr = "The operation did not complete (X509 lookup)";
2566 break;
2567 case SSL_ERROR_SYSCALL:
2568 case SSL_ERROR_SSL:
2569 {
2570 unsigned long e = ERR_get_error();
2571 if (e == 0) {
2572 /* an EOF was observed that violates the protocol */
2573 errstr = "EOF occurred in violation of protocol";
2574 } else if (e == -1) {
2575 /* the underlying BIO reported an I/O error */
2576 Py_DECREF(v);
2577 Py_DECREF(n);
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +00002578 return PySocket_Err();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002579 } else {
2580 /* XXX Protected by global interpreter lock */
2581 errstr = ERR_error_string(e, NULL);
2582 }
2583 break;
2584 }
2585 default:
2586 errstr = "Invalid error code";
2587 }
2588 s = PyString_FromString(errstr);
2589 if (s == NULL) {
2590 Py_DECREF(v);
2591 Py_DECREF(n);
2592 }
2593 PyTuple_SET_ITEM(v, 0, n);
2594 PyTuple_SET_ITEM(v, 1, s);
2595 PyErr_SetObject(PySSLErrorObject, v);
2596 return NULL;
2597}
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002598
2599/* This is a C function to be called for new object initialization */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002600static PySSLObject *
2601newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002602{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002603 PySSLObject *self;
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002604 char *errstr = NULL;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002605 int ret;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002606
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002607 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002608 if (self == NULL){
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002609 errstr = "newPySSLObject error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002610 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002611 }
Jeremy Hyltonba699362001-10-11 17:23:34 +00002612 memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
2613 memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002614 self->server_cert = NULL;
2615 self->ssl = NULL;
2616 self->ctx = NULL;
2617 self->Socket = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002618
Jeremy Hylton22738b92001-10-10 22:37:48 +00002619 if ((key_file && !cert_file) || (!key_file && cert_file)) {
2620 errstr = "Both the key & certificate files must be specified";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002621 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002622 }
2623
Jeremy Hylton22738b92001-10-10 22:37:48 +00002624 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2625 if (self->ctx == NULL) {
2626 errstr = "SSL_CTX_new error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002627 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002628 }
2629
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002630 if (key_file) {
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002631 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002632 SSL_FILETYPE_PEM) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002633 errstr = "SSL_CTX_use_PrivateKey_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002634 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002635 }
2636
2637 if (SSL_CTX_use_certificate_chain_file(self->ctx,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002638 cert_file) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002639 errstr = "SSL_CTX_use_certificate_chain_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002640 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002641 }
2642 }
2643
2644 SSL_CTX_set_verify(self->ctx,
2645 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2646 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2647 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2648 SSL_set_connect_state(self->ssl);
2649
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002650 /* Actually negotiate SSL connection */
2651 /* XXX If SSL_connect() returns 0, it's also a failure. */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002652 ret = SSL_connect(self->ssl);
2653 if (ret <= 0) {
2654 PySSL_SetError(self->ssl, ret);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002655 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002656 }
2657 self->ssl->debug = 1;
2658
2659 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2660 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002661 self->server, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002662 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002663 self->issuer, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002664 }
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002665 self->Socket = Sock;
2666 Py_INCREF(self->Socket);
2667 return self;
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002668 fail:
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002669 if (errstr)
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002670 PyErr_SetString(PySSLErrorObject, errstr);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002671 Py_DECREF(self);
2672 return NULL;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002673}
2674
2675/* This is the Python function called for new object initialization */
2676static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002677PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002678{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002679 PySSLObject *rv;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002680 PySocketSockObject *Sock;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002681 char *key_file = NULL;
2682 char *cert_file = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002683
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002684 if (!PyArg_ParseTuple(args, "O!|zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002685 &PySocketSock_Type, (PyObject*)&Sock,
Jeremy Hyltonab006452001-10-10 03:33:24 +00002686 &key_file, &cert_file))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002687 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002688
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002689 rv = newPySSLObject(Sock, key_file, cert_file);
Jeremy Hyltonab006452001-10-10 03:33:24 +00002690 if (rv == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002691 return NULL;
2692 return (PyObject *)rv;
2693}
2694
2695static char ssl_doc[] =
Jeremy Hyltonba699362001-10-11 17:23:34 +00002696"ssl(socket, [keyfile, certfile]) -> sslobject";
2697
2698/* SSL object methods */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002699
2700static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002701PySSL_server(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002702{
2703 return PyString_FromString(self->server);
2704}
2705
2706static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002707PySSL_issuer(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002708{
2709 return PyString_FromString(self->issuer);
2710}
2711
2712
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002713static void PySSL_dealloc(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002714{
2715 if (self->server_cert) /* Possible not to have one? */
2716 X509_free (self->server_cert);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002717 if (self->ssl)
2718 SSL_free(self->ssl);
2719 if (self->ctx)
2720 SSL_CTX_free(self->ctx);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002721 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002722 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002723}
2724
Jeremy Hyltonba699362001-10-11 17:23:34 +00002725static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
2726{
2727 char *data;
2728 int len;
2729
2730 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
2731 return NULL;
2732
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002733 Py_BEGIN_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002734 len = SSL_write(self->ssl, data, len);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002735 Py_END_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002736 if (len > 0)
2737 return PyInt_FromLong(len);
2738 else
2739 return PySSL_SetError(self->ssl, len);
2740}
2741
2742static char PySSL_SSLwrite_doc[] =
2743"write(s) -> len\n\
2744\n\
2745Writes the string s into the SSL object. Returns the number\n\
2746of bytes written.";
2747
2748static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
2749{
2750 PyObject *buf;
2751 int count = 0;
2752 int len = 1024;
2753
2754 if (!PyArg_ParseTuple(args, "|i:read", &len))
2755 return NULL;
2756
2757 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2758 return NULL;
2759
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002760 Py_BEGIN_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002761 count = SSL_read(self->ssl, PyString_AsString(buf), len);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002762 Py_END_ALLOW_THREADS
Jeremy Hyltonba699362001-10-11 17:23:34 +00002763 if (count <= 0) {
2764 Py_DECREF(buf);
2765 return PySSL_SetError(self->ssl, count);
2766 }
2767 if (count != len && _PyString_Resize(&buf, count) < 0)
2768 return NULL;
2769 return buf;
2770}
2771
2772static char PySSL_SSLread_doc[] =
2773"read([len]) -> string\n\
2774\n\
2775Read up to len bytes from the SSL socket.";
2776
2777static PyMethodDef PySSLMethods[] = {
2778 {"write", (PyCFunction)PySSL_SSLwrite, 1,
2779 PySSL_SSLwrite_doc},
2780 {"read", (PyCFunction)PySSL_SSLread, 1,
2781 PySSL_SSLread_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00002782 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
2783 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Jeremy Hyltonba699362001-10-11 17:23:34 +00002784 {NULL, NULL}
2785};
2786
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002787static PyObject *PySSL_getattr(PySSLObject *self, char *name)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002788{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002789 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002790}
2791
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002792staticforward PyTypeObject PySSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002793 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002794 0, /*ob_size*/
2795 "SSL", /*tp_name*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002796 sizeof(PySSLObject), /*tp_basicsize*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002797 0, /*tp_itemsize*/
2798 /* methods */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002799 (destructor)PySSL_dealloc, /*tp_dealloc*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002800 0, /*tp_print*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002801 (getattrfunc)PySSL_getattr, /*tp_getattr*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002802 0, /*tp_setattr*/
2803 0, /*tp_compare*/
2804 0, /*tp_repr*/
2805 0, /*tp_as_number*/
2806 0, /*tp_as_sequence*/
2807 0, /*tp_as_mapping*/
2808 0, /*tp_hash*/
2809};
2810
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002811/* helper routines for seeding the SSL PRNG */
2812static PyObject *
2813PySSL_RAND_add(PyObject *self, PyObject *args)
2814{
2815 char *buf;
2816 int len;
2817 double entropy;
2818
2819 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
2820 return NULL;
2821 RAND_add(buf, len, entropy);
2822 Py_INCREF(Py_None);
2823 return Py_None;
2824}
2825
2826static char PySSL_RAND_add_doc[] =
2827"RAND_add(string, entropy)\n\
2828\n\
2829Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
2830bound on the entropy contained in string.";
2831
2832static PyObject *
2833PySSL_RAND_status(PyObject *self)
2834{
2835 return PyInt_FromLong(RAND_status());
2836}
2837
2838static char PySSL_RAND_status_doc[] =
2839"RAND_status() -> 0 or 1\n\
2840\n\
2841Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
2842It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
2843using the ssl() function.";
2844
2845static PyObject *
2846PySSL_RAND_egd(PyObject *self, PyObject *arg)
2847{
2848 int bytes;
2849
2850 if (!PyString_Check(arg))
2851 return PyErr_Format(PyExc_TypeError,
2852 "RAND_egd() expected string, found %s",
2853 arg->ob_type->tp_name);
2854 bytes = RAND_egd(PyString_AS_STRING(arg));
2855 if (bytes == -1) {
2856 PyErr_SetString(PySSLErrorObject,
2857 "EGD connection failed or EGD did not return "
2858 "enough data to seed the PRNG");
2859 return NULL;
2860 }
2861 return PyInt_FromLong(bytes);
2862}
2863
2864static char PySSL_RAND_egd_doc[] =
Guido van Rossumcad8fa12001-10-19 12:40:40 +00002865"RAND_egd(path) -> bytes\n\
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002866\n\
2867Queries the entropy gather daemon (EGD) on socket path. Returns number\n\
2868of bytes read. Raises socket.sslerror if connection to EGD fails or\n\
2869if it does provide enough data to seed PRNG.";
2870
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002871#endif /* USE_SSL */
2872
2873
Guido van Rossum30a685f1991-06-27 15:51:29 +00002874/* List of functions exported by this module. */
2875
Guido van Rossum73624e91994-10-10 17:59:00 +00002876static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002877 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002878 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002879 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002880 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002881 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002882 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002883 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002884 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002885 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002886 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002887 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002888 METH_VARARGS,getprotobyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002889 {"socket", PySocket_socket,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002890 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002891#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002892 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002893 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002894#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002895 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002896 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002897 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002898 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002899 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002900 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002901 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002902 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002903 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002904 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002905 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002906 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002907 {"getaddrinfo", PySocket_getaddrinfo,
2908 METH_VARARGS, getaddrinfo_doc},
2909 {"getnameinfo", PySocket_getnameinfo,
2910 METH_VARARGS, getnameinfo_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002911#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002912 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002913 METH_VARARGS, ssl_doc},
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002914 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
2915 PySSL_RAND_add_doc},
2916 {"RAND_egd", PySSL_RAND_egd, METH_O,
2917 PySSL_RAND_egd_doc},
2918 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
2919 PySSL_RAND_status_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002920#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002921 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002922};
2923
Guido van Rossum30a685f1991-06-27 15:51:29 +00002924
2925/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002926 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002927 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002928 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002929static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002930insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002931{
Guido van Rossum73624e91994-10-10 17:59:00 +00002932 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002933 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002934 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002935
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002936 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002937}
2938
Guido van Rossum30a685f1991-06-27 15:51:29 +00002939
Guido van Rossum8d665e61996-06-26 18:22:49 +00002940#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002941
2942/* Additional initialization and cleanup for NT/Windows */
2943
2944static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002945NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002946{
2947 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002948}
2949
2950static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002951NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002952{
2953 WSADATA WSAData;
2954 int ret;
2955 char buf[100];
2956 ret = WSAStartup(0x0101, &WSAData);
2957 switch (ret) {
2958 case 0: /* no error */
2959 atexit(NTcleanup);
2960 return 1;
2961 case WSASYSNOTREADY:
2962 PyErr_SetString(PyExc_ImportError,
2963 "WSAStartup failed: network not ready");
2964 break;
2965 case WSAVERNOTSUPPORTED:
2966 case WSAEINVAL:
2967 PyErr_SetString(PyExc_ImportError,
2968 "WSAStartup failed: requested version not supported");
2969 break;
2970 default:
2971 sprintf(buf, "WSAStartup failed: error code %d", ret);
2972 PyErr_SetString(PyExc_ImportError, buf);
2973 break;
2974 }
2975 return 0;
2976}
2977
Guido van Rossum8d665e61996-06-26 18:22:49 +00002978#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002979
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002980#if defined(PYOS_OS2)
2981
2982/* Additional initialization and cleanup for OS/2 */
2983
2984static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002985OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002986{
2987 /* No cleanup is necessary for OS/2 Sockets */
2988}
2989
2990static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002991OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002992{
2993 char reason[64];
2994 int rc = sock_init();
2995
2996 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002997 atexit(OS2cleanup);
2998 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002999 }
3000
3001 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
3002 PyErr_SetString(PyExc_ImportError, reason);
3003
Guido van Rossum32c575d1997-12-02 20:37:32 +00003004 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003005}
3006
3007#endif /* PYOS_OS2 */
3008
Guido van Rossum30a685f1991-06-27 15:51:29 +00003009/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003010 * This is called when the first 'import socket' is done,
3011 * via a table in config.c, if config.c is compiled with USE_SOCKET
3012 * defined.
3013 *
3014 * For MS_WINDOWS (which means any Windows variant), this module
3015 * is actually called "_socket", and there's a wrapper "socket.py"
3016 * which implements some missing functionality (such as makefile(),
3017 * dup() and fromfd()). The import of "_socket" may fail with an
3018 * ImportError exception if initialization of WINSOCK fails. When
3019 * WINSOCK is initialized succesfully, a call to WSACleanup() is
3020 * scheduled to be made at exit time.
3021 *
3022 * For OS/2, this module is also called "_socket" and uses a wrapper
3023 * "socket.py" which implements that functionality that is missing
3024 * when PC operating systems don't put socket descriptors in the
3025 * operating system's filesystem layer.
3026 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003027
Guido van Rossum82a5c661998-07-07 20:45:43 +00003028static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00003029"Implementation module for socket operations. See the socket module\n\
3030for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00003031
3032static char sockettype_doc[] =
3033"A socket represents one endpoint of a network connection.\n\
3034\n\
3035Methods:\n\
3036\n\
3037accept() -- accept a connection, returning new socket and client address\n\
3038bind() -- bind the socket to a local address\n\
3039close() -- close the socket\n\
3040connect() -- connect the socket to a remote address\n\
3041connect_ex() -- connect, return an error code instead of an exception \n\
3042dup() -- return a new socket object identical to the current one (*)\n\
3043fileno() -- return underlying file descriptor\n\
3044getpeername() -- return remote address (*)\n\
3045getsockname() -- return local address\n\
3046getsockopt() -- get socket options\n\
3047listen() -- start listening for incoming connections\n\
3048makefile() -- return a file object corresponding tot the socket (*)\n\
3049recv() -- receive data\n\
3050recvfrom() -- receive data and sender's address\n\
3051send() -- send data\n\
3052sendto() -- send data to a given address\n\
3053setblocking() -- set or clear the blocking I/O flag\n\
3054setsockopt() -- set socket options\n\
3055shutdown() -- shut down traffic in one or both directions\n\
3056\n\
3057(*) not available on all platforms!)";
3058
Guido van Rossum3886bb61998-12-04 18:50:17 +00003059DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003060init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003061{
Guido van Rossum73624e91994-10-10 17:59:00 +00003062 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003063#ifdef RISCOS
3064 _kernel_swi_regs r;
3065 r.r[0]=0;
3066 _kernel_swi(0x43380, &r, &r);
3067 taskwindow = r.r[0];
3068#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00003069#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00003070 if (!NTinit())
3071 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00003072#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00003073#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003074 if (!OS2init())
3075 return;
Fred Drakea136d492000-08-16 14:18:30 +00003076#endif /* __TOS_OS2__ */
3077#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00003078#endif /* RISCOS */
Guido van Rossuma120ffc2001-01-22 15:29:14 +00003079#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003080 PySSL_Type.ob_type = &PyType_Type;
Guido van Rossuma120ffc2001-01-22 15:29:14 +00003081#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00003082 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00003083 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003084 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
3085 if (PySocket_Error == NULL)
3086 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003087 PyDict_SetItemString(d, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003088 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
3089 if (PyH_Error == NULL)
3090 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003091 PyDict_SetItemString(d, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003092 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
3093 NULL);
3094 if (PyGAI_Error == NULL)
3095 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003096 PyDict_SetItemString(d, "gaierror", PyGAI_Error);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003097#ifdef USE_SSL
3098 SSL_load_error_strings();
3099 SSLeay_add_ssl_algorithms();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003100 PySSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
3101 if (PySSLErrorObject == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003102 return;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003103 PyDict_SetItemString(d, "sslerror", PySSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003104 if (PyDict_SetItemString(d, "SSLType",
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003105 (PyObject *)&PySSL_Type) != 0)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003106 return;
Jeremy Hylton57ca8732001-10-11 00:00:17 +00003107 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
3108 SSL_ERROR_ZERO_RETURN);
3109 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
3110 SSL_ERROR_WANT_READ);
3111 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
3112 SSL_ERROR_WANT_WRITE);
3113 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
3114 SSL_ERROR_WANT_X509_LOOKUP);
3115 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
3116 SSL_ERROR_SYSCALL);
3117 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
3118 SSL_ERROR_SSL);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003119#endif /* USE_SSL */
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00003120 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00003121 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum91ba64d1997-06-02 22:18:09 +00003122 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00003123 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003124 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003125
3126 /* Address families (we only support AF_INET and AF_UNIX) */
3127#ifdef AF_UNSPEC
3128 insint(d, "AF_UNSPEC", AF_UNSPEC);
3129#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003130 insint(d, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003131#ifdef AF_INET6
3132 insint(d, "AF_INET6", AF_INET6);
3133#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003134#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003135 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003136#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003137#ifdef AF_AX25
3138 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
3139#endif
3140#ifdef AF_IPX
3141 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
3142#endif
3143#ifdef AF_APPLETALK
3144 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
3145#endif
3146#ifdef AF_NETROM
3147 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
3148#endif
3149#ifdef AF_BRIDGE
3150 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
3151#endif
3152#ifdef AF_AAL5
3153 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
3154#endif
3155#ifdef AF_X25
3156 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
3157#endif
3158#ifdef AF_INET6
3159 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
3160#endif
3161#ifdef AF_ROSE
3162 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
3163#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003164#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00003165 insint(d, "AF_PACKET", AF_PACKET);
3166 insint(d, "PF_PACKET", PF_PACKET);
3167 insint(d, "PACKET_HOST", PACKET_HOST);
3168 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
3169 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
3170 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3171 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
3172 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3173 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003174#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003175
3176 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003177 insint(d, "SOCK_STREAM", SOCK_STREAM);
3178 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003179#ifndef __BEOS__
3180/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003181 insint(d, "SOCK_RAW", SOCK_RAW);
3182 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3183 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003184#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003185
3186#ifdef SO_DEBUG
3187 insint(d, "SO_DEBUG", SO_DEBUG);
3188#endif
3189#ifdef SO_ACCEPTCONN
3190 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
3191#endif
3192#ifdef SO_REUSEADDR
3193 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
3194#endif
3195#ifdef SO_KEEPALIVE
3196 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
3197#endif
3198#ifdef SO_DONTROUTE
3199 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
3200#endif
3201#ifdef SO_BROADCAST
3202 insint(d, "SO_BROADCAST", SO_BROADCAST);
3203#endif
3204#ifdef SO_USELOOPBACK
3205 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
3206#endif
3207#ifdef SO_LINGER
3208 insint(d, "SO_LINGER", SO_LINGER);
3209#endif
3210#ifdef SO_OOBINLINE
3211 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
3212#endif
3213#ifdef SO_REUSEPORT
3214 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
3215#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003216#ifdef SO_SNDBUF
3217 insint(d, "SO_SNDBUF", SO_SNDBUF);
3218#endif
3219#ifdef SO_RCVBUF
3220 insint(d, "SO_RCVBUF", SO_RCVBUF);
3221#endif
3222#ifdef SO_SNDLOWAT
3223 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
3224#endif
3225#ifdef SO_RCVLOWAT
3226 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
3227#endif
3228#ifdef SO_SNDTIMEO
3229 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
3230#endif
3231#ifdef SO_RCVTIMEO
3232 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
3233#endif
3234#ifdef SO_ERROR
3235 insint(d, "SO_ERROR", SO_ERROR);
3236#endif
3237#ifdef SO_TYPE
3238 insint(d, "SO_TYPE", SO_TYPE);
3239#endif
3240
3241 /* Maximum number of connections for "listen" */
3242#ifdef SOMAXCONN
3243 insint(d, "SOMAXCONN", SOMAXCONN);
3244#else
3245 insint(d, "SOMAXCONN", 5); /* Common value */
3246#endif
3247
3248 /* Flags for send, recv */
3249#ifdef MSG_OOB
3250 insint(d, "MSG_OOB", MSG_OOB);
3251#endif
3252#ifdef MSG_PEEK
3253 insint(d, "MSG_PEEK", MSG_PEEK);
3254#endif
3255#ifdef MSG_DONTROUTE
3256 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
3257#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003258#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00003259 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003260#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003261#ifdef MSG_EOR
3262 insint(d, "MSG_EOR", MSG_EOR);
3263#endif
3264#ifdef MSG_TRUNC
3265 insint(d, "MSG_TRUNC", MSG_TRUNC);
3266#endif
3267#ifdef MSG_CTRUNC
3268 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
3269#endif
3270#ifdef MSG_WAITALL
3271 insint(d, "MSG_WAITALL", MSG_WAITALL);
3272#endif
3273#ifdef MSG_BTAG
3274 insint(d, "MSG_BTAG", MSG_BTAG);
3275#endif
3276#ifdef MSG_ETAG
3277 insint(d, "MSG_ETAG", MSG_ETAG);
3278#endif
3279
3280 /* Protocol level and numbers, usable for [gs]etsockopt */
3281#ifdef SOL_SOCKET
3282 insint(d, "SOL_SOCKET", SOL_SOCKET);
3283#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003284#ifdef SOL_IP
3285 insint(d, "SOL_IP", SOL_IP);
3286#else
3287 insint(d, "SOL_IP", 0);
3288#endif
3289#ifdef SOL_IPX
3290 insint(d, "SOL_IPX", SOL_IPX);
3291#endif
3292#ifdef SOL_AX25
3293 insint(d, "SOL_AX25", SOL_AX25);
3294#endif
3295#ifdef SOL_ATALK
3296 insint(d, "SOL_ATALK", SOL_ATALK);
3297#endif
3298#ifdef SOL_NETROM
3299 insint(d, "SOL_NETROM", SOL_NETROM);
3300#endif
3301#ifdef SOL_ROSE
3302 insint(d, "SOL_ROSE", SOL_ROSE);
3303#endif
3304#ifdef SOL_TCP
3305 insint(d, "SOL_TCP", SOL_TCP);
3306#else
3307 insint(d, "SOL_TCP", 6);
3308#endif
3309#ifdef SOL_UDP
3310 insint(d, "SOL_UDP", SOL_UDP);
3311#else
3312 insint(d, "SOL_UDP", 17);
3313#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003314#ifdef IPPROTO_IP
3315 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003316#else
3317 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003318#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003319#ifdef IPPROTO_HOPOPTS
3320 insint(d, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
3321#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003322#ifdef IPPROTO_ICMP
3323 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003324#else
3325 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003326#endif
3327#ifdef IPPROTO_IGMP
3328 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
3329#endif
3330#ifdef IPPROTO_GGP
3331 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
3332#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003333#ifdef IPPROTO_IPV4
3334 insint(d, "IPPROTO_IPV4", IPPROTO_IPV4);
3335#endif
3336#ifdef IPPROTO_IPIP
3337 insint(d, "IPPROTO_IPIP", IPPROTO_IPIP);
3338#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003339#ifdef IPPROTO_TCP
3340 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003341#else
3342 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003343#endif
3344#ifdef IPPROTO_EGP
3345 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
3346#endif
3347#ifdef IPPROTO_PUP
3348 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
3349#endif
3350#ifdef IPPROTO_UDP
3351 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003352#else
3353 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003354#endif
3355#ifdef IPPROTO_IDP
3356 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
3357#endif
3358#ifdef IPPROTO_HELLO
3359 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
3360#endif
3361#ifdef IPPROTO_ND
3362 insint(d, "IPPROTO_ND", IPPROTO_ND);
3363#endif
3364#ifdef IPPROTO_TP
3365 insint(d, "IPPROTO_TP", IPPROTO_TP);
3366#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003367#ifdef IPPROTO_IPV6
3368 insint(d, "IPPROTO_IPV6", IPPROTO_IPV6);
3369#endif
3370#ifdef IPPROTO_ROUTING
3371 insint(d, "IPPROTO_ROUTING", IPPROTO_ROUTING);
3372#endif
3373#ifdef IPPROTO_FRAGMENT
3374 insint(d, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
3375#endif
3376#ifdef IPPROTO_RSVP
3377 insint(d, "IPPROTO_RSVP", IPPROTO_RSVP);
3378#endif
3379#ifdef IPPROTO_GRE
3380 insint(d, "IPPROTO_GRE", IPPROTO_GRE);
3381#endif
3382#ifdef IPPROTO_ESP
3383 insint(d, "IPPROTO_ESP", IPPROTO_ESP);
3384#endif
3385#ifdef IPPROTO_AH
3386 insint(d, "IPPROTO_AH", IPPROTO_AH);
3387#endif
3388#ifdef IPPROTO_MOBILE
3389 insint(d, "IPPROTO_MOBILE", IPPROTO_MOBILE);
3390#endif
3391#ifdef IPPROTO_ICMPV6
3392 insint(d, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
3393#endif
3394#ifdef IPPROTO_NONE
3395 insint(d, "IPPROTO_NONE", IPPROTO_NONE);
3396#endif
3397#ifdef IPPROTO_DSTOPTS
3398 insint(d, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
3399#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003400#ifdef IPPROTO_XTP
3401 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
3402#endif
3403#ifdef IPPROTO_EON
3404 insint(d, "IPPROTO_EON", IPPROTO_EON);
3405#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003406#ifdef IPPROTO_PIM
3407 insint(d, "IPPROTO_PIM", IPPROTO_PIM);
3408#endif
3409#ifdef IPPROTO_IPCOMP
3410 insint(d, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
3411#endif
3412#ifdef IPPROTO_VRRP
3413 insint(d, "IPPROTO_VRRP", IPPROTO_VRRP);
3414#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003415#ifdef IPPROTO_BIP
3416 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
3417#endif
3418/**/
3419#ifdef IPPROTO_RAW
3420 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003421#else
3422 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003423#endif
3424#ifdef IPPROTO_MAX
3425 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
3426#endif
3427
3428 /* Some port configuration */
3429#ifdef IPPORT_RESERVED
3430 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
3431#else
3432 insint(d, "IPPORT_RESERVED", 1024);
3433#endif
3434#ifdef IPPORT_USERRESERVED
3435 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
3436#else
3437 insint(d, "IPPORT_USERRESERVED", 5000);
3438#endif
3439
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003440 /* Some reserved IP v.4 addresses */
3441#ifdef INADDR_ANY
3442 insint(d, "INADDR_ANY", INADDR_ANY);
3443#else
3444 insint(d, "INADDR_ANY", 0x00000000);
3445#endif
3446#ifdef INADDR_BROADCAST
3447 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
3448#else
3449 insint(d, "INADDR_BROADCAST", 0xffffffff);
3450#endif
3451#ifdef INADDR_LOOPBACK
3452 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
3453#else
3454 insint(d, "INADDR_LOOPBACK", 0x7F000001);
3455#endif
3456#ifdef INADDR_UNSPEC_GROUP
3457 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
3458#else
3459 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
3460#endif
3461#ifdef INADDR_ALLHOSTS_GROUP
3462 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
3463#else
3464 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
3465#endif
3466#ifdef INADDR_MAX_LOCAL_GROUP
3467 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
3468#else
3469 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
3470#endif
3471#ifdef INADDR_NONE
3472 insint(d, "INADDR_NONE", INADDR_NONE);
3473#else
3474 insint(d, "INADDR_NONE", 0xffffffff);
3475#endif
3476
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003477 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003478#ifdef IP_OPTIONS
3479 insint(d, "IP_OPTIONS", IP_OPTIONS);
3480#endif
3481#ifdef IP_HDRINCL
3482 insint(d, "IP_HDRINCL", IP_HDRINCL);
3483#endif
3484#ifdef IP_TOS
3485 insint(d, "IP_TOS", IP_TOS);
3486#endif
3487#ifdef IP_TTL
3488 insint(d, "IP_TTL", IP_TTL);
3489#endif
3490#ifdef IP_RECVOPTS
3491 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
3492#endif
3493#ifdef IP_RECVRETOPTS
3494 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
3495#endif
3496#ifdef IP_RECVDSTADDR
3497 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
3498#endif
3499#ifdef IP_RETOPTS
3500 insint(d, "IP_RETOPTS", IP_RETOPTS);
3501#endif
3502#ifdef IP_MULTICAST_IF
3503 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
3504#endif
3505#ifdef IP_MULTICAST_TTL
3506 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
3507#endif
3508#ifdef IP_MULTICAST_LOOP
3509 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
3510#endif
3511#ifdef IP_ADD_MEMBERSHIP
3512 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
3513#endif
3514#ifdef IP_DROP_MEMBERSHIP
3515 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
3516#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003517#ifdef IP_DEFAULT_MULTICAST_TTL
3518 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
3519#endif
3520#ifdef IP_DEFAULT_MULTICAST_LOOP
3521 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
3522#endif
3523#ifdef IP_MAX_MEMBERSHIPS
3524 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
3525#endif
3526
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003527 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3528#ifdef IPV6_JOIN_GROUP
3529 insint(d, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
3530#endif
3531#ifdef IPV6_LEAVE_GROUP
3532 insint(d, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
3533#endif
3534#ifdef IPV6_MULTICAST_HOPS
3535 insint(d, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
3536#endif
3537#ifdef IPV6_MULTICAST_IF
3538 insint(d, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
3539#endif
3540#ifdef IPV6_MULTICAST_LOOP
3541 insint(d, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
3542#endif
3543#ifdef IPV6_UNICAST_HOPS
3544 insint(d, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
3545#endif
3546
Guido van Rossum09be4091999-08-09 14:40:40 +00003547 /* TCP options */
3548#ifdef TCP_NODELAY
3549 insint(d, "TCP_NODELAY", TCP_NODELAY);
3550#endif
3551#ifdef TCP_MAXSEG
3552 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
3553#endif
3554
3555 /* IPX options */
3556#ifdef IPX_TYPE
3557 insint(d, "IPX_TYPE", IPX_TYPE);
3558#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003559
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003560 /* get{addr,name}info parameters */
3561#ifdef EAI_ADDRFAMILY
3562 insint(d, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
3563#endif
3564#ifdef EAI_AGAIN
3565 insint(d, "EAI_AGAIN", EAI_AGAIN);
3566#endif
3567#ifdef EAI_BADFLAGS
3568 insint(d, "EAI_BADFLAGS", EAI_BADFLAGS);
3569#endif
3570#ifdef EAI_FAIL
3571 insint(d, "EAI_FAIL", EAI_FAIL);
3572#endif
3573#ifdef EAI_FAMILY
3574 insint(d, "EAI_FAMILY", EAI_FAMILY);
3575#endif
3576#ifdef EAI_MEMORY
3577 insint(d, "EAI_MEMORY", EAI_MEMORY);
3578#endif
3579#ifdef EAI_NODATA
3580 insint(d, "EAI_NODATA", EAI_NODATA);
3581#endif
3582#ifdef EAI_NONAME
3583 insint(d, "EAI_NONAME", EAI_NONAME);
3584#endif
3585#ifdef EAI_SERVICE
3586 insint(d, "EAI_SERVICE", EAI_SERVICE);
3587#endif
3588#ifdef EAI_SOCKTYPE
3589 insint(d, "EAI_SOCKTYPE", EAI_SOCKTYPE);
3590#endif
3591#ifdef EAI_SYSTEM
3592 insint(d, "EAI_SYSTEM", EAI_SYSTEM);
3593#endif
3594#ifdef EAI_BADHINTS
3595 insint(d, "EAI_BADHINTS", EAI_BADHINTS);
3596#endif
3597#ifdef EAI_PROTOCOL
3598 insint(d, "EAI_PROTOCOL", EAI_PROTOCOL);
3599#endif
3600#ifdef EAI_MAX
3601 insint(d, "EAI_MAX", EAI_MAX);
3602#endif
3603#ifdef AI_PASSIVE
3604 insint(d, "AI_PASSIVE", AI_PASSIVE);
3605#endif
3606#ifdef AI_CANONNAME
3607 insint(d, "AI_CANONNAME", AI_CANONNAME);
3608#endif
3609#ifdef AI_NUMERICHOST
3610 insint(d, "AI_NUMERICHOST", AI_NUMERICHOST);
3611#endif
3612#ifdef AI_MASK
3613 insint(d, "AI_MASK", AI_MASK);
3614#endif
3615#ifdef AI_ALL
3616 insint(d, "AI_ALL", AI_ALL);
3617#endif
3618#ifdef AI_V4MAPPED_CFG
3619 insint(d, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
3620#endif
3621#ifdef AI_ADDRCONFIG
3622 insint(d, "AI_ADDRCONFIG", AI_ADDRCONFIG);
3623#endif
3624#ifdef AI_V4MAPPED
3625 insint(d, "AI_V4MAPPED", AI_V4MAPPED);
3626#endif
3627#ifdef AI_DEFAULT
3628 insint(d, "AI_DEFAULT", AI_DEFAULT);
3629#endif
3630#ifdef NI_MAXHOST
3631 insint(d, "NI_MAXHOST", NI_MAXHOST);
3632#endif
3633#ifdef NI_MAXSERV
3634 insint(d, "NI_MAXSERV", NI_MAXSERV);
3635#endif
3636#ifdef NI_NOFQDN
3637 insint(d, "NI_NOFQDN", NI_NOFQDN);
3638#endif
3639#ifdef NI_NUMERICHOST
3640 insint(d, "NI_NUMERICHOST", NI_NUMERICHOST);
3641#endif
3642#ifdef NI_NAMEREQD
3643 insint(d, "NI_NAMEREQD", NI_NAMEREQD);
3644#endif
3645#ifdef NI_NUMERICSERV
3646 insint(d, "NI_NUMERICSERV", NI_NUMERICSERV);
3647#endif
3648#ifdef NI_DGRAM
3649 insint(d, "NI_DGRAM", NI_DGRAM);
3650#endif
3651
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003652 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003653#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003654 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003655#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003656}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003657
3658/* Simplistic emulation code for inet_pton that only works for IPv4 */
3659#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003660int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003661inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003662{
3663 if(af == AF_INET){
3664 long packed_addr;
3665#ifdef USE_GUSI1
3666 packed_addr = (long)inet_addr(src).s_addr;
3667#else
3668 packed_addr = inet_addr(src);
3669#endif
3670 if (packed_addr == INADDR_NONE)
3671 return 0;
3672 memcpy(dst, &packed_addr, 4);
3673 return 1;
3674 }
3675 /* Should set errno to EAFNOSUPPORT */
3676 return -1;
3677}
3678
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003679const char *
3680inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003681{
3682 if (af == AF_INET) {
3683 struct in_addr packed_addr;
3684 if (size < 16)
3685 /* Should set errno to ENOSPC. */
3686 return NULL;
3687 memcpy(&packed_addr, src, sizeof(packed_addr));
3688 return strncpy(dst, inet_ntoa(packed_addr), size);
3689 }
3690 /* Should set errno to EAFNOSUPPORT */
3691 return NULL;
3692}
3693#endif