blob: 1d9a13d80fb851d1222bec0181f1ae1a576f3e6c [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
69- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000070- s.setblocking(0 | 1) --> None
71- s.setsockopt(level, optname, value) --> None
72- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000073- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000074
Guido van Rossum6574b3e1991-06-25 21:36:08 +000075*/
76
Guido van Rossum73624e91994-10-10 17:59:00 +000077#include "Python.h"
Guido van Rossum3baaa131999-03-22 21:44:51 +000078
Guido van Rossum9376b741999-09-15 22:01:40 +000079/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
80 script doesn't get this right, so we hardcode some platform checks below.
81 On the other hand, not all Linux versions agree, so there the settings
82 computed by the configure script are needed! */
83
84#ifndef linux
Guido van Rossume7de2061999-03-24 17:24:33 +000085#undef HAVE_GETHOSTBYNAME_R_3_ARG
86#undef HAVE_GETHOSTBYNAME_R_5_ARG
87#undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +000088#endif
Guido van Rossume7de2061999-03-24 17:24:33 +000089
Guido van Rossum7a122991999-04-13 04:07:32 +000090#ifndef WITH_THREAD
91#undef HAVE_GETHOSTBYNAME_R
92#endif
93
Guido van Rossume7de2061999-03-24 17:24:33 +000094#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +000095#if defined(_AIX) || defined(__osf__)
Guido van Rossume7de2061999-03-24 17:24:33 +000096#define HAVE_GETHOSTBYNAME_R_3_ARG
Martin v. Löwis1c07b4b2001-10-13 09:00:42 +000097#elif defined(__sun) || defined(__sgi)
Guido van Rossume7de2061999-03-24 17:24:33 +000098#define HAVE_GETHOSTBYNAME_R_5_ARG
99#elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000100/* Rely on the configure script */
Guido van Rossume7de2061999-03-24 17:24:33 +0000101#else
102#undef HAVE_GETHOSTBYNAME_R
103#endif
104#endif
105
Guido van Rossum3baaa131999-03-22 21:44:51 +0000106#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
107#define USE_GETHOSTBYNAME_LOCK
108#endif
109
110#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum49b56061998-10-01 20:42:43 +0000111#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000112#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000113
Guido van Rossuma376cc51996-12-05 23:43:35 +0000114#ifdef HAVE_UNISTD_H
115#include <unistd.h>
116#endif
117
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000118#if defined(PYCC_VACPP)
119#include <types.h>
120#include <io.h>
121#include <sys/ioctl.h>
122#include <utils.h>
123#include <ctype.h>
124#endif
125
126#if defined(PYOS_OS2)
127#define INCL_DOS
128#define INCL_DOSERRORS
129#define INCL_NOPMAPI
130#include <os2.h>
131#endif
132
Guido van Rossum48a680c2001-03-02 06:34:14 +0000133
Guido van Rossumb6775db1994-08-01 11:34:53 +0000134#include <sys/types.h>
Guido van Rossumed233a51992-06-23 09:07:03 +0000135
Guido van Rossum81194471991-07-27 21:42:02 +0000136#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000137#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000138#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000139#include <sys/socket.h>
140#include <netinet/in.h>
Fred Drake51d90362000-10-06 15:37:06 +0000141#if !(defined(__BEOS__) || defined(__CYGWIN__))
Andrew M. Kuchling52a644c2000-03-31 17:24:30 +0000142#include <netinet/tcp.h>
Fred Drake11b09362000-05-16 13:30:12 +0000143#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000144
Guido van Rossum9376b741999-09-15 22:01:40 +0000145/* Headers needed for inet_ntoa() and inet_addr() */
146#ifdef __BEOS__
147#include <net/netdb.h>
148#else
Guido van Rossumff3ab422000-04-24 15:16:03 +0000149#ifndef USE_GUSI1
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000150#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000151#endif
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000152#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000153
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000154#ifndef RISCOS
Guido van Rossume4485b01994-09-07 14:32:49 +0000155#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000156#else
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000157#include <sys/fcntl.h>
158#define NO_DUP
159int h_errno; /* not used */
160#endif
161#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000162#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000163#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000164#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000165
Guido van Rossum48a680c2001-03-02 06:34:14 +0000166
Guido van Rossumb6775db1994-08-01 11:34:53 +0000167#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000168#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000169#else
170#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000171#endif
172
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000173#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000174#include <sys/ioctl.h>
175#include <net/if.h>
176#include <netpacket/packet.h>
177#endif
178
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000179#ifdef HAVE_STDDEF_H
180#include <stddef.h>
181#endif
182
183#ifndef offsetof
184#define offsetof(type, member) ((size_t)(&((type *)0)->member))
185#endif
186
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000187#ifndef O_NDELAY
188#define O_NDELAY O_NONBLOCK /* For QNX only? */
189#endif
190
Guido van Rossumff3ab422000-04-24 15:16:03 +0000191#ifdef USE_GUSI1
Jack Jansen508537b1996-02-14 15:57:45 +0000192/* fdopen() isn't declared in stdio.h (sigh) */
193#include <GUSI.h>
194#endif
195
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000196#include "addrinfo.h"
197
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000198#ifdef USE_SSL
Andrew M. Kuchling697a0b02001-01-18 17:41:41 +0000199#include "openssl/rsa.h"
200#include "openssl/crypto.h"
201#include "openssl/x509.h"
202#include "openssl/pem.h"
203#include "openssl/ssl.h"
204#include "openssl/err.h"
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +0000205#include "openssl/rand.h"
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000206#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000207
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000208#ifndef HAVE_INET_PTON
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000209int inet_pton (int af, const char *src, void *dst);
210const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000211#endif
212
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000213#ifdef __APPLE__
214/* On OS X, getaddrinfo returns no error indication of lookup
215 failure, so we must use the emulation instead of the libinfo
216 implementation. Unfortunately, performing an autoconf test
217 for this bug would require DNS access for the machine performing
218 the configuration, which is not acceptable. Therefore, we
219 determine the bug just by checking for __APPLE__. If this bug
220 gets ever fixed, perhaps checking for sys/version.h would be
221 appropriate, which is 10/0 on the system with the bug. */
222#undef HAVE_GETADDRINFO
223/* avoid clashes with the C library definition of the symbol. */
224#define getaddrinfo fake_getaddrinfo
225#endif
226
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000227/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000228#if !defined(HAVE_GETADDRINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000229#include "getaddrinfo.c"
230#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000231#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000232#include "getnameinfo.c"
233#endif
234
Guido van Rossumbcc20741998-08-04 22:53:56 +0000235#if defined(MS_WINDOWS) || defined(__BEOS__)
236/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000237/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000238#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000239#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000240#endif
241
Fred Drakea04eaad2000-06-30 02:46:07 +0000242/* abstract the socket file descriptor type */
243#ifdef MS_WINDOWS
244typedef SOCKET SOCKET_T;
245# ifdef MS_WIN64
246# define SIZEOF_SOCKET_T 8
247# else
248# define SIZEOF_SOCKET_T 4
249# endif
250#else
251typedef int SOCKET_T;
252# define SIZEOF_SOCKET_T SIZEOF_INT
253#endif
254
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000255#ifdef MS_WIN32
256# define EAFNOSUPPORT WSAEAFNOSUPPORT
257# define snprintf _snprintf
258#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000259
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000260#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000261#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000262#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000263#endif
264
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000265#ifndef SOCKETCLOSE
266#define SOCKETCLOSE close
267#endif
268
Guido van Rossum30a685f1991-06-27 15:51:29 +0000269/* Global variable holding the exception type for errors detected
270 by this module (but not argument type or memory errors, etc.). */
271
Guido van Rossum73624e91994-10-10 17:59:00 +0000272static PyObject *PySocket_Error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000273static PyObject *PyH_Error;
274static PyObject *PyGAI_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000275
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000276#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000277static PyObject *PySSLErrorObject;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000278#endif /* USE_SSL */
279
Guido van Rossum30a685f1991-06-27 15:51:29 +0000280
Guido van Rossum48a680c2001-03-02 06:34:14 +0000281#ifdef RISCOS
282/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
283static int taskwindow;
284#endif
285
286
Guido van Rossum30a685f1991-06-27 15:51:29 +0000287/* Convenience function to raise an error according to errno
288 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000289
Guido van Rossum73624e91994-10-10 17:59:00 +0000290static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000291PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000292{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000293#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000294 int err_no = WSAGetLastError();
295 if (err_no) {
296 static struct { int no; const char *msg; } *msgp, msgs[] = {
297 { WSAEINTR, "Interrupted system call" },
298 { WSAEBADF, "Bad file descriptor" },
299 { WSAEACCES, "Permission denied" },
300 { WSAEFAULT, "Bad address" },
301 { WSAEINVAL, "Invalid argument" },
302 { WSAEMFILE, "Too many open files" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000303 { WSAEWOULDBLOCK,
Mark Hammond46a733d2000-07-24 01:45:11 +0000304 "The socket operation could not complete "
305 "without blocking" },
306 { WSAEINPROGRESS, "Operation now in progress" },
307 { WSAEALREADY, "Operation already in progress" },
308 { WSAENOTSOCK, "Socket operation on non-socket" },
309 { WSAEDESTADDRREQ, "Destination address required" },
310 { WSAEMSGSIZE, "Message too long" },
311 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
312 { WSAENOPROTOOPT, "Protocol not available" },
313 { WSAEPROTONOSUPPORT, "Protocol not supported" },
314 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
315 { WSAEOPNOTSUPP, "Operation not supported" },
316 { WSAEPFNOSUPPORT, "Protocol family not supported" },
317 { WSAEAFNOSUPPORT, "Address family not supported" },
318 { WSAEADDRINUSE, "Address already in use" },
319 { WSAEADDRNOTAVAIL,
320 "Can't assign requested address" },
321 { WSAENETDOWN, "Network is down" },
322 { WSAENETUNREACH, "Network is unreachable" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000323 { WSAENETRESET,
Mark Hammond46a733d2000-07-24 01:45:11 +0000324 "Network dropped connection on reset" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000325 { WSAECONNABORTED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000326 "Software caused connection abort" },
327 { WSAECONNRESET, "Connection reset by peer" },
328 { WSAENOBUFS, "No buffer space available" },
329 { WSAEISCONN, "Socket is already connected" },
330 { WSAENOTCONN, "Socket is not connected" },
331 { WSAESHUTDOWN, "Can't send after socket shutdown" },
332 { WSAETOOMANYREFS,
333 "Too many references: can't splice" },
334 { WSAETIMEDOUT, "Operation timed out" },
335 { WSAECONNREFUSED, "Connection refused" },
336 { WSAELOOP, "Too many levels of symbolic links" },
337 { WSAENAMETOOLONG, "File name too long" },
338 { WSAEHOSTDOWN, "Host is down" },
339 { WSAEHOSTUNREACH, "No route to host" },
340 { WSAENOTEMPTY, "Directory not empty" },
341 { WSAEPROCLIM, "Too many processes" },
342 { WSAEUSERS, "Too many users" },
343 { WSAEDQUOT, "Disc quota exceeded" },
344 { WSAESTALE, "Stale NFS file handle" },
345 { WSAEREMOTE, "Too many levels of remote in path" },
346 { WSASYSNOTREADY,
347 "Network subsystem is unvailable" },
348 { WSAVERNOTSUPPORTED,
349 "WinSock version is not supported" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000350 { WSANOTINITIALISED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000351 "Successful WSAStartup() not yet performed" },
352 { WSAEDISCON, "Graceful shutdown in progress" },
353 /* Resolver errors */
354 { WSAHOST_NOT_FOUND, "No such host is known" },
355 { WSATRY_AGAIN, "Host not found, or server failed" },
356 { WSANO_RECOVERY,
357 "Unexpected server error encountered" },
358 { WSANO_DATA, "Valid name without requested data" },
359 { WSANO_ADDRESS, "No address, look for MX record" },
360 { 0, NULL }
361 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000362 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000363 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000364
Mark Hammond46a733d2000-07-24 01:45:11 +0000365 for (msgp = msgs; msgp->msg; msgp++) {
366 if (err_no == msgp->no) {
367 msg = msgp->msg;
368 break;
369 }
370 }
371
372 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000373 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000374 PyErr_SetObject(PySocket_Error, v);
375 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000376 }
377 return NULL;
378 }
379 else
380#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000381
382#if defined(PYOS_OS2)
383 if (sock_errno() != NO_ERROR) {
384 APIRET rc;
385 ULONG msglen;
386 char outbuf[100];
387 int myerrorcode = sock_errno();
388
389 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
390 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
391 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
392 if (rc == NO_ERROR) {
393 PyObject *v;
394
395 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
396 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
397 char *lastc = &outbuf[ strlen(outbuf)-1 ];
398 while (lastc > outbuf && isspace(*lastc))
399 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
400 }
401 v = Py_BuildValue("(is)", myerrorcode, outbuf);
402 if (v != NULL) {
403 PyErr_SetObject(PySocket_Error, v);
404 Py_DECREF(v);
405 }
406 return NULL;
407 }
408 }
409#endif
410
Guido van Rossum73624e91994-10-10 17:59:00 +0000411 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000412}
413
Guido van Rossum30a685f1991-06-27 15:51:29 +0000414
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000415static PyObject *
416PyH_Err(int h_error)
417{
418 PyObject *v;
419
420#ifdef HAVE_HSTRERROR
421 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
422#else
423 v = Py_BuildValue("(is)", h_error, "host not found");
424#endif
425 if (v != NULL) {
Martin v. Löwis864e9ff2001-08-04 22:32:03 +0000426 PyErr_SetObject(PyH_Error, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000427 Py_DECREF(v);
428 }
429
430 return NULL;
431}
432
433
434static PyObject *
435PyGAI_Err(int error)
436{
437 PyObject *v;
438
439 if (error == EAI_SYSTEM)
440 return PySocket_Err();
441
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000442#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000443 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000444#else
445 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
446#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000447 if (v != NULL) {
448 PyErr_SetObject(PyGAI_Error, v);
449 Py_DECREF(v);
450 }
451
452 return NULL;
453}
454
455
Guido van Rossum30a685f1991-06-27 15:51:29 +0000456/* The object holding a socket. It holds some extra information,
457 like the address family, which is used to decode socket address
458 arguments properly. */
459
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000460typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000461 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000462 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000463 int sock_family; /* Address family, e.g., AF_INET */
464 int sock_type; /* Socket type, e.g., SOCK_STREAM */
465 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000466 union sock_addr {
467 struct sockaddr_in in;
468#ifdef AF_UNIX
469 struct sockaddr_un un;
470#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000471#ifdef INET6
472 struct sockaddr_in6 in6;
473 struct sockaddr_storage storage;
474#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000475#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000476 struct sockaddr_ll ll;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000477#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000478 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000479} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000480
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000481#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000482
Jeremy Hyltonba699362001-10-11 17:23:34 +0000483#define X509_NAME_MAXLEN 256
484
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000485typedef struct {
486 PyObject_HEAD
487 PySocketSockObject *Socket; /* Socket on which we're layered */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000488 SSL_CTX* ctx;
489 SSL* ssl;
490 X509* server_cert;
491 BIO* sbio;
Jeremy Hyltonba699362001-10-11 17:23:34 +0000492 char server[X509_NAME_MAXLEN];
493 char issuer[X509_NAME_MAXLEN];
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000494
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000495} PySSLObject;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000496
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000497staticforward PyTypeObject PySSL_Type;
498staticforward PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args);
499staticforward PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000500
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000501#define PySSLObject_Check(v) ((v)->ob_type == &PySSL_Type)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000502
503#endif /* USE_SSL */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000504
Guido van Rossum30a685f1991-06-27 15:51:29 +0000505/* A forward reference to the Socktype type object.
506 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000507 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000508 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000509
Guido van Rossum73624e91994-10-10 17:59:00 +0000510staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000511
Guido van Rossum30a685f1991-06-27 15:51:29 +0000512
513/* Create a new socket object.
514 This just creates the object and initializes it.
515 If the creation fails, return NULL and set an exception (implicit
516 in NEWOBJ()). */
517
Guido van Rossum73624e91994-10-10 17:59:00 +0000518static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000519PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000520{
Guido van Rossum48a680c2001-03-02 06:34:14 +0000521#ifdef RISCOS
522 int block = 1;
523#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000524 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000525 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000526 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000527 if (s != NULL) {
528 s->sock_fd = fd;
529 s->sock_family = family;
530 s->sock_type = type;
531 s->sock_proto = proto;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000532#ifdef RISCOS
533 if(taskwindow) {
534 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
535 }
536#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000537 }
538 return s;
539}
540
Guido van Rossum30a685f1991-06-27 15:51:29 +0000541
Guido van Rossum48a680c2001-03-02 06:34:14 +0000542/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000543 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000544#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000545PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000546#endif
547
548
Guido van Rossum30a685f1991-06-27 15:51:29 +0000549/* Convert a string specifying a host name or one of a few symbolic
550 names to a numeric IP address. This usually calls gethostbyname()
551 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000552 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000553 an error occurred; then an exception is raised. */
554
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000555static int
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000556setipaddr(char* name, struct sockaddr * addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000557{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000558 struct addrinfo hints, *res;
559 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000560
Guido van Rossuma376cc51996-12-05 23:43:35 +0000561 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000562 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000563 int siz;
564 memset(&hints, 0, sizeof(hints));
565 hints.ai_family = af;
566 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
567 hints.ai_flags = AI_PASSIVE;
568 error = getaddrinfo(NULL, "0", &hints, &res);
569 if (error) {
570 PyGAI_Err(error);
571 return -1;
572 }
573 switch (res->ai_family) {
574 case AF_INET:
575 siz = 4;
576 break;
577#ifdef INET6
578 case AF_INET6:
579 siz = 16;
580 break;
581#endif
582 default:
583 freeaddrinfo(res);
584 PyErr_SetString(PySocket_Error,
585 "unsupported address family");
586 return -1;
587 }
588 if (res->ai_next) {
589 PyErr_SetString(PySocket_Error,
590 "wildcard resolved to multiple address");
591 return -1;
592 }
593 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
594 freeaddrinfo(res);
595 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000596 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000597 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000598 struct sockaddr_in *sin;
599 if (af != PF_INET && af != PF_UNSPEC) {
600 PyErr_SetString(PySocket_Error,
601 "address family mismatched");
602 return -1;
603 }
604 sin = (struct sockaddr_in *)addr_ret;
605 memset((void *) sin, '\0', sizeof(*sin));
606 sin->sin_family = AF_INET;
607#ifdef HAVE_SOCKADDR_SA_LEN
608 sin->sin_len = sizeof(*sin);
609#endif
610 sin->sin_addr.s_addr = INADDR_BROADCAST;
611 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000612 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000613 memset(&hints, 0, sizeof(hints));
614 hints.ai_family = af;
615 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwisb8fc9722001-10-24 17:35:46 +0000616 if (error == EAI_NONAME && af == AF_UNSPEC) {
Martin v. Löwis861a65b2001-10-24 14:36:00 +0000617 /* On OSF/1 V5.1, numeric-to-addr conversion
618 fails if no address family is given. Assume IPv4 for now.*/
619 hints.ai_family = AF_INET;
620 error = getaddrinfo(name, NULL, &hints, &res);
621 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000622 if (error) {
623 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000624 return -1;
625 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000626 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
627 freeaddrinfo(res);
628 switch (addr_ret->sa_family) {
629 case AF_INET:
630 return 4;
631#ifdef INET6
632 case AF_INET6:
633 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000634#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000635 default:
636 PyErr_SetString(PySocket_Error, "unknown address family");
637 return -1;
638 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000639}
640
Guido van Rossum30a685f1991-06-27 15:51:29 +0000641
Guido van Rossum30a685f1991-06-27 15:51:29 +0000642/* Create a string object representing an IP address.
643 This is always a string of the form 'dd.dd.dd.dd' (with variable
644 size numbers). */
645
Guido van Rossum73624e91994-10-10 17:59:00 +0000646static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000647makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000648{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000649 char buf[NI_MAXHOST];
650 int error;
651
652 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
653 NI_NUMERICHOST);
654 if (error) {
655 PyGAI_Err(error);
656 return NULL;
657 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000658 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000659}
660
661
662/* Create an object representing the given socket address,
663 suitable for passing it back to bind(), connect() etc.
664 The family field of the sockaddr structure is inspected
665 to determine what kind of address it really is. */
666
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000667/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000668static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000669makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000670{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000671 if (addrlen == 0) {
672 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000673 Py_INCREF(Py_None);
674 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000675 }
676
Guido van Rossumbcc20741998-08-04 22:53:56 +0000677#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000678 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000679 addr->sa_family = AF_INET;
680#endif
681
Guido van Rossum30a685f1991-06-27 15:51:29 +0000682 switch (addr->sa_family) {
683
684 case AF_INET:
685 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000686 struct sockaddr_in *a;
687 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000688 PyObject *ret = NULL;
689 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000690 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000691 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
692 Py_DECREF(addrobj);
693 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000694 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000695 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000696
Guido van Rossumb6775db1994-08-01 11:34:53 +0000697#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000698 case AF_UNIX:
699 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000700 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000701 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000702 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000703#endif /* AF_UNIX */
704
705#ifdef INET6
706 case AF_INET6:
707 {
708 struct sockaddr_in6 *a;
709 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
710 PyObject *ret = NULL;
711 if (addrobj) {
712 a = (struct sockaddr_in6 *)addr;
713 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
714 a->sin6_flowinfo, a->sin6_scope_id);
715 Py_DECREF(addrobj);
716 }
717 return ret;
718 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000719#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000720
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000721#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000722 case AF_PACKET:
723 {
724 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
725 char *ifname = "";
726 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000727 /* need to look up interface name give index */
728 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000729 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000730 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000731 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000732 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000733 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000734 a->sll_pkttype, a->sll_hatype,
735 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000736 }
737#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000738
Guido van Rossum30a685f1991-06-27 15:51:29 +0000739 /* More cases here... */
740
741 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000742 /* If we don't know the address family, don't raise an
743 exception -- return it as a tuple. */
744 return Py_BuildValue("is#",
745 addr->sa_family,
746 addr->sa_data,
747 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000748
Guido van Rossum30a685f1991-06-27 15:51:29 +0000749 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000750}
751
Guido van Rossum30a685f1991-06-27 15:51:29 +0000752
753/* Parse a socket address argument according to the socket object's
754 address family. Return 1 if the address was in the proper format,
755 0 of not. The address is returned through addr_ret, its length
756 through len_ret. */
757
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000758static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000759getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000760 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000761{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000762 switch (s->sock_family) {
763
Guido van Rossumb6775db1994-08-01 11:34:53 +0000764#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000765 case AF_UNIX:
766 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000767 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000768 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000769 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000770 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000771 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000772 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000773 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000774 PyErr_SetString(PySocket_Error,
775 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000776 return 0;
777 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000778 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000779 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000780 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000781 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000782 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000783 return 1;
784 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000785#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000786
Guido van Rossum30a685f1991-06-27 15:51:29 +0000787 case AF_INET:
788 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000789 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000790 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000791 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000792 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000793 if (!PyTuple_Check(args)) {
794 PyErr_Format(PyExc_TypeError,
795 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
796 args->ob_type->tp_name);
797 return 0;
798 }
799 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000800 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000801 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000802 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000803 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000804 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000805 *addr_ret = (struct sockaddr *) addr;
806 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000807 return 1;
808 }
809
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000810#ifdef INET6
811 case AF_INET6:
812 {
813 struct sockaddr_in6* addr;
814 char *host;
815 int port, flowinfo, scope_id;
816 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
817 flowinfo = scope_id = 0;
818 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
819 &scope_id)) {
820 return 0;
821 }
822 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
823 return 0;
824 addr->sin6_family = s->sock_family;
825 addr->sin6_port = htons((short)port);
826 addr->sin6_flowinfo = flowinfo;
827 addr->sin6_scope_id = scope_id;
828 *addr_ret = (struct sockaddr *) addr;
829 *len_ret = sizeof *addr;
830 return 1;
831 }
832#endif
833
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000834#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000835 case AF_PACKET:
836 {
837 struct sockaddr_ll* addr;
838 struct ifreq ifr;
839 char *interfaceName;
840 int protoNumber;
841 int hatype = 0;
842 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000843 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000844
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000845 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
846 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000847 return 0;
848 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
849 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000850 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +0000851 PySocket_Err();
Jeremy Hylton22308652001-02-02 03:23:09 +0000852 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000853 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000854 addr = &(s->sock_addr.ll);
855 addr->sll_family = AF_PACKET;
856 addr->sll_protocol = htons((short)protoNumber);
857 addr->sll_ifindex = ifr.ifr_ifindex;
858 addr->sll_pkttype = pkttype;
859 addr->sll_hatype = hatype;
860 *addr_ret = (struct sockaddr *) addr;
861 *len_ret = sizeof *addr;
862 return 1;
863 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000864#endif
865
Guido van Rossum30a685f1991-06-27 15:51:29 +0000866 /* More cases here... */
867
868 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000869 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000870 return 0;
871
872 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000873}
874
Guido van Rossum30a685f1991-06-27 15:51:29 +0000875
Guido van Rossum48a680c2001-03-02 06:34:14 +0000876/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000877 Return 1 if the family is known, 0 otherwise. The length is returned
878 through len_ret. */
879
880static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000881getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000882{
883 switch (s->sock_family) {
884
Guido van Rossumb6775db1994-08-01 11:34:53 +0000885#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000886 case AF_UNIX:
887 {
888 *len_ret = sizeof (struct sockaddr_un);
889 return 1;
890 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000891#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000892
893 case AF_INET:
894 {
895 *len_ret = sizeof (struct sockaddr_in);
896 return 1;
897 }
898
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000899#ifdef INET6
900 case AF_INET6:
901 {
902 *len_ret = sizeof (struct sockaddr_in6);
903 return 1;
904 }
905#endif
906
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000907#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000908 case AF_PACKET:
909 {
910 *len_ret = sizeof (struct sockaddr_ll);
911 return 1;
912 }
913#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000914
Guido van Rossum710e1df1992-06-12 10:39:36 +0000915 /* More cases here... */
916
917 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000918 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000919 return 0;
920
921 }
922}
923
924
Guido van Rossum30a685f1991-06-27 15:51:29 +0000925/* s.accept() method */
926
Guido van Rossum73624e91994-10-10 17:59:00 +0000927static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000928PySocketSock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000929{
930 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000931 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000932 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000933 PyObject *sock = NULL;
934 PyObject *addr = NULL;
935 PyObject *res = NULL;
936
Guido van Rossum710e1df1992-06-12 10:39:36 +0000937 if (!getsockaddrlen(s, &addrlen))
938 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000939 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000940 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000941 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000942 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000943#ifdef MS_WINDOWS
944 if (newfd == INVALID_SOCKET)
945#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000946 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000947#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000948 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000949
Guido van Rossum30a685f1991-06-27 15:51:29 +0000950 /* Create the new object with unspecified family,
951 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000952 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000953 s->sock_family,
954 s->sock_type,
955 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000956 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000957 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000958 goto finally;
959 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000960 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000961 addrlen);
962 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000963 goto finally;
964
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000965 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000966
967 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000968 Py_XDECREF(sock);
969 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000970 return res;
971}
972
Guido van Rossum82a5c661998-07-07 20:45:43 +0000973static char accept_doc[] =
974"accept() -> (socket object, address info)\n\
975\n\
976Wait for an incoming connection. Return a new socket representing the\n\
977connection, and the address of the client. For IP sockets, the address\n\
978info is a pair (hostaddr, port).";
979
Guido van Rossum30a685f1991-06-27 15:51:29 +0000980
Guido van Rossume4485b01994-09-07 14:32:49 +0000981/* s.setblocking(1 | 0) method */
982
Guido van Rossum73624e91994-10-10 17:59:00 +0000983static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000984PySocketSock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +0000985{
986 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000987#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000988#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000989 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000990#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000991#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000992 block = PyInt_AsLong(arg);
993 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +0000994 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000995 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000996#ifdef __BEOS__
997 block = !block;
998 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
999 (void *)(&block), sizeof( int ) );
1000#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001001#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001002#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001003#ifdef PYOS_OS2
1004 block = !block;
1005 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
1006#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +00001007 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
1008 if (block)
1009 delay_flag &= (~O_NDELAY);
1010 else
1011 delay_flag |= O_NDELAY;
1012 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001013#endif /* !PYOS_OS2 */
1014#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001015 block = !block;
1016 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001017#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +00001018#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001019#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001020 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +00001021
Guido van Rossum73624e91994-10-10 17:59:00 +00001022 Py_INCREF(Py_None);
1023 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001024}
Guido van Rossume4485b01994-09-07 14:32:49 +00001025
Guido van Rossum82a5c661998-07-07 20:45:43 +00001026static char setblocking_doc[] =
1027"setblocking(flag)\n\
1028\n\
1029Set the socket to blocking (flag is true) or non-blocking (false).\n\
1030This uses the FIONBIO ioctl with the O_NDELAY flag.";
1031
Guido van Rossume4485b01994-09-07 14:32:49 +00001032
Guido van Rossum48a680c2001-03-02 06:34:14 +00001033#ifdef RISCOS
1034/* s.sleeptaskw(1 | 0) method */
1035
1036static PyObject *
1037PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
1038{
1039 int block;
1040 int delay_flag;
1041 if (!PyArg_GetInt(args, &block))
1042 return NULL;
1043 Py_BEGIN_ALLOW_THREADS
1044 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1045 Py_END_ALLOW_THREADS
1046
1047 Py_INCREF(Py_None);
1048 return Py_None;
1049}
1050static char sleeptaskw_doc[] =
1051"sleeptaskw(flag)\n\
1052\n\
1053Allow sleeps in taskwindows.";
1054#endif
1055
1056
Guido van Rossumaee08791992-09-08 09:05:33 +00001057/* s.setsockopt() method.
1058 With an integer third argument, sets an integer option.
1059 With a string third argument, sets an option from a buffer;
1060 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001061
Guido van Rossum73624e91994-10-10 17:59:00 +00001062static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001063PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001064{
1065 int level;
1066 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001067 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001068 char *buf;
1069 int buflen;
1070 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001071
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001072 if (PyArg_ParseTuple(args, "iii:setsockopt",
1073 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001074 buf = (char *) &flag;
1075 buflen = sizeof flag;
1076 }
1077 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001078 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001079 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1080 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001081 return NULL;
1082 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001083 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001084 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001085 return PySocket_Err();
1086 Py_INCREF(Py_None);
1087 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001088}
1089
Guido van Rossum82a5c661998-07-07 20:45:43 +00001090static char setsockopt_doc[] =
1091"setsockopt(level, option, value)\n\
1092\n\
1093Set a socket option. See the Unix manual for level and option.\n\
1094The value argument can either be an integer or a string.";
1095
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001096
Guido van Rossumaee08791992-09-08 09:05:33 +00001097/* s.getsockopt() method.
1098 With two arguments, retrieves an integer option.
1099 With a third integer argument, retrieves a string buffer of that size;
1100 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001101
Guido van Rossum73624e91994-10-10 17:59:00 +00001102static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001103PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001104{
1105 int level;
1106 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001107 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001108 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001109 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001110
Guido van Rossumbcc20741998-08-04 22:53:56 +00001111#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001112 /* We have incomplete socket support. */
1113 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001114 return NULL;
1115#else
1116
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001117 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1118 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001119 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001120
Guido van Rossumbe32c891996-06-20 16:25:29 +00001121 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001122 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001123 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001124 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001125 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001126 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001127 return PySocket_Err();
1128 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001129 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001130 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001131 PyErr_SetString(PySocket_Error,
1132 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001133 return NULL;
1134 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001135 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001136 if (buf == NULL)
1137 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001138 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001139 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001140 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001141 Py_DECREF(buf);
1142 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +00001143 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001144 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001145 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001146#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001147}
1148
Guido van Rossum82a5c661998-07-07 20:45:43 +00001149static char getsockopt_doc[] =
1150"getsockopt(level, option[, buffersize]) -> value\n\
1151\n\
1152Get a socket option. See the Unix manual for level and option.\n\
1153If a nonzero buffersize argument is given, the return value is a\n\
1154string of that length; otherwise it is an integer.";
1155
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001156
Fred Drake728819a2000-07-01 03:40:12 +00001157/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001158
Guido van Rossum73624e91994-10-10 17:59:00 +00001159static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001160PySocketSock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001161{
1162 struct sockaddr *addr;
1163 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001164 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001165
Fred Drake728819a2000-07-01 03:40:12 +00001166 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001167 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001168 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001169 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001170 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001171 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001172 return PySocket_Err();
1173 Py_INCREF(Py_None);
1174 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001175}
1176
Guido van Rossum82a5c661998-07-07 20:45:43 +00001177static char bind_doc[] =
1178"bind(address)\n\
1179\n\
1180Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001181pair (host, port); the host must refer to the local host. For raw packet\n\
1182sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001183
Guido van Rossum30a685f1991-06-27 15:51:29 +00001184
1185/* s.close() method.
1186 Set the file descriptor to -1 so operations tried subsequently
1187 will surely fail. */
1188
Guido van Rossum73624e91994-10-10 17:59:00 +00001189static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001190PySocketSock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001191{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001192 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001193
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001194 if ((fd = s->sock_fd) != -1) {
1195 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001196 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001197 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001198 Py_END_ALLOW_THREADS
1199 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001200 Py_INCREF(Py_None);
1201 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001202}
1203
Guido van Rossum82a5c661998-07-07 20:45:43 +00001204static char close_doc[] =
1205"close()\n\
1206\n\
1207Close the socket. It cannot be used after this call.";
1208
Guido van Rossum30a685f1991-06-27 15:51:29 +00001209
Fred Drake728819a2000-07-01 03:40:12 +00001210/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001211
Guido van Rossum73624e91994-10-10 17:59:00 +00001212static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001213PySocketSock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001214{
1215 struct sockaddr *addr;
1216 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001217 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001218
Fred Drake728819a2000-07-01 03:40:12 +00001219 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001220 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001221 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001222 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001223 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001224 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001225 return PySocket_Err();
1226 Py_INCREF(Py_None);
1227 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001228}
1229
Guido van Rossum82a5c661998-07-07 20:45:43 +00001230static char connect_doc[] =
1231"connect(address)\n\
1232\n\
1233Connect the socket to a remote address. For IP sockets, the address\n\
1234is a pair (host, port).";
1235
Guido van Rossum30a685f1991-06-27 15:51:29 +00001236
Fred Drake728819a2000-07-01 03:40:12 +00001237/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001238
1239static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001240PySocketSock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001241{
1242 struct sockaddr *addr;
1243 int addrlen;
1244 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001245
Fred Drake728819a2000-07-01 03:40:12 +00001246 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001247 return NULL;
1248 Py_BEGIN_ALLOW_THREADS
1249 res = connect(s->sock_fd, addr, addrlen);
1250 Py_END_ALLOW_THREADS
1251 if (res != 0)
1252 res = errno;
1253 return PyInt_FromLong((long) res);
1254}
1255
Guido van Rossum82a5c661998-07-07 20:45:43 +00001256static char connect_ex_doc[] =
1257"connect_ex(address)\n\
1258\n\
1259This is like connect(address), but returns an error code (the errno value)\n\
1260instead of raising an exception when an error occurs.";
1261
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001262
Guido van Rossumed233a51992-06-23 09:07:03 +00001263/* s.fileno() method */
1264
Guido van Rossum73624e91994-10-10 17:59:00 +00001265static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001266PySocketSock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001267{
Fred Drakea04eaad2000-06-30 02:46:07 +00001268#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001269 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001270#else
1271 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1272#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001273}
1274
Guido van Rossum82a5c661998-07-07 20:45:43 +00001275static char fileno_doc[] =
1276"fileno() -> integer\n\
1277\n\
1278Return the integer file descriptor of the socket.";
1279
Guido van Rossumed233a51992-06-23 09:07:03 +00001280
Guido van Rossumbe32c891996-06-20 16:25:29 +00001281#ifndef NO_DUP
1282/* s.dup() method */
1283
1284static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001285PySocketSock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001286{
Fred Drakea04eaad2000-06-30 02:46:07 +00001287 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001288 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001289
Guido van Rossumbe32c891996-06-20 16:25:29 +00001290 newfd = dup(s->sock_fd);
1291 if (newfd < 0)
1292 return PySocket_Err();
1293 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001294 s->sock_family,
1295 s->sock_type,
1296 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001297 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001298 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001299 return sock;
1300}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001301
1302static char dup_doc[] =
1303"dup() -> socket object\n\
1304\n\
1305Return a new socket object connected to the same system resource.";
1306
Guido van Rossumbe32c891996-06-20 16:25:29 +00001307#endif
1308
1309
Guido van Rossumc89705d1992-11-26 08:54:07 +00001310/* s.getsockname() method */
1311
Guido van Rossum73624e91994-10-10 17:59:00 +00001312static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001313PySocketSock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001314{
1315 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001316 int res;
1317 socklen_t addrlen;
1318
Guido van Rossumc89705d1992-11-26 08:54:07 +00001319 if (!getsockaddrlen(s, &addrlen))
1320 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001321 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001322 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001323 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001324 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001325 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001326 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001327 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001328}
1329
Guido van Rossum82a5c661998-07-07 20:45:43 +00001330static char getsockname_doc[] =
1331"getsockname() -> address info\n\
1332\n\
1333Return the address of the local endpoint. For IP sockets, the address\n\
1334info is a pair (hostaddr, port).";
1335
Guido van Rossumc89705d1992-11-26 08:54:07 +00001336
Guido van Rossumb6775db1994-08-01 11:34:53 +00001337#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001338/* s.getpeername() method */
1339
Guido van Rossum73624e91994-10-10 17:59:00 +00001340static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001341PySocketSock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001342{
1343 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001344 int res;
1345 socklen_t addrlen;
1346
Guido van Rossumc89705d1992-11-26 08:54:07 +00001347 if (!getsockaddrlen(s, &addrlen))
1348 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001349 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001350 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001351 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001352 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001353 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001354 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001355 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001356}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001357
1358static char getpeername_doc[] =
1359"getpeername() -> address info\n\
1360\n\
1361Return the address of the remote endpoint. For IP sockets, the address\n\
1362info is a pair (hostaddr, port).";
1363
Guido van Rossumb6775db1994-08-01 11:34:53 +00001364#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001365
1366
Guido van Rossum30a685f1991-06-27 15:51:29 +00001367/* s.listen(n) method */
1368
Guido van Rossum73624e91994-10-10 17:59:00 +00001369static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001370PySocketSock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001371{
1372 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001373 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001374
1375 backlog = PyInt_AsLong(arg);
1376 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001377 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001378 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001379 if (backlog < 1)
1380 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001381 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001382 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001383 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001384 return PySocket_Err();
1385 Py_INCREF(Py_None);
1386 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001387}
1388
Guido van Rossum82a5c661998-07-07 20:45:43 +00001389static char listen_doc[] =
1390"listen(backlog)\n\
1391\n\
1392Enable a server to accept connections. The backlog argument must be at\n\
1393least 1; it specifies the number of unaccepted connection that the system\n\
1394will allow before refusing new connections.";
1395
1396
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001397#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001398/* s.makefile(mode) method.
1399 Create a new open file object referring to a dupped version of
1400 the socket's file descriptor. (The dup() call is necessary so
1401 that the open file and socket objects may be closed independent
1402 of each other.)
1403 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1404
Guido van Rossum73624e91994-10-10 17:59:00 +00001405static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001406PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001407{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001408 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001409 char *mode = "r";
1410 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001411#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001412 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001413#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001414 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001415#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001416 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001417 PyObject *f;
1418
Guido van Rossum43713e52000-02-29 13:59:29 +00001419 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001420 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001421#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001422 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1423 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001424#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001425 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001426#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001427 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001428 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001429 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001430 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001431 }
1432 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1433 if (f != NULL)
1434 PyFile_SetBufSize(f, bufsize);
1435 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001436}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001437
1438static char makefile_doc[] =
1439"makefile([mode[, buffersize]]) -> file object\n\
1440\n\
1441Return a regular file object corresponding to the socket.\n\
1442The mode and buffersize arguments are as for the built-in open() function.";
1443
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001444#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001445
Guido van Rossum48a680c2001-03-02 06:34:14 +00001446
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001447/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001448
Guido van Rossum73624e91994-10-10 17:59:00 +00001449static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001450PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001451{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001452 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001453 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001454 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001455 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001456 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001457 if (buf == NULL)
1458 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001459 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001460 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001461 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001462 if (n < 0) {
1463 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001464 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001465 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001466 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001467 return NULL;
1468 return buf;
1469}
1470
Guido van Rossum82a5c661998-07-07 20:45:43 +00001471static char recv_doc[] =
1472"recv(buffersize[, flags]) -> data\n\
1473\n\
1474Receive up to buffersize bytes from the socket. For the optional flags\n\
1475argument, see the Unix manual. When no data is available, block until\n\
1476at least one byte is available or until the remote end is closed. When\n\
1477the remote end is closed and all data is read, return the empty string.";
1478
Guido van Rossum30a685f1991-06-27 15:51:29 +00001479
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001480/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001481
Guido van Rossum73624e91994-10-10 17:59:00 +00001482static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001483PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001484{
1485 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001486 PyObject *buf = NULL;
1487 PyObject *addr = NULL;
1488 PyObject *ret = NULL;
1489
Guido van Rossumff3ab422000-04-24 15:16:03 +00001490 int len, n, flags = 0;
1491 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001492 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001493 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001494 if (!getsockaddrlen(s, &addrlen))
1495 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001496 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001497 if (buf == NULL)
1498 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001499 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001500 memset(addrbuf, 0, addrlen);
1501 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001502#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001503#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001504 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001505#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001506 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001507#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001508#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001509 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001510#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001511 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001512 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001513 if (n < 0) {
1514 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001515 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001516 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001517 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001518 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001519
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001520 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001521 goto finally;
1522
Guido van Rossum73624e91994-10-10 17:59:00 +00001523 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001524 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001525 Py_XDECREF(addr);
1526 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001527 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001528}
1529
Guido van Rossum82a5c661998-07-07 20:45:43 +00001530static char recvfrom_doc[] =
1531"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1532\n\
1533Like recv(buffersize, flags) but also return the sender's address info.";
1534
Guido van Rossum30a685f1991-06-27 15:51:29 +00001535
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001536/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001537
Guido van Rossum73624e91994-10-10 17:59:00 +00001538static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001539PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001540{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001541 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001542 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001543 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001544 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001545 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001546 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001547 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001548 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001549 return PySocket_Err();
1550 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001551}
1552
Guido van Rossum82a5c661998-07-07 20:45:43 +00001553static char send_doc[] =
1554"send(data[, flags])\n\
1555\n\
1556Send a data string to the socket. For the optional flags\n\
1557argument, see the Unix manual.";
1558
Guido van Rossum30a685f1991-06-27 15:51:29 +00001559
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001560/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001561
Guido van Rossum73624e91994-10-10 17:59:00 +00001562static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001563PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001564{
Guido van Rossum73624e91994-10-10 17:59:00 +00001565 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001566 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001567 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001568 int addrlen, len, n, flags;
1569 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001570 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001571 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001572 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1573 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001574 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001575 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001576 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001577 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001578 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001579 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001580 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001581 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001582 return PySocket_Err();
1583 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001584}
1585
Guido van Rossum82a5c661998-07-07 20:45:43 +00001586static char sendto_doc[] =
1587"sendto(data[, flags], address)\n\
1588\n\
1589Like send(data, flags) but allows specifying the destination address.\n\
1590For IP sockets, the address is a pair (hostaddr, port).";
1591
Guido van Rossum30a685f1991-06-27 15:51:29 +00001592
1593/* s.shutdown(how) method */
1594
Guido van Rossum73624e91994-10-10 17:59:00 +00001595static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001596PySocketSock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001597{
1598 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001599 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001600
1601 how = PyInt_AsLong(arg);
1602 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001603 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001604 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001605 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001606 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001607 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001608 return PySocket_Err();
1609 Py_INCREF(Py_None);
1610 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001611}
1612
Guido van Rossum82a5c661998-07-07 20:45:43 +00001613static char shutdown_doc[] =
1614"shutdown(flag)\n\
1615\n\
1616Shut down the reading side of the socket (flag == 0), the writing side\n\
1617of the socket (flag == 1), or both ends (flag == 2).";
1618
Guido van Rossum30a685f1991-06-27 15:51:29 +00001619
1620/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001621
Guido van Rossum73624e91994-10-10 17:59:00 +00001622static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum17209fc2001-10-15 21:12:54 +00001623 {"accept", (PyCFunction)PySocketSock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001624 accept_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001625 {"bind", (PyCFunction)PySocketSock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001626 bind_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00001627 {"close", (PyCFunction)PySocketSock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001628 close_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001629 {"connect", (PyCFunction)PySocketSock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001630 connect_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001631 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001632 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001633#ifndef NO_DUP
Guido van Rossum17209fc2001-10-15 21:12:54 +00001634 {"dup", (PyCFunction)PySocketSock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001635 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001636#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001637 {"fileno", (PyCFunction)PySocketSock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001638 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001639#ifdef HAVE_GETPEERNAME
Guido van Rossum17209fc2001-10-15 21:12:54 +00001640 {"getpeername", (PyCFunction)PySocketSock_getpeername,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001641 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001642#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001643 {"getsockname", (PyCFunction)PySocketSock_getsockname,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001644 METH_NOARGS, getsockname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001645 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1646 getsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001647 {"listen", (PyCFunction)PySocketSock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001648 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001649#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001650 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1651 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001652#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001653 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1654 recv_doc},
1655 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1656 recvfrom_doc},
1657 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1658 send_doc},
1659 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1660 sendto_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001661 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001662 setblocking_doc},
1663 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1664 setsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001665 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001666 shutdown_doc},
1667#ifdef RISCOS
1668 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1669 sleeptaskw_doc},
1670#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001671 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001672};
1673
Guido van Rossum30a685f1991-06-27 15:51:29 +00001674
Guido van Rossum73624e91994-10-10 17:59:00 +00001675/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001676 First close the file description. */
1677
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001678static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001679PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001680{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001681 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001682 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001683 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001684}
1685
Guido van Rossum30a685f1991-06-27 15:51:29 +00001686
1687/* Return a socket object's named attribute. */
1688
Guido van Rossum73624e91994-10-10 17:59:00 +00001689static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001690PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001691{
Guido van Rossum73624e91994-10-10 17:59:00 +00001692 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001693}
1694
Guido van Rossum30a685f1991-06-27 15:51:29 +00001695
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001696static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001697PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001698{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001699 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001700#if SIZEOF_SOCKET_T > SIZEOF_LONG
1701 if (s->sock_fd > LONG_MAX) {
1702 /* this can occur on Win64, and actually there is a special
1703 ugly printf formatter for decimal pointer length integer
1704 printing, only bother if necessary*/
1705 PyErr_SetString(PyExc_OverflowError,
1706 "no printf formatter to display the socket descriptor in decimal");
1707 return NULL;
1708 }
1709#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001710 sprintf(buf,
1711 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001712 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001713 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001714}
1715
1716
Guido van Rossumb6775db1994-08-01 11:34:53 +00001717/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001718
Guido van Rossum73624e91994-10-10 17:59:00 +00001719static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001720 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001721 0,
1722 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001723 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001724 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001725 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001726 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001727 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001728 0, /*tp_setattr*/
1729 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001730 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001731 0, /*tp_as_number*/
1732 0, /*tp_as_sequence*/
1733 0, /*tp_as_mapping*/
1734};
1735
Guido van Rossum30a685f1991-06-27 15:51:29 +00001736
Guido van Rossum81194471991-07-27 21:42:02 +00001737/* Python interface to gethostname(). */
1738
1739/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001740static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001741PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001742{
1743 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001744 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001745 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001746 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001747 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001748 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001749 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001750 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001751 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001752 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001753 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001754}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001755
Guido van Rossum82a5c661998-07-07 20:45:43 +00001756static char gethostname_doc[] =
1757"gethostname() -> string\n\
1758\n\
1759Return the current host name.";
1760
Guido van Rossumff4949e1992-08-05 19:58:53 +00001761
Guido van Rossum30a685f1991-06-27 15:51:29 +00001762/* Python interface to gethostbyname(name). */
1763
1764/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001765static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001766PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001767{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001768 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001769 struct sockaddr_storage addrbuf;
1770
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001771 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001772 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001773 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001774 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001775 return makeipaddr((struct sockaddr *)&addrbuf,
1776 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001777}
1778
Guido van Rossum82a5c661998-07-07 20:45:43 +00001779static char gethostbyname_doc[] =
1780"gethostbyname(host) -> address\n\
1781\n\
1782Return the IP address (a string of the form '255.255.255.255') for a host.";
1783
1784
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001785/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1786
1787static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001788gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001789{
1790 char **pch;
1791 PyObject *rtn_tuple = (PyObject *)NULL;
1792 PyObject *name_list = (PyObject *)NULL;
1793 PyObject *addr_list = (PyObject *)NULL;
1794 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001795
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001796 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001797 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001798#ifndef RISCOS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001799 PyH_Err(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001800#else
1801 PyErr_SetString(PySocket_Error, "host not found");
1802#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001803 return NULL;
1804 }
1805 if (h->h_addrtype != af) {
1806#ifdef HAVE_STRERROR
1807 /* Let's get real error message to return */
1808 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001809#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001810 PyErr_SetString(PySocket_Error,
1811 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001812#endif
1813 return NULL;
1814 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001815 switch (af) {
1816 case AF_INET:
1817 if (alen < sizeof(struct sockaddr_in))
1818 return NULL;
1819 break;
1820#ifdef INET6
1821 case AF_INET6:
1822 if (alen < sizeof(struct sockaddr_in6))
1823 return NULL;
1824 break;
1825#endif
1826 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001827 if ((name_list = PyList_New(0)) == NULL)
1828 goto err;
1829 if ((addr_list = PyList_New(0)) == NULL)
1830 goto err;
1831 for (pch = h->h_aliases; *pch != NULL; pch++) {
1832 int status;
1833 tmp = PyString_FromString(*pch);
1834 if (tmp == NULL)
1835 goto err;
1836 status = PyList_Append(name_list, tmp);
1837 Py_DECREF(tmp);
1838 if (status)
1839 goto err;
1840 }
1841 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1842 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001843 switch (af) {
1844 case AF_INET:
1845 {
1846 struct sockaddr_in sin;
1847 memset(&sin, 0, sizeof(sin));
1848 sin.sin_family = af;
1849#ifdef HAVE_SOCKADDR_SA_LEN
1850 sin.sin_len = sizeof(sin);
1851#endif
1852 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
1853 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
1854 if (pch == h->h_addr_list && alen >= sizeof(sin))
1855 memcpy((char *) addr, &sin, sizeof(sin));
1856 break;
1857 }
1858#ifdef INET6
1859 case AF_INET6:
1860 {
1861 struct sockaddr_in6 sin6;
1862 memset(&sin6, 0, sizeof(sin6));
1863 sin6.sin6_family = af;
1864#ifdef HAVE_SOCKADDR_SA_LEN
1865 sin6.sin6_len = sizeof(sin6);
1866#endif
1867 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
1868 tmp = makeipaddr((struct sockaddr *)&sin6,
1869 sizeof(sin6));
1870 if (pch == h->h_addr_list && alen >= sizeof(sin6))
1871 memcpy((char *) addr, &sin6, sizeof(sin6));
1872 break;
1873 }
1874#endif
1875 default: /* can't happen */
1876 PyErr_SetString(PySocket_Error,
1877 "unsupported address family");
1878 return NULL;
1879 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001880 if (tmp == NULL)
1881 goto err;
1882 status = PyList_Append(addr_list, tmp);
1883 Py_DECREF(tmp);
1884 if (status)
1885 goto err;
1886 }
1887 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1888 err:
1889 Py_XDECREF(name_list);
1890 Py_XDECREF(addr_list);
1891 return rtn_tuple;
1892}
1893
1894
1895/* Python interface to gethostbyname_ex(name). */
1896
1897/*ARGSUSED*/
1898static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001899PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001900{
1901 char *name;
1902 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001903 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001904 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00001905 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001906#ifdef HAVE_GETHOSTBYNAME_R
1907 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001908#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1909 struct hostent_data data;
1910#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001911 char buf[16384];
1912 int buf_len = (sizeof buf) - 1;
1913 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001914#endif
1915#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001916 int result;
1917#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001918#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001919
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001920 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001921 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001922 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001923 return NULL;
1924 Py_BEGIN_ALLOW_THREADS
1925#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001926#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001927 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001928#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001929 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001930#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001931 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001932 result = gethostbyname_r(name, &hp_allocated, &data);
1933 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001934#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001935#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001936#ifdef USE_GETHOSTBYNAME_LOCK
1937 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001938#endif
1939 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001940#endif /* HAVE_GETHOSTBYNAME_R */
1941 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001942 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
1943 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
1944 sa = (struct sockaddr*)&addr;
1945 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00001946#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001947 PyThread_release_lock(gethostbyname_lock);
1948#endif
1949 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001950}
1951
1952static char ghbn_ex_doc[] =
1953"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1954\n\
1955Return the true host name, a list of aliases, and a list of IP addresses,\n\
1956for a host. The host argument is a string giving a host name or IP number.";
1957
1958
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001959/* Python interface to gethostbyaddr(IP). */
1960
1961/*ARGSUSED*/
1962static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001963PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001964{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001965#ifdef INET6
1966 struct sockaddr_storage addr;
1967#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001968 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001969#endif
1970 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001971 char *ip_num;
1972 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001973 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001974#ifdef HAVE_GETHOSTBYNAME_R
1975 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001976#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1977 struct hostent_data data;
1978#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001979 char buf[16384];
1980 int buf_len = (sizeof buf) - 1;
1981 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001982#endif
1983#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001984 int result;
1985#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001986#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001987 char *ap;
1988 int al;
1989 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001990
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001991 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001992 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001993 af = PF_UNSPEC;
1994 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001995 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001996 af = sa->sa_family;
1997 ap = NULL;
1998 al = 0;
1999 switch (af) {
2000 case AF_INET:
2001 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2002 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2003 break;
2004#ifdef INET6
2005 case AF_INET6:
2006 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2007 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2008 break;
2009#endif
2010 default:
2011 PyErr_SetString(PySocket_Error, "unsupported address family");
2012 return NULL;
2013 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002014 Py_BEGIN_ALLOW_THREADS
2015#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002016#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002017 result = gethostbyaddr_r(ap, al, af,
2018 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002019 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002020#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002021 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002022 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002023#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002024 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002025 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002026 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002027#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002028#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002029#ifdef USE_GETHOSTBYNAME_LOCK
2030 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002031#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002032 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002033#endif /* HAVE_GETHOSTBYNAME_R */
2034 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002035 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002036#ifdef USE_GETHOSTBYNAME_LOCK
2037 PyThread_release_lock(gethostbyname_lock);
2038#endif
2039 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002040}
2041
Guido van Rossum82a5c661998-07-07 20:45:43 +00002042static char gethostbyaddr_doc[] =
2043"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2044\n\
2045Return the true host name, a list of aliases, and a list of IP addresses,\n\
2046for a host. The host argument is a string giving a host name or IP number.";
2047
Guido van Rossum30a685f1991-06-27 15:51:29 +00002048
2049/* Python interface to getservbyname(name).
2050 This only returns the port number, since the other info is already
2051 known or not useful (like the list of aliases). */
2052
2053/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002054static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002055PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002056{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002057 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002058 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002059 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002060 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002061 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002062 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002063 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002064 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002065 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002066 return NULL;
2067 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002068 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002069}
2070
Guido van Rossum82a5c661998-07-07 20:45:43 +00002071static char getservbyname_doc[] =
2072"getservbyname(servicename, protocolname) -> integer\n\
2073\n\
2074Return a port number from a service name and protocol name.\n\
2075The protocol name should be 'tcp' or 'udp'.";
2076
Guido van Rossum30a685f1991-06-27 15:51:29 +00002077
Guido van Rossum3901d851996-12-19 16:35:04 +00002078/* Python interface to getprotobyname(name).
2079 This only returns the protocol number, since the other info is
2080 already known or not useful (like the list of aliases). */
2081
2082/*ARGSUSED*/
2083static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002084PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002085{
2086 char *name;
2087 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002088#ifdef __BEOS__
2089/* Not available in BeOS yet. - [cjh] */
2090 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2091 return NULL;
2092#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002093 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002094 return NULL;
2095 Py_BEGIN_ALLOW_THREADS
2096 sp = getprotobyname(name);
2097 Py_END_ALLOW_THREADS
2098 if (sp == NULL) {
2099 PyErr_SetString(PySocket_Error, "protocol not found");
2100 return NULL;
2101 }
2102 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002103#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002104}
2105
Guido van Rossum82a5c661998-07-07 20:45:43 +00002106static char getprotobyname_doc[] =
2107"getprotobyname(name) -> integer\n\
2108\n\
2109Return the protocol number for the named protocol. (Rarely used.)";
2110
Guido van Rossum3901d851996-12-19 16:35:04 +00002111
Guido van Rossum30a685f1991-06-27 15:51:29 +00002112/* Python interface to socket(family, type, proto).
2113 The third (protocol) argument is optional.
2114 Return a new socket object. */
2115
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002116/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002117static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002118PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002119{
Guido van Rossum73624e91994-10-10 17:59:00 +00002120 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002121 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002122 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00002123 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002124 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002125 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002126 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002127 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00002128#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002129 if (fd == INVALID_SOCKET)
2130#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002131 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002132#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002133 return PySocket_Err();
2134 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002135 /* If the object can't be created, don't forget to close the
2136 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002137 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002138 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00002139 /* From now on, ignore SIGPIPE and let the error checking
2140 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002141#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00002142 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002143#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002144 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002145}
2146
Guido van Rossum82a5c661998-07-07 20:45:43 +00002147static char socket_doc[] =
2148"socket(family, type[, proto]) -> socket object\n\
2149\n\
2150Open a socket of the given type. The family argument specifies the\n\
2151address family; it is normally AF_INET, sometimes AF_UNIX.\n\
2152The type argument specifies whether this is a stream (SOCK_STREAM)\n\
2153or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
2154specifying the default protocol.";
2155
2156
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002157#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002158/* Create a socket object from a numeric file description.
2159 Useful e.g. if stdin is a socket.
2160 Additional arguments as for socket(). */
2161
2162/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002163static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002164PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002165{
Guido van Rossum73624e91994-10-10 17:59:00 +00002166 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002167 SOCKET_T fd;
2168 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002169 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2170 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002171 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002172 /* Dup the fd so it and the socket can be closed independently */
2173 fd = dup(fd);
2174 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002175 return PySocket_Err();
2176 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002177 /* From now on, ignore SIGPIPE and let the error checking
2178 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002179#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002180 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002181#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002182 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002183}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002184
2185static char fromfd_doc[] =
2186"fromfd(fd, family, type[, proto]) -> socket object\n\
2187\n\
2188Create a socket object from the given file descriptor.\n\
2189The remaining arguments are the same as for socket().";
2190
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002191#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002192
Guido van Rossum82a5c661998-07-07 20:45:43 +00002193
Guido van Rossum006bf911996-06-12 04:04:55 +00002194static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002195PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002196{
2197 int x1, x2;
2198
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002199 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002200 return NULL;
2201 }
2202 x2 = (int)ntohs((short)x1);
2203 return PyInt_FromLong(x2);
2204}
2205
Guido van Rossum82a5c661998-07-07 20:45:43 +00002206static char ntohs_doc[] =
2207"ntohs(integer) -> integer\n\
2208\n\
2209Convert a 16-bit integer from network to host byte order.";
2210
2211
Guido van Rossum006bf911996-06-12 04:04:55 +00002212static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002213PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002214{
2215 int x1, x2;
2216
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002217 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002218 return NULL;
2219 }
2220 x2 = ntohl(x1);
2221 return PyInt_FromLong(x2);
2222}
2223
Guido van Rossum82a5c661998-07-07 20:45:43 +00002224static char ntohl_doc[] =
2225"ntohl(integer) -> integer\n\
2226\n\
2227Convert a 32-bit integer from network to host byte order.";
2228
2229
Guido van Rossum006bf911996-06-12 04:04:55 +00002230static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002231PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002232{
2233 int x1, x2;
2234
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002235 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002236 return NULL;
2237 }
2238 x2 = (int)htons((short)x1);
2239 return PyInt_FromLong(x2);
2240}
2241
Guido van Rossum82a5c661998-07-07 20:45:43 +00002242static char htons_doc[] =
2243"htons(integer) -> integer\n\
2244\n\
2245Convert a 16-bit integer from host to network byte order.";
2246
2247
Guido van Rossum006bf911996-06-12 04:04:55 +00002248static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002249PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002250{
2251 int x1, x2;
2252
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002253 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002254 return NULL;
2255 }
2256 x2 = htonl(x1);
2257 return PyInt_FromLong(x2);
2258}
2259
Guido van Rossum82a5c661998-07-07 20:45:43 +00002260static char htonl_doc[] =
2261"htonl(integer) -> integer\n\
2262\n\
2263Convert a 32-bit integer from host to network byte order.";
2264
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002265/*
2266 * socket.inet_aton() and socket.inet_ntoa() functions
2267 *
2268 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2269 *
2270 */
2271
Guido van Rossum48a680c2001-03-02 06:34:14 +00002272static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002273"inet_aton(string) -> packed 32-bit IP representation\n\
2274\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002275Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002276binary format used in low-level network functions.";
2277
2278static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002279PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002280{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002281#ifndef INADDR_NONE
2282#define INADDR_NONE (-1)
2283#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002284
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002285 /* Have to use inet_addr() instead */
2286 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002287 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002288
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002289 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002290 return NULL;
2291 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002292#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002293 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002294#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002295 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002296#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002297
2298 if (packed_addr == INADDR_NONE) { /* invalid address */
2299 PyErr_SetString(PySocket_Error,
2300 "illegal IP address string passed to inet_aton");
2301 return NULL;
2302 }
2303
2304 return PyString_FromStringAndSize((char *) &packed_addr,
2305 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002306}
2307
Guido van Rossum48a680c2001-03-02 06:34:14 +00002308static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002309"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002310\n\
2311Convert an IP address from 32-bit packed binary format to string format";
2312
2313static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002314PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002315{
2316 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002317 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002318 struct in_addr packed_addr;
2319
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002320 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002321 return NULL;
2322 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002323
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002324 if (addr_len != sizeof(packed_addr)) {
2325 PyErr_SetString(PySocket_Error,
2326 "packed IP wrong length for inet_ntoa");
2327 return NULL;
2328 }
2329
2330 memcpy(&packed_addr, packed_str, addr_len);
2331
2332 return PyString_FromString(inet_ntoa(packed_addr));
2333}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002334
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002335/* Python interface to getaddrinfo(host, port). */
2336
2337/*ARGSUSED*/
2338static PyObject *
2339PySocket_getaddrinfo(PyObject *self, PyObject *args)
2340{
2341 struct addrinfo hints, *res0, *res;
2342 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002343 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002344 char *hptr, *pptr;
2345 int family, socktype, protocol, flags;
2346 int error;
2347 PyObject *all = (PyObject *)NULL;
2348 PyObject *single = (PyObject *)NULL;
2349
2350 family = socktype = protocol = flags = 0;
2351 family = PF_UNSPEC;
2352 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2353 &hptr, &pobj, &family, &socktype,
2354 &protocol, &flags)) {
2355 return NULL;
2356 }
2357 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002358 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002359 pptr = pbuf;
2360 } else if (PyString_Check(pobj)) {
2361 pptr = PyString_AsString(pobj);
2362 } else if (pobj == Py_None) {
2363 pptr = (char *)NULL;
2364 } else {
2365 PyErr_SetString(PySocket_Error, "Int or String expected");
2366 return NULL;
2367 }
2368 memset(&hints, 0, sizeof(hints));
2369 hints.ai_family = family;
2370 hints.ai_socktype = socktype;
2371 hints.ai_protocol = protocol;
2372 hints.ai_flags = flags;
2373 error = getaddrinfo(hptr, pptr, &hints, &res0);
2374 if (error) {
2375 PyGAI_Err(error);
2376 return NULL;
2377 }
2378
2379 if ((all = PyList_New(0)) == NULL)
2380 goto err;
2381 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002382 PyObject *addr =
2383 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2384 if (addr == NULL)
2385 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002386 single = Py_BuildValue("iiisO", res->ai_family,
2387 res->ai_socktype, res->ai_protocol,
2388 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002389 addr);
2390 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002391 if (single == NULL)
2392 goto err;
2393
2394 if (PyList_Append(all, single))
2395 goto err;
2396 Py_XDECREF(single);
2397 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002398 return all;
2399 err:
2400 Py_XDECREF(single);
2401 Py_XDECREF(all);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002402 return (PyObject *)NULL;
2403}
2404
2405static char getaddrinfo_doc[] =
2406"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2407 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2408\n\
2409Resolve host and port into addrinfo struct.";
2410
2411/* Python interface to getnameinfo(sa, flags). */
2412
2413/*ARGSUSED*/
2414static PyObject *
2415PySocket_getnameinfo(PyObject *self, PyObject *args)
2416{
2417 PyObject *sa = (PyObject *)NULL;
2418 int flags;
2419 char *hostp;
2420 int n, port, flowinfo, scope_id;
2421 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2422 struct addrinfo hints, *res = NULL;
2423 int error;
2424 PyObject *ret = (PyObject *)NULL;
2425
2426 flags = flowinfo = scope_id = 0;
2427 if (PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags) == 0)
2428 return NULL;
2429 n = PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, scope_id);
2430 if (n == 0)
2431 goto fail;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002432 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002433 memset(&hints, 0, sizeof(hints));
2434 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002435 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002436 error = getaddrinfo(hostp, pbuf, &hints, &res);
2437 if (error) {
2438 PyGAI_Err(error);
2439 goto fail;
2440 }
2441 if (res->ai_next) {
2442 PyErr_SetString(PySocket_Error,
2443 "sockaddr resolved to multiple addresses");
2444 goto fail;
2445 }
2446 switch (res->ai_family) {
2447 case AF_INET:
2448 {
2449 char *t1;
2450 int t2;
2451 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2452 PyErr_SetString(PySocket_Error,
2453 "IPv4 sockaddr must be 2 tuple");
2454 goto fail;
2455 }
2456 break;
2457 }
2458#ifdef INET6
2459 case AF_INET6:
2460 {
2461 struct sockaddr_in6 *sin6;
2462 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2463 sin6->sin6_flowinfo = flowinfo;
2464 sin6->sin6_scope_id = scope_id;
2465 break;
2466 }
2467#endif
2468 }
2469 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2470 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2471 if (error) {
2472 PyGAI_Err(error);
2473 goto fail;
2474 }
2475 ret = Py_BuildValue("ss", hbuf, pbuf);
2476
2477fail:
2478 if (res)
2479 freeaddrinfo(res);
2480 Py_XDECREF(sa);
2481 return ret;
2482}
2483
2484static char getnameinfo_doc[] =
2485"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2486\n\
2487Get host and port for a sockaddr.";
2488
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002489/* XXX It might be helpful to augment the error message generated
2490 below with the name of the SSL function that generated the error.
2491 I expect it's obvious most of the time.
2492*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002493
2494#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002495static PyObject *
2496PySSL_SetError(SSL *ssl, int ret)
2497{
2498 PyObject *v, *n, *s;
2499 char *errstr;
2500 int err;
2501
2502 assert(ret <= 0);
2503
2504 err = SSL_get_error(ssl, ret);
2505 n = PyInt_FromLong(err);
2506 if (n == NULL)
2507 return NULL;
2508 v = PyTuple_New(2);
2509 if (v == NULL) {
2510 Py_DECREF(n);
2511 return NULL;
2512 }
2513
2514 switch (SSL_get_error(ssl, ret)) {
2515 case SSL_ERROR_ZERO_RETURN:
2516 errstr = "TLS/SSL connection has been closed";
2517 break;
2518 case SSL_ERROR_WANT_READ:
2519 errstr = "The operation did not complete (read)";
2520 break;
2521 case SSL_ERROR_WANT_WRITE:
2522 errstr = "The operation did not complete (write)";
2523 break;
2524 case SSL_ERROR_WANT_X509_LOOKUP:
2525 errstr = "The operation did not complete (X509 lookup)";
2526 break;
2527 case SSL_ERROR_SYSCALL:
2528 case SSL_ERROR_SSL:
2529 {
2530 unsigned long e = ERR_get_error();
2531 if (e == 0) {
2532 /* an EOF was observed that violates the protocol */
2533 errstr = "EOF occurred in violation of protocol";
2534 } else if (e == -1) {
2535 /* the underlying BIO reported an I/O error */
2536 Py_DECREF(v);
2537 Py_DECREF(n);
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +00002538 return PySocket_Err();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002539 } else {
2540 /* XXX Protected by global interpreter lock */
2541 errstr = ERR_error_string(e, NULL);
2542 }
2543 break;
2544 }
2545 default:
2546 errstr = "Invalid error code";
2547 }
2548 s = PyString_FromString(errstr);
2549 if (s == NULL) {
2550 Py_DECREF(v);
2551 Py_DECREF(n);
2552 }
2553 PyTuple_SET_ITEM(v, 0, n);
2554 PyTuple_SET_ITEM(v, 1, s);
2555 PyErr_SetObject(PySSLErrorObject, v);
2556 return NULL;
2557}
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002558
2559/* This is a C function to be called for new object initialization */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002560static PySSLObject *
2561newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002562{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002563 PySSLObject *self;
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002564 char *errstr = NULL;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002565 int ret;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002566
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002567 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002568 if (self == NULL){
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002569 errstr = "newPySSLObject error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002570 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002571 }
Jeremy Hyltonba699362001-10-11 17:23:34 +00002572 memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
2573 memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002574 self->server_cert = NULL;
2575 self->ssl = NULL;
2576 self->ctx = NULL;
2577 self->Socket = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002578
Jeremy Hylton22738b92001-10-10 22:37:48 +00002579 if ((key_file && !cert_file) || (!key_file && cert_file)) {
2580 errstr = "Both the key & certificate files must be specified";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002581 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002582 }
2583
Jeremy Hylton22738b92001-10-10 22:37:48 +00002584 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2585 if (self->ctx == NULL) {
2586 errstr = "SSL_CTX_new error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002587 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002588 }
2589
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002590 if (key_file) {
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002591 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002592 SSL_FILETYPE_PEM) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002593 errstr = "SSL_CTX_use_PrivateKey_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002594 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002595 }
2596
2597 if (SSL_CTX_use_certificate_chain_file(self->ctx,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002598 cert_file) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002599 errstr = "SSL_CTX_use_certificate_chain_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002600 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002601 }
2602 }
2603
2604 SSL_CTX_set_verify(self->ctx,
2605 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2606 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2607 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2608 SSL_set_connect_state(self->ssl);
2609
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002610 /* Actually negotiate SSL connection */
2611 /* XXX If SSL_connect() returns 0, it's also a failure. */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002612 ret = SSL_connect(self->ssl);
2613 if (ret <= 0) {
2614 PySSL_SetError(self->ssl, ret);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002615 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002616 }
2617 self->ssl->debug = 1;
2618
2619 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2620 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002621 self->server, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002622 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002623 self->issuer, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002624 }
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002625 self->Socket = Sock;
2626 Py_INCREF(self->Socket);
2627 return self;
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002628 fail:
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002629 if (errstr)
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002630 PyErr_SetString(PySSLErrorObject, errstr);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002631 Py_DECREF(self);
2632 return NULL;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002633}
2634
2635/* This is the Python function called for new object initialization */
2636static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002637PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002638{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002639 PySSLObject *rv;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002640 PySocketSockObject *Sock;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002641 char *key_file = NULL;
2642 char *cert_file = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002643
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002644 if (!PyArg_ParseTuple(args, "O!|zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002645 &PySocketSock_Type, (PyObject*)&Sock,
Jeremy Hyltonab006452001-10-10 03:33:24 +00002646 &key_file, &cert_file))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002647 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002648
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002649 rv = newPySSLObject(Sock, key_file, cert_file);
Jeremy Hyltonab006452001-10-10 03:33:24 +00002650 if (rv == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002651 return NULL;
2652 return (PyObject *)rv;
2653}
2654
2655static char ssl_doc[] =
Jeremy Hyltonba699362001-10-11 17:23:34 +00002656"ssl(socket, [keyfile, certfile]) -> sslobject";
2657
2658/* SSL object methods */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002659
2660static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002661PySSL_server(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002662{
2663 return PyString_FromString(self->server);
2664}
2665
2666static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002667PySSL_issuer(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002668{
2669 return PyString_FromString(self->issuer);
2670}
2671
2672
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002673static void PySSL_dealloc(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002674{
2675 if (self->server_cert) /* Possible not to have one? */
2676 X509_free (self->server_cert);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002677 if (self->ssl)
2678 SSL_free(self->ssl);
2679 if (self->ctx)
2680 SSL_CTX_free(self->ctx);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002681 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002682 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002683}
2684
Jeremy Hyltonba699362001-10-11 17:23:34 +00002685static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
2686{
2687 char *data;
2688 int len;
2689
2690 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
2691 return NULL;
2692
2693 len = SSL_write(self->ssl, data, len);
2694 if (len > 0)
2695 return PyInt_FromLong(len);
2696 else
2697 return PySSL_SetError(self->ssl, len);
2698}
2699
2700static char PySSL_SSLwrite_doc[] =
2701"write(s) -> len\n\
2702\n\
2703Writes the string s into the SSL object. Returns the number\n\
2704of bytes written.";
2705
2706static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
2707{
2708 PyObject *buf;
2709 int count = 0;
2710 int len = 1024;
2711
2712 if (!PyArg_ParseTuple(args, "|i:read", &len))
2713 return NULL;
2714
2715 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2716 return NULL;
2717
2718 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2719 if (count <= 0) {
2720 Py_DECREF(buf);
2721 return PySSL_SetError(self->ssl, count);
2722 }
2723 if (count != len && _PyString_Resize(&buf, count) < 0)
2724 return NULL;
2725 return buf;
2726}
2727
2728static char PySSL_SSLread_doc[] =
2729"read([len]) -> string\n\
2730\n\
2731Read up to len bytes from the SSL socket.";
2732
2733static PyMethodDef PySSLMethods[] = {
2734 {"write", (PyCFunction)PySSL_SSLwrite, 1,
2735 PySSL_SSLwrite_doc},
2736 {"read", (PyCFunction)PySSL_SSLread, 1,
2737 PySSL_SSLread_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00002738 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
2739 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Jeremy Hyltonba699362001-10-11 17:23:34 +00002740 {NULL, NULL}
2741};
2742
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002743static PyObject *PySSL_getattr(PySSLObject *self, char *name)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002744{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002745 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002746}
2747
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002748staticforward PyTypeObject PySSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002749 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002750 0, /*ob_size*/
2751 "SSL", /*tp_name*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002752 sizeof(PySSLObject), /*tp_basicsize*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002753 0, /*tp_itemsize*/
2754 /* methods */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002755 (destructor)PySSL_dealloc, /*tp_dealloc*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002756 0, /*tp_print*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002757 (getattrfunc)PySSL_getattr, /*tp_getattr*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002758 0, /*tp_setattr*/
2759 0, /*tp_compare*/
2760 0, /*tp_repr*/
2761 0, /*tp_as_number*/
2762 0, /*tp_as_sequence*/
2763 0, /*tp_as_mapping*/
2764 0, /*tp_hash*/
2765};
2766
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002767/* helper routines for seeding the SSL PRNG */
2768static PyObject *
2769PySSL_RAND_add(PyObject *self, PyObject *args)
2770{
2771 char *buf;
2772 int len;
2773 double entropy;
2774
2775 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
2776 return NULL;
2777 RAND_add(buf, len, entropy);
2778 Py_INCREF(Py_None);
2779 return Py_None;
2780}
2781
2782static char PySSL_RAND_add_doc[] =
2783"RAND_add(string, entropy)\n\
2784\n\
2785Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
2786bound on the entropy contained in string.";
2787
2788static PyObject *
2789PySSL_RAND_status(PyObject *self)
2790{
2791 return PyInt_FromLong(RAND_status());
2792}
2793
2794static char PySSL_RAND_status_doc[] =
2795"RAND_status() -> 0 or 1\n\
2796\n\
2797Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
2798It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
2799using the ssl() function.";
2800
2801static PyObject *
2802PySSL_RAND_egd(PyObject *self, PyObject *arg)
2803{
2804 int bytes;
2805
2806 if (!PyString_Check(arg))
2807 return PyErr_Format(PyExc_TypeError,
2808 "RAND_egd() expected string, found %s",
2809 arg->ob_type->tp_name);
2810 bytes = RAND_egd(PyString_AS_STRING(arg));
2811 if (bytes == -1) {
2812 PyErr_SetString(PySSLErrorObject,
2813 "EGD connection failed or EGD did not return "
2814 "enough data to seed the PRNG");
2815 return NULL;
2816 }
2817 return PyInt_FromLong(bytes);
2818}
2819
2820static char PySSL_RAND_egd_doc[] =
Guido van Rossumcad8fa12001-10-19 12:40:40 +00002821"RAND_egd(path) -> bytes\n\
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002822\n\
2823Queries the entropy gather daemon (EGD) on socket path. Returns number\n\
2824of bytes read. Raises socket.sslerror if connection to EGD fails or\n\
2825if it does provide enough data to seed PRNG.";
2826
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002827#endif /* USE_SSL */
2828
2829
Guido van Rossum30a685f1991-06-27 15:51:29 +00002830/* List of functions exported by this module. */
2831
Guido van Rossum73624e91994-10-10 17:59:00 +00002832static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002833 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002834 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002835 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002836 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002837 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002838 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002839 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002840 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002841 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002842 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002843 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002844 METH_VARARGS,getprotobyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002845 {"socket", PySocket_socket,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002846 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002847#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002848 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002849 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002850#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002851 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002852 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002853 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002854 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002855 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002856 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002857 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002858 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002859 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002860 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002861 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002862 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002863 {"getaddrinfo", PySocket_getaddrinfo,
2864 METH_VARARGS, getaddrinfo_doc},
2865 {"getnameinfo", PySocket_getnameinfo,
2866 METH_VARARGS, getnameinfo_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002867#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002868 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002869 METH_VARARGS, ssl_doc},
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002870 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
2871 PySSL_RAND_add_doc},
2872 {"RAND_egd", PySSL_RAND_egd, METH_O,
2873 PySSL_RAND_egd_doc},
2874 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
2875 PySSL_RAND_status_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002876#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002877 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002878};
2879
Guido van Rossum30a685f1991-06-27 15:51:29 +00002880
2881/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002882 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002883 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002884 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002885static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002886insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002887{
Guido van Rossum73624e91994-10-10 17:59:00 +00002888 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002889 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002890 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002891
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002892 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002893}
2894
Guido van Rossum30a685f1991-06-27 15:51:29 +00002895
Guido van Rossum8d665e61996-06-26 18:22:49 +00002896#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002897
2898/* Additional initialization and cleanup for NT/Windows */
2899
2900static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002901NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002902{
2903 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002904}
2905
2906static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002907NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002908{
2909 WSADATA WSAData;
2910 int ret;
2911 char buf[100];
2912 ret = WSAStartup(0x0101, &WSAData);
2913 switch (ret) {
2914 case 0: /* no error */
2915 atexit(NTcleanup);
2916 return 1;
2917 case WSASYSNOTREADY:
2918 PyErr_SetString(PyExc_ImportError,
2919 "WSAStartup failed: network not ready");
2920 break;
2921 case WSAVERNOTSUPPORTED:
2922 case WSAEINVAL:
2923 PyErr_SetString(PyExc_ImportError,
2924 "WSAStartup failed: requested version not supported");
2925 break;
2926 default:
2927 sprintf(buf, "WSAStartup failed: error code %d", ret);
2928 PyErr_SetString(PyExc_ImportError, buf);
2929 break;
2930 }
2931 return 0;
2932}
2933
Guido van Rossum8d665e61996-06-26 18:22:49 +00002934#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002935
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002936#if defined(PYOS_OS2)
2937
2938/* Additional initialization and cleanup for OS/2 */
2939
2940static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002941OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002942{
2943 /* No cleanup is necessary for OS/2 Sockets */
2944}
2945
2946static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002947OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002948{
2949 char reason[64];
2950 int rc = sock_init();
2951
2952 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002953 atexit(OS2cleanup);
2954 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002955 }
2956
2957 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2958 PyErr_SetString(PyExc_ImportError, reason);
2959
Guido van Rossum32c575d1997-12-02 20:37:32 +00002960 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002961}
2962
2963#endif /* PYOS_OS2 */
2964
Guido van Rossum30a685f1991-06-27 15:51:29 +00002965/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002966 * This is called when the first 'import socket' is done,
2967 * via a table in config.c, if config.c is compiled with USE_SOCKET
2968 * defined.
2969 *
2970 * For MS_WINDOWS (which means any Windows variant), this module
2971 * is actually called "_socket", and there's a wrapper "socket.py"
2972 * which implements some missing functionality (such as makefile(),
2973 * dup() and fromfd()). The import of "_socket" may fail with an
2974 * ImportError exception if initialization of WINSOCK fails. When
2975 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2976 * scheduled to be made at exit time.
2977 *
2978 * For OS/2, this module is also called "_socket" and uses a wrapper
2979 * "socket.py" which implements that functionality that is missing
2980 * when PC operating systems don't put socket descriptors in the
2981 * operating system's filesystem layer.
2982 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002983
Guido van Rossum82a5c661998-07-07 20:45:43 +00002984static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002985"Implementation module for socket operations. See the socket module\n\
2986for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002987
2988static char sockettype_doc[] =
2989"A socket represents one endpoint of a network connection.\n\
2990\n\
2991Methods:\n\
2992\n\
2993accept() -- accept a connection, returning new socket and client address\n\
2994bind() -- bind the socket to a local address\n\
2995close() -- close the socket\n\
2996connect() -- connect the socket to a remote address\n\
2997connect_ex() -- connect, return an error code instead of an exception \n\
2998dup() -- return a new socket object identical to the current one (*)\n\
2999fileno() -- return underlying file descriptor\n\
3000getpeername() -- return remote address (*)\n\
3001getsockname() -- return local address\n\
3002getsockopt() -- get socket options\n\
3003listen() -- start listening for incoming connections\n\
3004makefile() -- return a file object corresponding tot the socket (*)\n\
3005recv() -- receive data\n\
3006recvfrom() -- receive data and sender's address\n\
3007send() -- send data\n\
3008sendto() -- send data to a given address\n\
3009setblocking() -- set or clear the blocking I/O flag\n\
3010setsockopt() -- set socket options\n\
3011shutdown() -- shut down traffic in one or both directions\n\
3012\n\
3013(*) not available on all platforms!)";
3014
Guido van Rossum3886bb61998-12-04 18:50:17 +00003015DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003016init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003017{
Guido van Rossum73624e91994-10-10 17:59:00 +00003018 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003019#ifdef RISCOS
3020 _kernel_swi_regs r;
3021 r.r[0]=0;
3022 _kernel_swi(0x43380, &r, &r);
3023 taskwindow = r.r[0];
3024#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00003025#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00003026 if (!NTinit())
3027 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00003028#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00003029#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003030 if (!OS2init())
3031 return;
Fred Drakea136d492000-08-16 14:18:30 +00003032#endif /* __TOS_OS2__ */
3033#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00003034#endif /* RISCOS */
Guido van Rossuma120ffc2001-01-22 15:29:14 +00003035#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003036 PySSL_Type.ob_type = &PyType_Type;
Guido van Rossuma120ffc2001-01-22 15:29:14 +00003037#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00003038 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00003039 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003040 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
3041 if (PySocket_Error == NULL)
3042 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003043 PyDict_SetItemString(d, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003044 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
3045 if (PyH_Error == NULL)
3046 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003047 PyDict_SetItemString(d, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003048 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
3049 NULL);
3050 if (PyGAI_Error == NULL)
3051 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003052 PyDict_SetItemString(d, "gaierror", PyGAI_Error);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003053#ifdef USE_SSL
3054 SSL_load_error_strings();
3055 SSLeay_add_ssl_algorithms();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003056 PySSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
3057 if (PySSLErrorObject == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003058 return;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003059 PyDict_SetItemString(d, "sslerror", PySSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003060 if (PyDict_SetItemString(d, "SSLType",
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003061 (PyObject *)&PySSL_Type) != 0)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003062 return;
Jeremy Hylton57ca8732001-10-11 00:00:17 +00003063 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
3064 SSL_ERROR_ZERO_RETURN);
3065 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
3066 SSL_ERROR_WANT_READ);
3067 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
3068 SSL_ERROR_WANT_WRITE);
3069 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
3070 SSL_ERROR_WANT_X509_LOOKUP);
3071 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
3072 SSL_ERROR_SYSCALL);
3073 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
3074 SSL_ERROR_SSL);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003075#endif /* USE_SSL */
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00003076 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00003077 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum91ba64d1997-06-02 22:18:09 +00003078 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00003079 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003080 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003081
3082 /* Address families (we only support AF_INET and AF_UNIX) */
3083#ifdef AF_UNSPEC
3084 insint(d, "AF_UNSPEC", AF_UNSPEC);
3085#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003086 insint(d, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003087#ifdef AF_INET6
3088 insint(d, "AF_INET6", AF_INET6);
3089#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003090#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003091 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003092#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003093#ifdef AF_AX25
3094 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
3095#endif
3096#ifdef AF_IPX
3097 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
3098#endif
3099#ifdef AF_APPLETALK
3100 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
3101#endif
3102#ifdef AF_NETROM
3103 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
3104#endif
3105#ifdef AF_BRIDGE
3106 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
3107#endif
3108#ifdef AF_AAL5
3109 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
3110#endif
3111#ifdef AF_X25
3112 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
3113#endif
3114#ifdef AF_INET6
3115 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
3116#endif
3117#ifdef AF_ROSE
3118 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
3119#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003120#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00003121 insint(d, "AF_PACKET", AF_PACKET);
3122 insint(d, "PF_PACKET", PF_PACKET);
3123 insint(d, "PACKET_HOST", PACKET_HOST);
3124 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
3125 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
3126 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3127 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
3128 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3129 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003130#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003131
3132 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003133 insint(d, "SOCK_STREAM", SOCK_STREAM);
3134 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003135#ifndef __BEOS__
3136/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003137 insint(d, "SOCK_RAW", SOCK_RAW);
3138 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3139 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003140#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003141
3142#ifdef SO_DEBUG
3143 insint(d, "SO_DEBUG", SO_DEBUG);
3144#endif
3145#ifdef SO_ACCEPTCONN
3146 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
3147#endif
3148#ifdef SO_REUSEADDR
3149 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
3150#endif
3151#ifdef SO_KEEPALIVE
3152 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
3153#endif
3154#ifdef SO_DONTROUTE
3155 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
3156#endif
3157#ifdef SO_BROADCAST
3158 insint(d, "SO_BROADCAST", SO_BROADCAST);
3159#endif
3160#ifdef SO_USELOOPBACK
3161 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
3162#endif
3163#ifdef SO_LINGER
3164 insint(d, "SO_LINGER", SO_LINGER);
3165#endif
3166#ifdef SO_OOBINLINE
3167 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
3168#endif
3169#ifdef SO_REUSEPORT
3170 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
3171#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003172#ifdef SO_SNDBUF
3173 insint(d, "SO_SNDBUF", SO_SNDBUF);
3174#endif
3175#ifdef SO_RCVBUF
3176 insint(d, "SO_RCVBUF", SO_RCVBUF);
3177#endif
3178#ifdef SO_SNDLOWAT
3179 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
3180#endif
3181#ifdef SO_RCVLOWAT
3182 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
3183#endif
3184#ifdef SO_SNDTIMEO
3185 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
3186#endif
3187#ifdef SO_RCVTIMEO
3188 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
3189#endif
3190#ifdef SO_ERROR
3191 insint(d, "SO_ERROR", SO_ERROR);
3192#endif
3193#ifdef SO_TYPE
3194 insint(d, "SO_TYPE", SO_TYPE);
3195#endif
3196
3197 /* Maximum number of connections for "listen" */
3198#ifdef SOMAXCONN
3199 insint(d, "SOMAXCONN", SOMAXCONN);
3200#else
3201 insint(d, "SOMAXCONN", 5); /* Common value */
3202#endif
3203
3204 /* Flags for send, recv */
3205#ifdef MSG_OOB
3206 insint(d, "MSG_OOB", MSG_OOB);
3207#endif
3208#ifdef MSG_PEEK
3209 insint(d, "MSG_PEEK", MSG_PEEK);
3210#endif
3211#ifdef MSG_DONTROUTE
3212 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
3213#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003214#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00003215 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003216#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003217#ifdef MSG_EOR
3218 insint(d, "MSG_EOR", MSG_EOR);
3219#endif
3220#ifdef MSG_TRUNC
3221 insint(d, "MSG_TRUNC", MSG_TRUNC);
3222#endif
3223#ifdef MSG_CTRUNC
3224 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
3225#endif
3226#ifdef MSG_WAITALL
3227 insint(d, "MSG_WAITALL", MSG_WAITALL);
3228#endif
3229#ifdef MSG_BTAG
3230 insint(d, "MSG_BTAG", MSG_BTAG);
3231#endif
3232#ifdef MSG_ETAG
3233 insint(d, "MSG_ETAG", MSG_ETAG);
3234#endif
3235
3236 /* Protocol level and numbers, usable for [gs]etsockopt */
3237#ifdef SOL_SOCKET
3238 insint(d, "SOL_SOCKET", SOL_SOCKET);
3239#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003240#ifdef SOL_IP
3241 insint(d, "SOL_IP", SOL_IP);
3242#else
3243 insint(d, "SOL_IP", 0);
3244#endif
3245#ifdef SOL_IPX
3246 insint(d, "SOL_IPX", SOL_IPX);
3247#endif
3248#ifdef SOL_AX25
3249 insint(d, "SOL_AX25", SOL_AX25);
3250#endif
3251#ifdef SOL_ATALK
3252 insint(d, "SOL_ATALK", SOL_ATALK);
3253#endif
3254#ifdef SOL_NETROM
3255 insint(d, "SOL_NETROM", SOL_NETROM);
3256#endif
3257#ifdef SOL_ROSE
3258 insint(d, "SOL_ROSE", SOL_ROSE);
3259#endif
3260#ifdef SOL_TCP
3261 insint(d, "SOL_TCP", SOL_TCP);
3262#else
3263 insint(d, "SOL_TCP", 6);
3264#endif
3265#ifdef SOL_UDP
3266 insint(d, "SOL_UDP", SOL_UDP);
3267#else
3268 insint(d, "SOL_UDP", 17);
3269#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003270#ifdef IPPROTO_IP
3271 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003272#else
3273 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003274#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003275#ifdef IPPROTO_HOPOPTS
3276 insint(d, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
3277#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003278#ifdef IPPROTO_ICMP
3279 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003280#else
3281 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003282#endif
3283#ifdef IPPROTO_IGMP
3284 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
3285#endif
3286#ifdef IPPROTO_GGP
3287 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
3288#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003289#ifdef IPPROTO_IPV4
3290 insint(d, "IPPROTO_IPV4", IPPROTO_IPV4);
3291#endif
3292#ifdef IPPROTO_IPIP
3293 insint(d, "IPPROTO_IPIP", IPPROTO_IPIP);
3294#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003295#ifdef IPPROTO_TCP
3296 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003297#else
3298 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003299#endif
3300#ifdef IPPROTO_EGP
3301 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
3302#endif
3303#ifdef IPPROTO_PUP
3304 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
3305#endif
3306#ifdef IPPROTO_UDP
3307 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003308#else
3309 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003310#endif
3311#ifdef IPPROTO_IDP
3312 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
3313#endif
3314#ifdef IPPROTO_HELLO
3315 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
3316#endif
3317#ifdef IPPROTO_ND
3318 insint(d, "IPPROTO_ND", IPPROTO_ND);
3319#endif
3320#ifdef IPPROTO_TP
3321 insint(d, "IPPROTO_TP", IPPROTO_TP);
3322#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003323#ifdef IPPROTO_IPV6
3324 insint(d, "IPPROTO_IPV6", IPPROTO_IPV6);
3325#endif
3326#ifdef IPPROTO_ROUTING
3327 insint(d, "IPPROTO_ROUTING", IPPROTO_ROUTING);
3328#endif
3329#ifdef IPPROTO_FRAGMENT
3330 insint(d, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
3331#endif
3332#ifdef IPPROTO_RSVP
3333 insint(d, "IPPROTO_RSVP", IPPROTO_RSVP);
3334#endif
3335#ifdef IPPROTO_GRE
3336 insint(d, "IPPROTO_GRE", IPPROTO_GRE);
3337#endif
3338#ifdef IPPROTO_ESP
3339 insint(d, "IPPROTO_ESP", IPPROTO_ESP);
3340#endif
3341#ifdef IPPROTO_AH
3342 insint(d, "IPPROTO_AH", IPPROTO_AH);
3343#endif
3344#ifdef IPPROTO_MOBILE
3345 insint(d, "IPPROTO_MOBILE", IPPROTO_MOBILE);
3346#endif
3347#ifdef IPPROTO_ICMPV6
3348 insint(d, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
3349#endif
3350#ifdef IPPROTO_NONE
3351 insint(d, "IPPROTO_NONE", IPPROTO_NONE);
3352#endif
3353#ifdef IPPROTO_DSTOPTS
3354 insint(d, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
3355#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003356#ifdef IPPROTO_XTP
3357 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
3358#endif
3359#ifdef IPPROTO_EON
3360 insint(d, "IPPROTO_EON", IPPROTO_EON);
3361#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003362#ifdef IPPROTO_PIM
3363 insint(d, "IPPROTO_PIM", IPPROTO_PIM);
3364#endif
3365#ifdef IPPROTO_IPCOMP
3366 insint(d, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
3367#endif
3368#ifdef IPPROTO_VRRP
3369 insint(d, "IPPROTO_VRRP", IPPROTO_VRRP);
3370#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003371#ifdef IPPROTO_BIP
3372 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
3373#endif
3374/**/
3375#ifdef IPPROTO_RAW
3376 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003377#else
3378 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003379#endif
3380#ifdef IPPROTO_MAX
3381 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
3382#endif
3383
3384 /* Some port configuration */
3385#ifdef IPPORT_RESERVED
3386 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
3387#else
3388 insint(d, "IPPORT_RESERVED", 1024);
3389#endif
3390#ifdef IPPORT_USERRESERVED
3391 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
3392#else
3393 insint(d, "IPPORT_USERRESERVED", 5000);
3394#endif
3395
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003396 /* Some reserved IP v.4 addresses */
3397#ifdef INADDR_ANY
3398 insint(d, "INADDR_ANY", INADDR_ANY);
3399#else
3400 insint(d, "INADDR_ANY", 0x00000000);
3401#endif
3402#ifdef INADDR_BROADCAST
3403 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
3404#else
3405 insint(d, "INADDR_BROADCAST", 0xffffffff);
3406#endif
3407#ifdef INADDR_LOOPBACK
3408 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
3409#else
3410 insint(d, "INADDR_LOOPBACK", 0x7F000001);
3411#endif
3412#ifdef INADDR_UNSPEC_GROUP
3413 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
3414#else
3415 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
3416#endif
3417#ifdef INADDR_ALLHOSTS_GROUP
3418 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
3419#else
3420 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
3421#endif
3422#ifdef INADDR_MAX_LOCAL_GROUP
3423 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
3424#else
3425 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
3426#endif
3427#ifdef INADDR_NONE
3428 insint(d, "INADDR_NONE", INADDR_NONE);
3429#else
3430 insint(d, "INADDR_NONE", 0xffffffff);
3431#endif
3432
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003433 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003434#ifdef IP_OPTIONS
3435 insint(d, "IP_OPTIONS", IP_OPTIONS);
3436#endif
3437#ifdef IP_HDRINCL
3438 insint(d, "IP_HDRINCL", IP_HDRINCL);
3439#endif
3440#ifdef IP_TOS
3441 insint(d, "IP_TOS", IP_TOS);
3442#endif
3443#ifdef IP_TTL
3444 insint(d, "IP_TTL", IP_TTL);
3445#endif
3446#ifdef IP_RECVOPTS
3447 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
3448#endif
3449#ifdef IP_RECVRETOPTS
3450 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
3451#endif
3452#ifdef IP_RECVDSTADDR
3453 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
3454#endif
3455#ifdef IP_RETOPTS
3456 insint(d, "IP_RETOPTS", IP_RETOPTS);
3457#endif
3458#ifdef IP_MULTICAST_IF
3459 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
3460#endif
3461#ifdef IP_MULTICAST_TTL
3462 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
3463#endif
3464#ifdef IP_MULTICAST_LOOP
3465 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
3466#endif
3467#ifdef IP_ADD_MEMBERSHIP
3468 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
3469#endif
3470#ifdef IP_DROP_MEMBERSHIP
3471 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
3472#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003473#ifdef IP_DEFAULT_MULTICAST_TTL
3474 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
3475#endif
3476#ifdef IP_DEFAULT_MULTICAST_LOOP
3477 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
3478#endif
3479#ifdef IP_MAX_MEMBERSHIPS
3480 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
3481#endif
3482
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003483 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3484#ifdef IPV6_JOIN_GROUP
3485 insint(d, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
3486#endif
3487#ifdef IPV6_LEAVE_GROUP
3488 insint(d, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
3489#endif
3490#ifdef IPV6_MULTICAST_HOPS
3491 insint(d, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
3492#endif
3493#ifdef IPV6_MULTICAST_IF
3494 insint(d, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
3495#endif
3496#ifdef IPV6_MULTICAST_LOOP
3497 insint(d, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
3498#endif
3499#ifdef IPV6_UNICAST_HOPS
3500 insint(d, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
3501#endif
3502
Guido van Rossum09be4091999-08-09 14:40:40 +00003503 /* TCP options */
3504#ifdef TCP_NODELAY
3505 insint(d, "TCP_NODELAY", TCP_NODELAY);
3506#endif
3507#ifdef TCP_MAXSEG
3508 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
3509#endif
3510
3511 /* IPX options */
3512#ifdef IPX_TYPE
3513 insint(d, "IPX_TYPE", IPX_TYPE);
3514#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003515
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003516 /* get{addr,name}info parameters */
3517#ifdef EAI_ADDRFAMILY
3518 insint(d, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
3519#endif
3520#ifdef EAI_AGAIN
3521 insint(d, "EAI_AGAIN", EAI_AGAIN);
3522#endif
3523#ifdef EAI_BADFLAGS
3524 insint(d, "EAI_BADFLAGS", EAI_BADFLAGS);
3525#endif
3526#ifdef EAI_FAIL
3527 insint(d, "EAI_FAIL", EAI_FAIL);
3528#endif
3529#ifdef EAI_FAMILY
3530 insint(d, "EAI_FAMILY", EAI_FAMILY);
3531#endif
3532#ifdef EAI_MEMORY
3533 insint(d, "EAI_MEMORY", EAI_MEMORY);
3534#endif
3535#ifdef EAI_NODATA
3536 insint(d, "EAI_NODATA", EAI_NODATA);
3537#endif
3538#ifdef EAI_NONAME
3539 insint(d, "EAI_NONAME", EAI_NONAME);
3540#endif
3541#ifdef EAI_SERVICE
3542 insint(d, "EAI_SERVICE", EAI_SERVICE);
3543#endif
3544#ifdef EAI_SOCKTYPE
3545 insint(d, "EAI_SOCKTYPE", EAI_SOCKTYPE);
3546#endif
3547#ifdef EAI_SYSTEM
3548 insint(d, "EAI_SYSTEM", EAI_SYSTEM);
3549#endif
3550#ifdef EAI_BADHINTS
3551 insint(d, "EAI_BADHINTS", EAI_BADHINTS);
3552#endif
3553#ifdef EAI_PROTOCOL
3554 insint(d, "EAI_PROTOCOL", EAI_PROTOCOL);
3555#endif
3556#ifdef EAI_MAX
3557 insint(d, "EAI_MAX", EAI_MAX);
3558#endif
3559#ifdef AI_PASSIVE
3560 insint(d, "AI_PASSIVE", AI_PASSIVE);
3561#endif
3562#ifdef AI_CANONNAME
3563 insint(d, "AI_CANONNAME", AI_CANONNAME);
3564#endif
3565#ifdef AI_NUMERICHOST
3566 insint(d, "AI_NUMERICHOST", AI_NUMERICHOST);
3567#endif
3568#ifdef AI_MASK
3569 insint(d, "AI_MASK", AI_MASK);
3570#endif
3571#ifdef AI_ALL
3572 insint(d, "AI_ALL", AI_ALL);
3573#endif
3574#ifdef AI_V4MAPPED_CFG
3575 insint(d, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
3576#endif
3577#ifdef AI_ADDRCONFIG
3578 insint(d, "AI_ADDRCONFIG", AI_ADDRCONFIG);
3579#endif
3580#ifdef AI_V4MAPPED
3581 insint(d, "AI_V4MAPPED", AI_V4MAPPED);
3582#endif
3583#ifdef AI_DEFAULT
3584 insint(d, "AI_DEFAULT", AI_DEFAULT);
3585#endif
3586#ifdef NI_MAXHOST
3587 insint(d, "NI_MAXHOST", NI_MAXHOST);
3588#endif
3589#ifdef NI_MAXSERV
3590 insint(d, "NI_MAXSERV", NI_MAXSERV);
3591#endif
3592#ifdef NI_NOFQDN
3593 insint(d, "NI_NOFQDN", NI_NOFQDN);
3594#endif
3595#ifdef NI_NUMERICHOST
3596 insint(d, "NI_NUMERICHOST", NI_NUMERICHOST);
3597#endif
3598#ifdef NI_NAMEREQD
3599 insint(d, "NI_NAMEREQD", NI_NAMEREQD);
3600#endif
3601#ifdef NI_NUMERICSERV
3602 insint(d, "NI_NUMERICSERV", NI_NUMERICSERV);
3603#endif
3604#ifdef NI_DGRAM
3605 insint(d, "NI_DGRAM", NI_DGRAM);
3606#endif
3607
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003608 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003609#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003610 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003611#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003612}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003613
3614/* Simplistic emulation code for inet_pton that only works for IPv4 */
3615#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003616int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003617inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003618{
3619 if(af == AF_INET){
3620 long packed_addr;
3621#ifdef USE_GUSI1
3622 packed_addr = (long)inet_addr(src).s_addr;
3623#else
3624 packed_addr = inet_addr(src);
3625#endif
3626 if (packed_addr == INADDR_NONE)
3627 return 0;
3628 memcpy(dst, &packed_addr, 4);
3629 return 1;
3630 }
3631 /* Should set errno to EAFNOSUPPORT */
3632 return -1;
3633}
3634
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003635const char *
3636inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003637{
3638 if (af == AF_INET) {
3639 struct in_addr packed_addr;
3640 if (size < 16)
3641 /* Should set errno to ENOSPC. */
3642 return NULL;
3643 memcpy(&packed_addr, src, sizeof(packed_addr));
3644 return strncpy(dst, inet_ntoa(packed_addr), size);
3645 }
3646 /* Should set errno to EAFNOSUPPORT */
3647 return NULL;
3648}
3649#endif