blob: 0bb2e9acd886835b0b69cdc693414172bc8b46a9 [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öwis7c4b5fa2001-10-25 09:04:03 +0000616#if defined(__digital__) && defined(__unix__)
Martin v. Löwisb8fc9722001-10-24 17:35:46 +0000617 if (error == EAI_NONAME && af == AF_UNSPEC) {
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000618 /* On Tru64 V5.1, numeric-to-addr conversion
Martin v. Löwis861a65b2001-10-24 14:36:00 +0000619 fails if no address family is given. Assume IPv4 for now.*/
620 hints.ai_family = AF_INET;
621 error = getaddrinfo(name, NULL, &hints, &res);
622 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000623#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000624 if (error) {
625 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000626 return -1;
627 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000628 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
629 freeaddrinfo(res);
630 switch (addr_ret->sa_family) {
631 case AF_INET:
632 return 4;
633#ifdef INET6
634 case AF_INET6:
635 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000636#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000637 default:
638 PyErr_SetString(PySocket_Error, "unknown address family");
639 return -1;
640 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000641}
642
Guido van Rossum30a685f1991-06-27 15:51:29 +0000643
Guido van Rossum30a685f1991-06-27 15:51:29 +0000644/* Create a string object representing an IP address.
645 This is always a string of the form 'dd.dd.dd.dd' (with variable
646 size numbers). */
647
Guido van Rossum73624e91994-10-10 17:59:00 +0000648static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000649makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000650{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000651 char buf[NI_MAXHOST];
652 int error;
653
654 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
655 NI_NUMERICHOST);
656 if (error) {
657 PyGAI_Err(error);
658 return NULL;
659 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000660 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000661}
662
663
664/* Create an object representing the given socket address,
665 suitable for passing it back to bind(), connect() etc.
666 The family field of the sockaddr structure is inspected
667 to determine what kind of address it really is. */
668
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000669/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000670static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000671makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000672{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000673 if (addrlen == 0) {
674 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000675 Py_INCREF(Py_None);
676 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000677 }
678
Guido van Rossumbcc20741998-08-04 22:53:56 +0000679#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000680 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000681 addr->sa_family = AF_INET;
682#endif
683
Guido van Rossum30a685f1991-06-27 15:51:29 +0000684 switch (addr->sa_family) {
685
686 case AF_INET:
687 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000688 struct sockaddr_in *a;
689 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000690 PyObject *ret = NULL;
691 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000692 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000693 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
694 Py_DECREF(addrobj);
695 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000696 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000697 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000698
Guido van Rossumb6775db1994-08-01 11:34:53 +0000699#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000700 case AF_UNIX:
701 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000702 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000703 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000704 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000705#endif /* AF_UNIX */
706
707#ifdef INET6
708 case AF_INET6:
709 {
710 struct sockaddr_in6 *a;
711 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
712 PyObject *ret = NULL;
713 if (addrobj) {
714 a = (struct sockaddr_in6 *)addr;
715 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
716 a->sin6_flowinfo, a->sin6_scope_id);
717 Py_DECREF(addrobj);
718 }
719 return ret;
720 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000721#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000722
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000723#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000724 case AF_PACKET:
725 {
726 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
727 char *ifname = "";
728 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000729 /* need to look up interface name give index */
730 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000731 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000732 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000733 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000734 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000735 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000736 a->sll_pkttype, a->sll_hatype,
737 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000738 }
739#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000740
Guido van Rossum30a685f1991-06-27 15:51:29 +0000741 /* More cases here... */
742
743 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000744 /* If we don't know the address family, don't raise an
745 exception -- return it as a tuple. */
746 return Py_BuildValue("is#",
747 addr->sa_family,
748 addr->sa_data,
749 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000750
Guido van Rossum30a685f1991-06-27 15:51:29 +0000751 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000752}
753
Guido van Rossum30a685f1991-06-27 15:51:29 +0000754
755/* Parse a socket address argument according to the socket object's
756 address family. Return 1 if the address was in the proper format,
757 0 of not. The address is returned through addr_ret, its length
758 through len_ret. */
759
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000760static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000761getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000762 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000763{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000764 switch (s->sock_family) {
765
Guido van Rossumb6775db1994-08-01 11:34:53 +0000766#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000767 case AF_UNIX:
768 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000769 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000770 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000771 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000772 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000773 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000774 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000775 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000776 PyErr_SetString(PySocket_Error,
777 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000778 return 0;
779 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000780 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000781 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000782 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000783 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000784 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000785 return 1;
786 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000787#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000788
Guido van Rossum30a685f1991-06-27 15:51:29 +0000789 case AF_INET:
790 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000791 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000792 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000793 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000794 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000795 if (!PyTuple_Check(args)) {
796 PyErr_Format(PyExc_TypeError,
797 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
798 args->ob_type->tp_name);
799 return 0;
800 }
801 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000802 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000803 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000804 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000805 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000806 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000807 *addr_ret = (struct sockaddr *) addr;
808 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000809 return 1;
810 }
811
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000812#ifdef INET6
813 case AF_INET6:
814 {
815 struct sockaddr_in6* addr;
816 char *host;
817 int port, flowinfo, scope_id;
818 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
819 flowinfo = scope_id = 0;
820 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
821 &scope_id)) {
822 return 0;
823 }
824 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
825 return 0;
826 addr->sin6_family = s->sock_family;
827 addr->sin6_port = htons((short)port);
828 addr->sin6_flowinfo = flowinfo;
829 addr->sin6_scope_id = scope_id;
830 *addr_ret = (struct sockaddr *) addr;
831 *len_ret = sizeof *addr;
832 return 1;
833 }
834#endif
835
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000836#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000837 case AF_PACKET:
838 {
839 struct sockaddr_ll* addr;
840 struct ifreq ifr;
841 char *interfaceName;
842 int protoNumber;
843 int hatype = 0;
844 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000845 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000846
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000847 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
848 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000849 return 0;
850 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
851 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000852 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +0000853 PySocket_Err();
Jeremy Hylton22308652001-02-02 03:23:09 +0000854 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000855 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000856 addr = &(s->sock_addr.ll);
857 addr->sll_family = AF_PACKET;
858 addr->sll_protocol = htons((short)protoNumber);
859 addr->sll_ifindex = ifr.ifr_ifindex;
860 addr->sll_pkttype = pkttype;
861 addr->sll_hatype = hatype;
862 *addr_ret = (struct sockaddr *) addr;
863 *len_ret = sizeof *addr;
864 return 1;
865 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000866#endif
867
Guido van Rossum30a685f1991-06-27 15:51:29 +0000868 /* More cases here... */
869
870 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000871 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000872 return 0;
873
874 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000875}
876
Guido van Rossum30a685f1991-06-27 15:51:29 +0000877
Guido van Rossum48a680c2001-03-02 06:34:14 +0000878/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000879 Return 1 if the family is known, 0 otherwise. The length is returned
880 through len_ret. */
881
882static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000883getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000884{
885 switch (s->sock_family) {
886
Guido van Rossumb6775db1994-08-01 11:34:53 +0000887#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000888 case AF_UNIX:
889 {
890 *len_ret = sizeof (struct sockaddr_un);
891 return 1;
892 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000893#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000894
895 case AF_INET:
896 {
897 *len_ret = sizeof (struct sockaddr_in);
898 return 1;
899 }
900
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000901#ifdef INET6
902 case AF_INET6:
903 {
904 *len_ret = sizeof (struct sockaddr_in6);
905 return 1;
906 }
907#endif
908
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000909#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000910 case AF_PACKET:
911 {
912 *len_ret = sizeof (struct sockaddr_ll);
913 return 1;
914 }
915#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000916
Guido van Rossum710e1df1992-06-12 10:39:36 +0000917 /* More cases here... */
918
919 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000920 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000921 return 0;
922
923 }
924}
925
926
Guido van Rossum30a685f1991-06-27 15:51:29 +0000927/* s.accept() method */
928
Guido van Rossum73624e91994-10-10 17:59:00 +0000929static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000930PySocketSock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000931{
932 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000933 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000934 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000935 PyObject *sock = NULL;
936 PyObject *addr = NULL;
937 PyObject *res = NULL;
938
Guido van Rossum710e1df1992-06-12 10:39:36 +0000939 if (!getsockaddrlen(s, &addrlen))
940 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000941 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000942 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000943 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000944 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000945#ifdef MS_WINDOWS
946 if (newfd == INVALID_SOCKET)
947#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000948 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000949#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000950 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000951
Guido van Rossum30a685f1991-06-27 15:51:29 +0000952 /* Create the new object with unspecified family,
953 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000954 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000955 s->sock_family,
956 s->sock_type,
957 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000958 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000959 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000960 goto finally;
961 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000962 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000963 addrlen);
964 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000965 goto finally;
966
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000967 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000968
969 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000970 Py_XDECREF(sock);
971 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000972 return res;
973}
974
Guido van Rossum82a5c661998-07-07 20:45:43 +0000975static char accept_doc[] =
976"accept() -> (socket object, address info)\n\
977\n\
978Wait for an incoming connection. Return a new socket representing the\n\
979connection, and the address of the client. For IP sockets, the address\n\
980info is a pair (hostaddr, port).";
981
Guido van Rossum30a685f1991-06-27 15:51:29 +0000982
Guido van Rossume4485b01994-09-07 14:32:49 +0000983/* s.setblocking(1 | 0) method */
984
Guido van Rossum73624e91994-10-10 17:59:00 +0000985static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000986PySocketSock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +0000987{
988 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000989#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000990#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000991 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000992#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000993#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000994 block = PyInt_AsLong(arg);
995 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +0000996 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000997 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000998#ifdef __BEOS__
999 block = !block;
1000 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
1001 (void *)(&block), sizeof( int ) );
1002#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001003#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001004#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001005#ifdef PYOS_OS2
1006 block = !block;
1007 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
1008#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +00001009 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
1010 if (block)
1011 delay_flag &= (~O_NDELAY);
1012 else
1013 delay_flag |= O_NDELAY;
1014 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001015#endif /* !PYOS_OS2 */
1016#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001017 block = !block;
1018 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001019#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +00001020#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001021#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001022 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +00001023
Guido van Rossum73624e91994-10-10 17:59:00 +00001024 Py_INCREF(Py_None);
1025 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001026}
Guido van Rossume4485b01994-09-07 14:32:49 +00001027
Guido van Rossum82a5c661998-07-07 20:45:43 +00001028static char setblocking_doc[] =
1029"setblocking(flag)\n\
1030\n\
1031Set the socket to blocking (flag is true) or non-blocking (false).\n\
1032This uses the FIONBIO ioctl with the O_NDELAY flag.";
1033
Guido van Rossume4485b01994-09-07 14:32:49 +00001034
Guido van Rossum48a680c2001-03-02 06:34:14 +00001035#ifdef RISCOS
1036/* s.sleeptaskw(1 | 0) method */
1037
1038static PyObject *
1039PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
1040{
1041 int block;
1042 int delay_flag;
1043 if (!PyArg_GetInt(args, &block))
1044 return NULL;
1045 Py_BEGIN_ALLOW_THREADS
1046 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1047 Py_END_ALLOW_THREADS
1048
1049 Py_INCREF(Py_None);
1050 return Py_None;
1051}
1052static char sleeptaskw_doc[] =
1053"sleeptaskw(flag)\n\
1054\n\
1055Allow sleeps in taskwindows.";
1056#endif
1057
1058
Guido van Rossumaee08791992-09-08 09:05:33 +00001059/* s.setsockopt() method.
1060 With an integer third argument, sets an integer option.
1061 With a string third argument, sets an option from a buffer;
1062 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001063
Guido van Rossum73624e91994-10-10 17:59:00 +00001064static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001065PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001066{
1067 int level;
1068 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001069 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001070 char *buf;
1071 int buflen;
1072 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001073
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001074 if (PyArg_ParseTuple(args, "iii:setsockopt",
1075 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001076 buf = (char *) &flag;
1077 buflen = sizeof flag;
1078 }
1079 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001080 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001081 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1082 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001083 return NULL;
1084 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001085 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001086 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001087 return PySocket_Err();
1088 Py_INCREF(Py_None);
1089 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001090}
1091
Guido van Rossum82a5c661998-07-07 20:45:43 +00001092static char setsockopt_doc[] =
1093"setsockopt(level, option, value)\n\
1094\n\
1095Set a socket option. See the Unix manual for level and option.\n\
1096The value argument can either be an integer or a string.";
1097
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001098
Guido van Rossumaee08791992-09-08 09:05:33 +00001099/* s.getsockopt() method.
1100 With two arguments, retrieves an integer option.
1101 With a third integer argument, retrieves a string buffer of that size;
1102 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001103
Guido van Rossum73624e91994-10-10 17:59:00 +00001104static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001105PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001106{
1107 int level;
1108 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001109 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001110 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001111 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001112
Guido van Rossumbcc20741998-08-04 22:53:56 +00001113#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001114 /* We have incomplete socket support. */
1115 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001116 return NULL;
1117#else
1118
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001119 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1120 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001121 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001122
Guido van Rossumbe32c891996-06-20 16:25:29 +00001123 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001124 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001125 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001126 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001127 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001128 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001129 return PySocket_Err();
1130 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001131 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001132 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001133 PyErr_SetString(PySocket_Error,
1134 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001135 return NULL;
1136 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001137 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001138 if (buf == NULL)
1139 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001140 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001141 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001142 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001143 Py_DECREF(buf);
1144 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +00001145 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001146 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001147 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001148#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001149}
1150
Guido van Rossum82a5c661998-07-07 20:45:43 +00001151static char getsockopt_doc[] =
1152"getsockopt(level, option[, buffersize]) -> value\n\
1153\n\
1154Get a socket option. See the Unix manual for level and option.\n\
1155If a nonzero buffersize argument is given, the return value is a\n\
1156string of that length; otherwise it is an integer.";
1157
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001158
Fred Drake728819a2000-07-01 03:40:12 +00001159/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001160
Guido van Rossum73624e91994-10-10 17:59:00 +00001161static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001162PySocketSock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001163{
1164 struct sockaddr *addr;
1165 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001166 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001167
Fred Drake728819a2000-07-01 03:40:12 +00001168 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001169 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001170 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001171 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001172 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001173 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001174 return PySocket_Err();
1175 Py_INCREF(Py_None);
1176 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001177}
1178
Guido van Rossum82a5c661998-07-07 20:45:43 +00001179static char bind_doc[] =
1180"bind(address)\n\
1181\n\
1182Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001183pair (host, port); the host must refer to the local host. For raw packet\n\
1184sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001185
Guido van Rossum30a685f1991-06-27 15:51:29 +00001186
1187/* s.close() method.
1188 Set the file descriptor to -1 so operations tried subsequently
1189 will surely fail. */
1190
Guido van Rossum73624e91994-10-10 17:59:00 +00001191static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001192PySocketSock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001193{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001194 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001195
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001196 if ((fd = s->sock_fd) != -1) {
1197 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001198 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001199 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001200 Py_END_ALLOW_THREADS
1201 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001202 Py_INCREF(Py_None);
1203 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001204}
1205
Guido van Rossum82a5c661998-07-07 20:45:43 +00001206static char close_doc[] =
1207"close()\n\
1208\n\
1209Close the socket. It cannot be used after this call.";
1210
Guido van Rossum30a685f1991-06-27 15:51:29 +00001211
Fred Drake728819a2000-07-01 03:40:12 +00001212/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001213
Guido van Rossum73624e91994-10-10 17:59:00 +00001214static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001215PySocketSock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001216{
1217 struct sockaddr *addr;
1218 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001219 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001220
Fred Drake728819a2000-07-01 03:40:12 +00001221 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001222 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001223 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001224 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001225 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001226 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001227 return PySocket_Err();
1228 Py_INCREF(Py_None);
1229 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001230}
1231
Guido van Rossum82a5c661998-07-07 20:45:43 +00001232static char connect_doc[] =
1233"connect(address)\n\
1234\n\
1235Connect the socket to a remote address. For IP sockets, the address\n\
1236is a pair (host, port).";
1237
Guido van Rossum30a685f1991-06-27 15:51:29 +00001238
Fred Drake728819a2000-07-01 03:40:12 +00001239/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001240
1241static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001242PySocketSock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001243{
1244 struct sockaddr *addr;
1245 int addrlen;
1246 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001247
Fred Drake728819a2000-07-01 03:40:12 +00001248 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001249 return NULL;
1250 Py_BEGIN_ALLOW_THREADS
1251 res = connect(s->sock_fd, addr, addrlen);
1252 Py_END_ALLOW_THREADS
1253 if (res != 0)
1254 res = errno;
1255 return PyInt_FromLong((long) res);
1256}
1257
Guido van Rossum82a5c661998-07-07 20:45:43 +00001258static char connect_ex_doc[] =
1259"connect_ex(address)\n\
1260\n\
1261This is like connect(address), but returns an error code (the errno value)\n\
1262instead of raising an exception when an error occurs.";
1263
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001264
Guido van Rossumed233a51992-06-23 09:07:03 +00001265/* s.fileno() method */
1266
Guido van Rossum73624e91994-10-10 17:59:00 +00001267static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001268PySocketSock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001269{
Fred Drakea04eaad2000-06-30 02:46:07 +00001270#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001271 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001272#else
1273 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1274#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001275}
1276
Guido van Rossum82a5c661998-07-07 20:45:43 +00001277static char fileno_doc[] =
1278"fileno() -> integer\n\
1279\n\
1280Return the integer file descriptor of the socket.";
1281
Guido van Rossumed233a51992-06-23 09:07:03 +00001282
Guido van Rossumbe32c891996-06-20 16:25:29 +00001283#ifndef NO_DUP
1284/* s.dup() method */
1285
1286static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001287PySocketSock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001288{
Fred Drakea04eaad2000-06-30 02:46:07 +00001289 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001290 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001291
Guido van Rossumbe32c891996-06-20 16:25:29 +00001292 newfd = dup(s->sock_fd);
1293 if (newfd < 0)
1294 return PySocket_Err();
1295 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001296 s->sock_family,
1297 s->sock_type,
1298 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001299 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001300 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001301 return sock;
1302}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001303
1304static char dup_doc[] =
1305"dup() -> socket object\n\
1306\n\
1307Return a new socket object connected to the same system resource.";
1308
Guido van Rossumbe32c891996-06-20 16:25:29 +00001309#endif
1310
1311
Guido van Rossumc89705d1992-11-26 08:54:07 +00001312/* s.getsockname() method */
1313
Guido van Rossum73624e91994-10-10 17:59:00 +00001314static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001315PySocketSock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001316{
1317 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001318 int res;
1319 socklen_t addrlen;
1320
Guido van Rossumc89705d1992-11-26 08:54:07 +00001321 if (!getsockaddrlen(s, &addrlen))
1322 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001323 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001324 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001325 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001326 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001327 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001328 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001329 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001330}
1331
Guido van Rossum82a5c661998-07-07 20:45:43 +00001332static char getsockname_doc[] =
1333"getsockname() -> address info\n\
1334\n\
1335Return the address of the local endpoint. For IP sockets, the address\n\
1336info is a pair (hostaddr, port).";
1337
Guido van Rossumc89705d1992-11-26 08:54:07 +00001338
Guido van Rossumb6775db1994-08-01 11:34:53 +00001339#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001340/* s.getpeername() method */
1341
Guido van Rossum73624e91994-10-10 17:59:00 +00001342static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001343PySocketSock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001344{
1345 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001346 int res;
1347 socklen_t addrlen;
1348
Guido van Rossumc89705d1992-11-26 08:54:07 +00001349 if (!getsockaddrlen(s, &addrlen))
1350 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001351 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001352 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001353 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001354 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001355 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001356 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001357 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001358}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001359
1360static char getpeername_doc[] =
1361"getpeername() -> address info\n\
1362\n\
1363Return the address of the remote endpoint. For IP sockets, the address\n\
1364info is a pair (hostaddr, port).";
1365
Guido van Rossumb6775db1994-08-01 11:34:53 +00001366#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001367
1368
Guido van Rossum30a685f1991-06-27 15:51:29 +00001369/* s.listen(n) method */
1370
Guido van Rossum73624e91994-10-10 17:59:00 +00001371static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001372PySocketSock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001373{
1374 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001375 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001376
1377 backlog = PyInt_AsLong(arg);
1378 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001379 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001380 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001381 if (backlog < 1)
1382 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001383 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001384 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001385 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001386 return PySocket_Err();
1387 Py_INCREF(Py_None);
1388 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001389}
1390
Guido van Rossum82a5c661998-07-07 20:45:43 +00001391static char listen_doc[] =
1392"listen(backlog)\n\
1393\n\
1394Enable a server to accept connections. The backlog argument must be at\n\
1395least 1; it specifies the number of unaccepted connection that the system\n\
1396will allow before refusing new connections.";
1397
1398
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001399#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001400/* s.makefile(mode) method.
1401 Create a new open file object referring to a dupped version of
1402 the socket's file descriptor. (The dup() call is necessary so
1403 that the open file and socket objects may be closed independent
1404 of each other.)
1405 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1406
Guido van Rossum73624e91994-10-10 17:59:00 +00001407static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001408PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001409{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001410 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001411 char *mode = "r";
1412 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001413#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001414 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001415#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001416 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001417#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001418 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001419 PyObject *f;
1420
Guido van Rossum43713e52000-02-29 13:59:29 +00001421 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001422 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001423#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001424 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1425 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001426#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001427 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001428#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001429 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001430 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001431 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001432 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001433 }
1434 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1435 if (f != NULL)
1436 PyFile_SetBufSize(f, bufsize);
1437 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001438}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001439
1440static char makefile_doc[] =
1441"makefile([mode[, buffersize]]) -> file object\n\
1442\n\
1443Return a regular file object corresponding to the socket.\n\
1444The mode and buffersize arguments are as for the built-in open() function.";
1445
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001446#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001447
Guido van Rossum48a680c2001-03-02 06:34:14 +00001448
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001449/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001450
Guido van Rossum73624e91994-10-10 17:59:00 +00001451static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001452PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001453{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001454 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001455 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001456 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001457 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001458 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001459 if (buf == NULL)
1460 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001461 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001462 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001463 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001464 if (n < 0) {
1465 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001466 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001467 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001468 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001469 return NULL;
1470 return buf;
1471}
1472
Guido van Rossum82a5c661998-07-07 20:45:43 +00001473static char recv_doc[] =
1474"recv(buffersize[, flags]) -> data\n\
1475\n\
1476Receive up to buffersize bytes from the socket. For the optional flags\n\
1477argument, see the Unix manual. When no data is available, block until\n\
1478at least one byte is available or until the remote end is closed. When\n\
1479the remote end is closed and all data is read, return the empty string.";
1480
Guido van Rossum30a685f1991-06-27 15:51:29 +00001481
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001482/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001483
Guido van Rossum73624e91994-10-10 17:59:00 +00001484static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001485PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001486{
1487 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001488 PyObject *buf = NULL;
1489 PyObject *addr = NULL;
1490 PyObject *ret = NULL;
1491
Guido van Rossumff3ab422000-04-24 15:16:03 +00001492 int len, n, flags = 0;
1493 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001494 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001495 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001496 if (!getsockaddrlen(s, &addrlen))
1497 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001498 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001499 if (buf == NULL)
1500 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001501 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001502 memset(addrbuf, 0, addrlen);
1503 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001504#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001505#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001506 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001507#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001508 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001509#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001510#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001511 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001512#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001513 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001514 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001515 if (n < 0) {
1516 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001517 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001518 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001519 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001520 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001521
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001522 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001523 goto finally;
1524
Guido van Rossum73624e91994-10-10 17:59:00 +00001525 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001526 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001527 Py_XDECREF(addr);
1528 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001529 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001530}
1531
Guido van Rossum82a5c661998-07-07 20:45:43 +00001532static char recvfrom_doc[] =
1533"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1534\n\
1535Like recv(buffersize, flags) but also return the sender's address info.";
1536
Guido van Rossum30a685f1991-06-27 15:51:29 +00001537
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001538/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001539
Guido van Rossum73624e91994-10-10 17:59:00 +00001540static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001541PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001542{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001543 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001544 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001545 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001546 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001547 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001548 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001549 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001550 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001551 return PySocket_Err();
1552 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001553}
1554
Guido van Rossum82a5c661998-07-07 20:45:43 +00001555static char send_doc[] =
1556"send(data[, flags])\n\
1557\n\
1558Send a data string to the socket. For the optional flags\n\
1559argument, see the Unix manual.";
1560
Guido van Rossum30a685f1991-06-27 15:51:29 +00001561
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001562/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001563
Guido van Rossum73624e91994-10-10 17:59:00 +00001564static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001565PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001566{
Guido van Rossum73624e91994-10-10 17:59:00 +00001567 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001568 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001569 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001570 int addrlen, len, n, flags;
1571 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001572 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001573 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001574 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1575 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001576 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001577 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001578 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001579 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001580 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001581 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001582 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001583 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001584 return PySocket_Err();
1585 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001586}
1587
Guido van Rossum82a5c661998-07-07 20:45:43 +00001588static char sendto_doc[] =
1589"sendto(data[, flags], address)\n\
1590\n\
1591Like send(data, flags) but allows specifying the destination address.\n\
1592For IP sockets, the address is a pair (hostaddr, port).";
1593
Guido van Rossum30a685f1991-06-27 15:51:29 +00001594
1595/* s.shutdown(how) method */
1596
Guido van Rossum73624e91994-10-10 17:59:00 +00001597static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001598PySocketSock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001599{
1600 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001601 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001602
1603 how = PyInt_AsLong(arg);
1604 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001605 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001606 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001607 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001608 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001609 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001610 return PySocket_Err();
1611 Py_INCREF(Py_None);
1612 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001613}
1614
Guido van Rossum82a5c661998-07-07 20:45:43 +00001615static char shutdown_doc[] =
1616"shutdown(flag)\n\
1617\n\
1618Shut down the reading side of the socket (flag == 0), the writing side\n\
1619of the socket (flag == 1), or both ends (flag == 2).";
1620
Guido van Rossum30a685f1991-06-27 15:51:29 +00001621
1622/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001623
Guido van Rossum73624e91994-10-10 17:59:00 +00001624static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum17209fc2001-10-15 21:12:54 +00001625 {"accept", (PyCFunction)PySocketSock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001626 accept_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001627 {"bind", (PyCFunction)PySocketSock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001628 bind_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00001629 {"close", (PyCFunction)PySocketSock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001630 close_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001631 {"connect", (PyCFunction)PySocketSock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001632 connect_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001633 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001634 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001635#ifndef NO_DUP
Guido van Rossum17209fc2001-10-15 21:12:54 +00001636 {"dup", (PyCFunction)PySocketSock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001637 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001638#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001639 {"fileno", (PyCFunction)PySocketSock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001640 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001641#ifdef HAVE_GETPEERNAME
Guido van Rossum17209fc2001-10-15 21:12:54 +00001642 {"getpeername", (PyCFunction)PySocketSock_getpeername,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001643 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001644#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001645 {"getsockname", (PyCFunction)PySocketSock_getsockname,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001646 METH_NOARGS, getsockname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001647 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1648 getsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001649 {"listen", (PyCFunction)PySocketSock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001650 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001651#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001652 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1653 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001654#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001655 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1656 recv_doc},
1657 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1658 recvfrom_doc},
1659 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1660 send_doc},
1661 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1662 sendto_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001663 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001664 setblocking_doc},
1665 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1666 setsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001667 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001668 shutdown_doc},
1669#ifdef RISCOS
1670 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1671 sleeptaskw_doc},
1672#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001673 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001674};
1675
Guido van Rossum30a685f1991-06-27 15:51:29 +00001676
Guido van Rossum73624e91994-10-10 17:59:00 +00001677/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001678 First close the file description. */
1679
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001680static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001681PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001682{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001683 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001684 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001685 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001686}
1687
Guido van Rossum30a685f1991-06-27 15:51:29 +00001688
1689/* Return a socket object's named attribute. */
1690
Guido van Rossum73624e91994-10-10 17:59:00 +00001691static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001692PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001693{
Guido van Rossum73624e91994-10-10 17:59:00 +00001694 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001695}
1696
Guido van Rossum30a685f1991-06-27 15:51:29 +00001697
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001698static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001699PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001700{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001701 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001702#if SIZEOF_SOCKET_T > SIZEOF_LONG
1703 if (s->sock_fd > LONG_MAX) {
1704 /* this can occur on Win64, and actually there is a special
1705 ugly printf formatter for decimal pointer length integer
1706 printing, only bother if necessary*/
1707 PyErr_SetString(PyExc_OverflowError,
1708 "no printf formatter to display the socket descriptor in decimal");
1709 return NULL;
1710 }
1711#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001712 sprintf(buf,
1713 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001714 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001715 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001716}
1717
1718
Guido van Rossumb6775db1994-08-01 11:34:53 +00001719/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001720
Guido van Rossum73624e91994-10-10 17:59:00 +00001721static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001722 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001723 0,
1724 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001725 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001726 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001727 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001728 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001729 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001730 0, /*tp_setattr*/
1731 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001732 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001733 0, /*tp_as_number*/
1734 0, /*tp_as_sequence*/
1735 0, /*tp_as_mapping*/
1736};
1737
Guido van Rossum30a685f1991-06-27 15:51:29 +00001738
Guido van Rossum81194471991-07-27 21:42:02 +00001739/* Python interface to gethostname(). */
1740
1741/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001742static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001743PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001744{
1745 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001746 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001747 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001748 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001749 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001750 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001751 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001752 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001753 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001754 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001755 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001756}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001757
Guido van Rossum82a5c661998-07-07 20:45:43 +00001758static char gethostname_doc[] =
1759"gethostname() -> string\n\
1760\n\
1761Return the current host name.";
1762
Guido van Rossumff4949e1992-08-05 19:58:53 +00001763
Guido van Rossum30a685f1991-06-27 15:51:29 +00001764/* Python interface to gethostbyname(name). */
1765
1766/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001767static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001768PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001769{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001770 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001771 struct sockaddr_storage addrbuf;
1772
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001773 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001774 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001775 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001776 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001777 return makeipaddr((struct sockaddr *)&addrbuf,
1778 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001779}
1780
Guido van Rossum82a5c661998-07-07 20:45:43 +00001781static char gethostbyname_doc[] =
1782"gethostbyname(host) -> address\n\
1783\n\
1784Return the IP address (a string of the form '255.255.255.255') for a host.";
1785
1786
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001787/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1788
1789static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001790gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001791{
1792 char **pch;
1793 PyObject *rtn_tuple = (PyObject *)NULL;
1794 PyObject *name_list = (PyObject *)NULL;
1795 PyObject *addr_list = (PyObject *)NULL;
1796 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001797
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001798 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001799 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001800#ifndef RISCOS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001801 PyH_Err(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001802#else
1803 PyErr_SetString(PySocket_Error, "host not found");
1804#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001805 return NULL;
1806 }
1807 if (h->h_addrtype != af) {
1808#ifdef HAVE_STRERROR
1809 /* Let's get real error message to return */
1810 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001811#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001812 PyErr_SetString(PySocket_Error,
1813 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001814#endif
1815 return NULL;
1816 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001817 switch (af) {
1818 case AF_INET:
1819 if (alen < sizeof(struct sockaddr_in))
1820 return NULL;
1821 break;
1822#ifdef INET6
1823 case AF_INET6:
1824 if (alen < sizeof(struct sockaddr_in6))
1825 return NULL;
1826 break;
1827#endif
1828 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001829 if ((name_list = PyList_New(0)) == NULL)
1830 goto err;
1831 if ((addr_list = PyList_New(0)) == NULL)
1832 goto err;
1833 for (pch = h->h_aliases; *pch != NULL; pch++) {
1834 int status;
1835 tmp = PyString_FromString(*pch);
1836 if (tmp == NULL)
1837 goto err;
1838 status = PyList_Append(name_list, tmp);
1839 Py_DECREF(tmp);
1840 if (status)
1841 goto err;
1842 }
1843 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1844 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001845 switch (af) {
1846 case AF_INET:
1847 {
1848 struct sockaddr_in sin;
1849 memset(&sin, 0, sizeof(sin));
1850 sin.sin_family = af;
1851#ifdef HAVE_SOCKADDR_SA_LEN
1852 sin.sin_len = sizeof(sin);
1853#endif
1854 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
1855 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
1856 if (pch == h->h_addr_list && alen >= sizeof(sin))
1857 memcpy((char *) addr, &sin, sizeof(sin));
1858 break;
1859 }
1860#ifdef INET6
1861 case AF_INET6:
1862 {
1863 struct sockaddr_in6 sin6;
1864 memset(&sin6, 0, sizeof(sin6));
1865 sin6.sin6_family = af;
1866#ifdef HAVE_SOCKADDR_SA_LEN
1867 sin6.sin6_len = sizeof(sin6);
1868#endif
1869 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
1870 tmp = makeipaddr((struct sockaddr *)&sin6,
1871 sizeof(sin6));
1872 if (pch == h->h_addr_list && alen >= sizeof(sin6))
1873 memcpy((char *) addr, &sin6, sizeof(sin6));
1874 break;
1875 }
1876#endif
1877 default: /* can't happen */
1878 PyErr_SetString(PySocket_Error,
1879 "unsupported address family");
1880 return NULL;
1881 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001882 if (tmp == NULL)
1883 goto err;
1884 status = PyList_Append(addr_list, tmp);
1885 Py_DECREF(tmp);
1886 if (status)
1887 goto err;
1888 }
1889 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1890 err:
1891 Py_XDECREF(name_list);
1892 Py_XDECREF(addr_list);
1893 return rtn_tuple;
1894}
1895
1896
1897/* Python interface to gethostbyname_ex(name). */
1898
1899/*ARGSUSED*/
1900static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001901PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001902{
1903 char *name;
1904 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001905 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001906 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00001907 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001908#ifdef HAVE_GETHOSTBYNAME_R
1909 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001910#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1911 struct hostent_data data;
1912#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001913 char buf[16384];
1914 int buf_len = (sizeof buf) - 1;
1915 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001916#endif
1917#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001918 int result;
1919#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001920#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001921
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001922 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001923 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001924 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001925 return NULL;
1926 Py_BEGIN_ALLOW_THREADS
1927#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001928#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001929 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001930#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001931 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001932#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001933 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001934 result = gethostbyname_r(name, &hp_allocated, &data);
1935 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001936#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001937#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001938#ifdef USE_GETHOSTBYNAME_LOCK
1939 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001940#endif
1941 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001942#endif /* HAVE_GETHOSTBYNAME_R */
1943 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001944 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
1945 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
1946 sa = (struct sockaddr*)&addr;
1947 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00001948#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001949 PyThread_release_lock(gethostbyname_lock);
1950#endif
1951 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001952}
1953
1954static char ghbn_ex_doc[] =
1955"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1956\n\
1957Return the true host name, a list of aliases, and a list of IP addresses,\n\
1958for a host. The host argument is a string giving a host name or IP number.";
1959
1960
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001961/* Python interface to gethostbyaddr(IP). */
1962
1963/*ARGSUSED*/
1964static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001965PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001966{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001967#ifdef INET6
1968 struct sockaddr_storage addr;
1969#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001970 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001971#endif
1972 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001973 char *ip_num;
1974 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001975 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001976#ifdef HAVE_GETHOSTBYNAME_R
1977 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001978#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1979 struct hostent_data data;
1980#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001981 char buf[16384];
1982 int buf_len = (sizeof buf) - 1;
1983 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001984#endif
1985#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001986 int result;
1987#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001988#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001989 char *ap;
1990 int al;
1991 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001992
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001993 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001994 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001995 af = PF_UNSPEC;
1996 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001997 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001998 af = sa->sa_family;
1999 ap = NULL;
2000 al = 0;
2001 switch (af) {
2002 case AF_INET:
2003 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2004 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2005 break;
2006#ifdef INET6
2007 case AF_INET6:
2008 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2009 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2010 break;
2011#endif
2012 default:
2013 PyErr_SetString(PySocket_Error, "unsupported address family");
2014 return NULL;
2015 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002016 Py_BEGIN_ALLOW_THREADS
2017#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002018#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002019 result = gethostbyaddr_r(ap, al, af,
2020 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002021 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002022#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002023 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002024 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002025#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002026 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002027 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002028 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002029#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002030#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002031#ifdef USE_GETHOSTBYNAME_LOCK
2032 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002033#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002034 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002035#endif /* HAVE_GETHOSTBYNAME_R */
2036 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002037 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002038#ifdef USE_GETHOSTBYNAME_LOCK
2039 PyThread_release_lock(gethostbyname_lock);
2040#endif
2041 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002042}
2043
Guido van Rossum82a5c661998-07-07 20:45:43 +00002044static char gethostbyaddr_doc[] =
2045"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2046\n\
2047Return the true host name, a list of aliases, and a list of IP addresses,\n\
2048for a host. The host argument is a string giving a host name or IP number.";
2049
Guido van Rossum30a685f1991-06-27 15:51:29 +00002050
2051/* Python interface to getservbyname(name).
2052 This only returns the port number, since the other info is already
2053 known or not useful (like the list of aliases). */
2054
2055/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002056static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002057PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002058{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002059 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002060 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002061 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002062 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002063 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002064 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002065 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002066 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002067 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002068 return NULL;
2069 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002070 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002071}
2072
Guido van Rossum82a5c661998-07-07 20:45:43 +00002073static char getservbyname_doc[] =
2074"getservbyname(servicename, protocolname) -> integer\n\
2075\n\
2076Return a port number from a service name and protocol name.\n\
2077The protocol name should be 'tcp' or 'udp'.";
2078
Guido van Rossum30a685f1991-06-27 15:51:29 +00002079
Guido van Rossum3901d851996-12-19 16:35:04 +00002080/* Python interface to getprotobyname(name).
2081 This only returns the protocol number, since the other info is
2082 already known or not useful (like the list of aliases). */
2083
2084/*ARGSUSED*/
2085static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002086PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002087{
2088 char *name;
2089 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002090#ifdef __BEOS__
2091/* Not available in BeOS yet. - [cjh] */
2092 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2093 return NULL;
2094#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002095 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002096 return NULL;
2097 Py_BEGIN_ALLOW_THREADS
2098 sp = getprotobyname(name);
2099 Py_END_ALLOW_THREADS
2100 if (sp == NULL) {
2101 PyErr_SetString(PySocket_Error, "protocol not found");
2102 return NULL;
2103 }
2104 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002105#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002106}
2107
Guido van Rossum82a5c661998-07-07 20:45:43 +00002108static char getprotobyname_doc[] =
2109"getprotobyname(name) -> integer\n\
2110\n\
2111Return the protocol number for the named protocol. (Rarely used.)";
2112
Guido van Rossum3901d851996-12-19 16:35:04 +00002113
Guido van Rossum30a685f1991-06-27 15:51:29 +00002114/* Python interface to socket(family, type, proto).
2115 The third (protocol) argument is optional.
2116 Return a new socket object. */
2117
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002118/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002119static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002120PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002121{
Guido van Rossum73624e91994-10-10 17:59:00 +00002122 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002123 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002124 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00002125 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002126 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002127 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002128 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002129 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00002130#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002131 if (fd == INVALID_SOCKET)
2132#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002133 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002134#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002135 return PySocket_Err();
2136 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002137 /* If the object can't be created, don't forget to close the
2138 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002139 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002140 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00002141 /* From now on, ignore SIGPIPE and let the error checking
2142 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002143#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00002144 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002145#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002146 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002147}
2148
Guido van Rossum82a5c661998-07-07 20:45:43 +00002149static char socket_doc[] =
2150"socket(family, type[, proto]) -> socket object\n\
2151\n\
2152Open a socket of the given type. The family argument specifies the\n\
2153address family; it is normally AF_INET, sometimes AF_UNIX.\n\
2154The type argument specifies whether this is a stream (SOCK_STREAM)\n\
2155or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
2156specifying the default protocol.";
2157
2158
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002159#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002160/* Create a socket object from a numeric file description.
2161 Useful e.g. if stdin is a socket.
2162 Additional arguments as for socket(). */
2163
2164/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002165static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002166PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002167{
Guido van Rossum73624e91994-10-10 17:59:00 +00002168 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002169 SOCKET_T fd;
2170 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002171 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2172 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002173 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002174 /* Dup the fd so it and the socket can be closed independently */
2175 fd = dup(fd);
2176 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002177 return PySocket_Err();
2178 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002179 /* From now on, ignore SIGPIPE and let the error checking
2180 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002181#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002182 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002183#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002184 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002185}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002186
2187static char fromfd_doc[] =
2188"fromfd(fd, family, type[, proto]) -> socket object\n\
2189\n\
2190Create a socket object from the given file descriptor.\n\
2191The remaining arguments are the same as for socket().";
2192
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002193#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002194
Guido van Rossum82a5c661998-07-07 20:45:43 +00002195
Guido van Rossum006bf911996-06-12 04:04:55 +00002196static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002197PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002198{
2199 int x1, x2;
2200
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002201 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002202 return NULL;
2203 }
2204 x2 = (int)ntohs((short)x1);
2205 return PyInt_FromLong(x2);
2206}
2207
Guido van Rossum82a5c661998-07-07 20:45:43 +00002208static char ntohs_doc[] =
2209"ntohs(integer) -> integer\n\
2210\n\
2211Convert a 16-bit integer from network to host byte order.";
2212
2213
Guido van Rossum006bf911996-06-12 04:04:55 +00002214static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002215PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002216{
2217 int x1, x2;
2218
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002219 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002220 return NULL;
2221 }
2222 x2 = ntohl(x1);
2223 return PyInt_FromLong(x2);
2224}
2225
Guido van Rossum82a5c661998-07-07 20:45:43 +00002226static char ntohl_doc[] =
2227"ntohl(integer) -> integer\n\
2228\n\
2229Convert a 32-bit integer from network to host byte order.";
2230
2231
Guido van Rossum006bf911996-06-12 04:04:55 +00002232static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002233PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002234{
2235 int x1, x2;
2236
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002237 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002238 return NULL;
2239 }
2240 x2 = (int)htons((short)x1);
2241 return PyInt_FromLong(x2);
2242}
2243
Guido van Rossum82a5c661998-07-07 20:45:43 +00002244static char htons_doc[] =
2245"htons(integer) -> integer\n\
2246\n\
2247Convert a 16-bit integer from host to network byte order.";
2248
2249
Guido van Rossum006bf911996-06-12 04:04:55 +00002250static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002251PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002252{
2253 int x1, x2;
2254
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002255 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002256 return NULL;
2257 }
2258 x2 = htonl(x1);
2259 return PyInt_FromLong(x2);
2260}
2261
Guido van Rossum82a5c661998-07-07 20:45:43 +00002262static char htonl_doc[] =
2263"htonl(integer) -> integer\n\
2264\n\
2265Convert a 32-bit integer from host to network byte order.";
2266
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002267/*
2268 * socket.inet_aton() and socket.inet_ntoa() functions
2269 *
2270 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2271 *
2272 */
2273
Guido van Rossum48a680c2001-03-02 06:34:14 +00002274static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002275"inet_aton(string) -> packed 32-bit IP representation\n\
2276\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002277Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002278binary format used in low-level network functions.";
2279
2280static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002281PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002282{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002283#ifndef INADDR_NONE
2284#define INADDR_NONE (-1)
2285#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002286
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002287 /* Have to use inet_addr() instead */
2288 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002289 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002290
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002291 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002292 return NULL;
2293 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002294#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002295 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002296#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002297 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002298#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002299
2300 if (packed_addr == INADDR_NONE) { /* invalid address */
2301 PyErr_SetString(PySocket_Error,
2302 "illegal IP address string passed to inet_aton");
2303 return NULL;
2304 }
2305
2306 return PyString_FromStringAndSize((char *) &packed_addr,
2307 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002308}
2309
Guido van Rossum48a680c2001-03-02 06:34:14 +00002310static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002311"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002312\n\
2313Convert an IP address from 32-bit packed binary format to string format";
2314
2315static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002316PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002317{
2318 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002319 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002320 struct in_addr packed_addr;
2321
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002322 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002323 return NULL;
2324 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002325
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002326 if (addr_len != sizeof(packed_addr)) {
2327 PyErr_SetString(PySocket_Error,
2328 "packed IP wrong length for inet_ntoa");
2329 return NULL;
2330 }
2331
2332 memcpy(&packed_addr, packed_str, addr_len);
2333
2334 return PyString_FromString(inet_ntoa(packed_addr));
2335}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002336
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002337/* Python interface to getaddrinfo(host, port). */
2338
2339/*ARGSUSED*/
2340static PyObject *
2341PySocket_getaddrinfo(PyObject *self, PyObject *args)
2342{
2343 struct addrinfo hints, *res0, *res;
2344 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002345 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002346 char *hptr, *pptr;
2347 int family, socktype, protocol, flags;
2348 int error;
2349 PyObject *all = (PyObject *)NULL;
2350 PyObject *single = (PyObject *)NULL;
2351
2352 family = socktype = protocol = flags = 0;
2353 family = PF_UNSPEC;
2354 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2355 &hptr, &pobj, &family, &socktype,
2356 &protocol, &flags)) {
2357 return NULL;
2358 }
2359 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002360 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002361 pptr = pbuf;
2362 } else if (PyString_Check(pobj)) {
2363 pptr = PyString_AsString(pobj);
2364 } else if (pobj == Py_None) {
2365 pptr = (char *)NULL;
2366 } else {
2367 PyErr_SetString(PySocket_Error, "Int or String expected");
2368 return NULL;
2369 }
2370 memset(&hints, 0, sizeof(hints));
2371 hints.ai_family = family;
2372 hints.ai_socktype = socktype;
2373 hints.ai_protocol = protocol;
2374 hints.ai_flags = flags;
2375 error = getaddrinfo(hptr, pptr, &hints, &res0);
2376 if (error) {
2377 PyGAI_Err(error);
2378 return NULL;
2379 }
2380
2381 if ((all = PyList_New(0)) == NULL)
2382 goto err;
2383 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002384 PyObject *addr =
2385 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2386 if (addr == NULL)
2387 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002388 single = Py_BuildValue("iiisO", res->ai_family,
2389 res->ai_socktype, res->ai_protocol,
2390 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002391 addr);
2392 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002393 if (single == NULL)
2394 goto err;
2395
2396 if (PyList_Append(all, single))
2397 goto err;
2398 Py_XDECREF(single);
2399 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002400 return all;
2401 err:
2402 Py_XDECREF(single);
2403 Py_XDECREF(all);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002404 return (PyObject *)NULL;
2405}
2406
2407static char getaddrinfo_doc[] =
2408"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2409 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2410\n\
2411Resolve host and port into addrinfo struct.";
2412
2413/* Python interface to getnameinfo(sa, flags). */
2414
2415/*ARGSUSED*/
2416static PyObject *
2417PySocket_getnameinfo(PyObject *self, PyObject *args)
2418{
2419 PyObject *sa = (PyObject *)NULL;
2420 int flags;
2421 char *hostp;
2422 int n, port, flowinfo, scope_id;
2423 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2424 struct addrinfo hints, *res = NULL;
2425 int error;
2426 PyObject *ret = (PyObject *)NULL;
2427
2428 flags = flowinfo = scope_id = 0;
2429 if (PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags) == 0)
2430 return NULL;
2431 n = PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, scope_id);
2432 if (n == 0)
2433 goto fail;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002434 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002435 memset(&hints, 0, sizeof(hints));
2436 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002437 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002438 error = getaddrinfo(hostp, pbuf, &hints, &res);
2439 if (error) {
2440 PyGAI_Err(error);
2441 goto fail;
2442 }
2443 if (res->ai_next) {
2444 PyErr_SetString(PySocket_Error,
2445 "sockaddr resolved to multiple addresses");
2446 goto fail;
2447 }
2448 switch (res->ai_family) {
2449 case AF_INET:
2450 {
2451 char *t1;
2452 int t2;
2453 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2454 PyErr_SetString(PySocket_Error,
2455 "IPv4 sockaddr must be 2 tuple");
2456 goto fail;
2457 }
2458 break;
2459 }
2460#ifdef INET6
2461 case AF_INET6:
2462 {
2463 struct sockaddr_in6 *sin6;
2464 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2465 sin6->sin6_flowinfo = flowinfo;
2466 sin6->sin6_scope_id = scope_id;
2467 break;
2468 }
2469#endif
2470 }
2471 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2472 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2473 if (error) {
2474 PyGAI_Err(error);
2475 goto fail;
2476 }
2477 ret = Py_BuildValue("ss", hbuf, pbuf);
2478
2479fail:
2480 if (res)
2481 freeaddrinfo(res);
2482 Py_XDECREF(sa);
2483 return ret;
2484}
2485
2486static char getnameinfo_doc[] =
2487"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2488\n\
2489Get host and port for a sockaddr.";
2490
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002491/* XXX It might be helpful to augment the error message generated
2492 below with the name of the SSL function that generated the error.
2493 I expect it's obvious most of the time.
2494*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002495
2496#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002497static PyObject *
2498PySSL_SetError(SSL *ssl, int ret)
2499{
2500 PyObject *v, *n, *s;
2501 char *errstr;
2502 int err;
2503
2504 assert(ret <= 0);
2505
2506 err = SSL_get_error(ssl, ret);
2507 n = PyInt_FromLong(err);
2508 if (n == NULL)
2509 return NULL;
2510 v = PyTuple_New(2);
2511 if (v == NULL) {
2512 Py_DECREF(n);
2513 return NULL;
2514 }
2515
2516 switch (SSL_get_error(ssl, ret)) {
2517 case SSL_ERROR_ZERO_RETURN:
2518 errstr = "TLS/SSL connection has been closed";
2519 break;
2520 case SSL_ERROR_WANT_READ:
2521 errstr = "The operation did not complete (read)";
2522 break;
2523 case SSL_ERROR_WANT_WRITE:
2524 errstr = "The operation did not complete (write)";
2525 break;
2526 case SSL_ERROR_WANT_X509_LOOKUP:
2527 errstr = "The operation did not complete (X509 lookup)";
2528 break;
2529 case SSL_ERROR_SYSCALL:
2530 case SSL_ERROR_SSL:
2531 {
2532 unsigned long e = ERR_get_error();
2533 if (e == 0) {
2534 /* an EOF was observed that violates the protocol */
2535 errstr = "EOF occurred in violation of protocol";
2536 } else if (e == -1) {
2537 /* the underlying BIO reported an I/O error */
2538 Py_DECREF(v);
2539 Py_DECREF(n);
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +00002540 return PySocket_Err();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002541 } else {
2542 /* XXX Protected by global interpreter lock */
2543 errstr = ERR_error_string(e, NULL);
2544 }
2545 break;
2546 }
2547 default:
2548 errstr = "Invalid error code";
2549 }
2550 s = PyString_FromString(errstr);
2551 if (s == NULL) {
2552 Py_DECREF(v);
2553 Py_DECREF(n);
2554 }
2555 PyTuple_SET_ITEM(v, 0, n);
2556 PyTuple_SET_ITEM(v, 1, s);
2557 PyErr_SetObject(PySSLErrorObject, v);
2558 return NULL;
2559}
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002560
2561/* This is a C function to be called for new object initialization */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002562static PySSLObject *
2563newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002564{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002565 PySSLObject *self;
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002566 char *errstr = NULL;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002567 int ret;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002568
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002569 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002570 if (self == NULL){
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002571 errstr = "newPySSLObject error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002572 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002573 }
Jeremy Hyltonba699362001-10-11 17:23:34 +00002574 memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
2575 memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002576 self->server_cert = NULL;
2577 self->ssl = NULL;
2578 self->ctx = NULL;
2579 self->Socket = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002580
Jeremy Hylton22738b92001-10-10 22:37:48 +00002581 if ((key_file && !cert_file) || (!key_file && cert_file)) {
2582 errstr = "Both the key & certificate files must be specified";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002583 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002584 }
2585
Jeremy Hylton22738b92001-10-10 22:37:48 +00002586 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2587 if (self->ctx == NULL) {
2588 errstr = "SSL_CTX_new error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002589 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002590 }
2591
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002592 if (key_file) {
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002593 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002594 SSL_FILETYPE_PEM) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002595 errstr = "SSL_CTX_use_PrivateKey_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002596 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002597 }
2598
2599 if (SSL_CTX_use_certificate_chain_file(self->ctx,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002600 cert_file) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002601 errstr = "SSL_CTX_use_certificate_chain_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002602 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002603 }
2604 }
2605
2606 SSL_CTX_set_verify(self->ctx,
2607 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2608 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2609 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2610 SSL_set_connect_state(self->ssl);
2611
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002612 /* Actually negotiate SSL connection */
2613 /* XXX If SSL_connect() returns 0, it's also a failure. */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002614 ret = SSL_connect(self->ssl);
2615 if (ret <= 0) {
2616 PySSL_SetError(self->ssl, ret);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002617 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002618 }
2619 self->ssl->debug = 1;
2620
2621 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2622 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002623 self->server, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002624 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002625 self->issuer, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002626 }
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002627 self->Socket = Sock;
2628 Py_INCREF(self->Socket);
2629 return self;
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002630 fail:
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002631 if (errstr)
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002632 PyErr_SetString(PySSLErrorObject, errstr);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002633 Py_DECREF(self);
2634 return NULL;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002635}
2636
2637/* This is the Python function called for new object initialization */
2638static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002639PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002640{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002641 PySSLObject *rv;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002642 PySocketSockObject *Sock;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002643 char *key_file = NULL;
2644 char *cert_file = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002645
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002646 if (!PyArg_ParseTuple(args, "O!|zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002647 &PySocketSock_Type, (PyObject*)&Sock,
Jeremy Hyltonab006452001-10-10 03:33:24 +00002648 &key_file, &cert_file))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002649 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002650
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002651 rv = newPySSLObject(Sock, key_file, cert_file);
Jeremy Hyltonab006452001-10-10 03:33:24 +00002652 if (rv == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002653 return NULL;
2654 return (PyObject *)rv;
2655}
2656
2657static char ssl_doc[] =
Jeremy Hyltonba699362001-10-11 17:23:34 +00002658"ssl(socket, [keyfile, certfile]) -> sslobject";
2659
2660/* SSL object methods */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002661
2662static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002663PySSL_server(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002664{
2665 return PyString_FromString(self->server);
2666}
2667
2668static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002669PySSL_issuer(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002670{
2671 return PyString_FromString(self->issuer);
2672}
2673
2674
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002675static void PySSL_dealloc(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002676{
2677 if (self->server_cert) /* Possible not to have one? */
2678 X509_free (self->server_cert);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002679 if (self->ssl)
2680 SSL_free(self->ssl);
2681 if (self->ctx)
2682 SSL_CTX_free(self->ctx);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002683 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002684 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002685}
2686
Jeremy Hyltonba699362001-10-11 17:23:34 +00002687static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
2688{
2689 char *data;
2690 int len;
2691
2692 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
2693 return NULL;
2694
2695 len = SSL_write(self->ssl, data, len);
2696 if (len > 0)
2697 return PyInt_FromLong(len);
2698 else
2699 return PySSL_SetError(self->ssl, len);
2700}
2701
2702static char PySSL_SSLwrite_doc[] =
2703"write(s) -> len\n\
2704\n\
2705Writes the string s into the SSL object. Returns the number\n\
2706of bytes written.";
2707
2708static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
2709{
2710 PyObject *buf;
2711 int count = 0;
2712 int len = 1024;
2713
2714 if (!PyArg_ParseTuple(args, "|i:read", &len))
2715 return NULL;
2716
2717 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2718 return NULL;
2719
2720 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2721 if (count <= 0) {
2722 Py_DECREF(buf);
2723 return PySSL_SetError(self->ssl, count);
2724 }
2725 if (count != len && _PyString_Resize(&buf, count) < 0)
2726 return NULL;
2727 return buf;
2728}
2729
2730static char PySSL_SSLread_doc[] =
2731"read([len]) -> string\n\
2732\n\
2733Read up to len bytes from the SSL socket.";
2734
2735static PyMethodDef PySSLMethods[] = {
2736 {"write", (PyCFunction)PySSL_SSLwrite, 1,
2737 PySSL_SSLwrite_doc},
2738 {"read", (PyCFunction)PySSL_SSLread, 1,
2739 PySSL_SSLread_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00002740 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
2741 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Jeremy Hyltonba699362001-10-11 17:23:34 +00002742 {NULL, NULL}
2743};
2744
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002745static PyObject *PySSL_getattr(PySSLObject *self, char *name)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002746{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002747 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002748}
2749
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002750staticforward PyTypeObject PySSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002751 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002752 0, /*ob_size*/
2753 "SSL", /*tp_name*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002754 sizeof(PySSLObject), /*tp_basicsize*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002755 0, /*tp_itemsize*/
2756 /* methods */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002757 (destructor)PySSL_dealloc, /*tp_dealloc*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002758 0, /*tp_print*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002759 (getattrfunc)PySSL_getattr, /*tp_getattr*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002760 0, /*tp_setattr*/
2761 0, /*tp_compare*/
2762 0, /*tp_repr*/
2763 0, /*tp_as_number*/
2764 0, /*tp_as_sequence*/
2765 0, /*tp_as_mapping*/
2766 0, /*tp_hash*/
2767};
2768
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002769/* helper routines for seeding the SSL PRNG */
2770static PyObject *
2771PySSL_RAND_add(PyObject *self, PyObject *args)
2772{
2773 char *buf;
2774 int len;
2775 double entropy;
2776
2777 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
2778 return NULL;
2779 RAND_add(buf, len, entropy);
2780 Py_INCREF(Py_None);
2781 return Py_None;
2782}
2783
2784static char PySSL_RAND_add_doc[] =
2785"RAND_add(string, entropy)\n\
2786\n\
2787Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
2788bound on the entropy contained in string.";
2789
2790static PyObject *
2791PySSL_RAND_status(PyObject *self)
2792{
2793 return PyInt_FromLong(RAND_status());
2794}
2795
2796static char PySSL_RAND_status_doc[] =
2797"RAND_status() -> 0 or 1\n\
2798\n\
2799Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
2800It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
2801using the ssl() function.";
2802
2803static PyObject *
2804PySSL_RAND_egd(PyObject *self, PyObject *arg)
2805{
2806 int bytes;
2807
2808 if (!PyString_Check(arg))
2809 return PyErr_Format(PyExc_TypeError,
2810 "RAND_egd() expected string, found %s",
2811 arg->ob_type->tp_name);
2812 bytes = RAND_egd(PyString_AS_STRING(arg));
2813 if (bytes == -1) {
2814 PyErr_SetString(PySSLErrorObject,
2815 "EGD connection failed or EGD did not return "
2816 "enough data to seed the PRNG");
2817 return NULL;
2818 }
2819 return PyInt_FromLong(bytes);
2820}
2821
2822static char PySSL_RAND_egd_doc[] =
Guido van Rossumcad8fa12001-10-19 12:40:40 +00002823"RAND_egd(path) -> bytes\n\
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002824\n\
2825Queries the entropy gather daemon (EGD) on socket path. Returns number\n\
2826of bytes read. Raises socket.sslerror if connection to EGD fails or\n\
2827if it does provide enough data to seed PRNG.";
2828
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002829#endif /* USE_SSL */
2830
2831
Guido van Rossum30a685f1991-06-27 15:51:29 +00002832/* List of functions exported by this module. */
2833
Guido van Rossum73624e91994-10-10 17:59:00 +00002834static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002835 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002836 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002837 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002838 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002839 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002840 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002841 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002842 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002843 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002844 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002845 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002846 METH_VARARGS,getprotobyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002847 {"socket", PySocket_socket,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002848 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002849#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002850 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002851 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002852#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002853 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002854 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002855 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002856 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002857 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002858 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002859 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002860 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002861 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002862 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002863 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002864 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002865 {"getaddrinfo", PySocket_getaddrinfo,
2866 METH_VARARGS, getaddrinfo_doc},
2867 {"getnameinfo", PySocket_getnameinfo,
2868 METH_VARARGS, getnameinfo_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002869#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002870 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002871 METH_VARARGS, ssl_doc},
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002872 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
2873 PySSL_RAND_add_doc},
2874 {"RAND_egd", PySSL_RAND_egd, METH_O,
2875 PySSL_RAND_egd_doc},
2876 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
2877 PySSL_RAND_status_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002878#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002879 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002880};
2881
Guido van Rossum30a685f1991-06-27 15:51:29 +00002882
2883/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002884 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002885 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002886 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002887static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002888insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002889{
Guido van Rossum73624e91994-10-10 17:59:00 +00002890 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002891 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002892 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002893
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002894 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002895}
2896
Guido van Rossum30a685f1991-06-27 15:51:29 +00002897
Guido van Rossum8d665e61996-06-26 18:22:49 +00002898#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002899
2900/* Additional initialization and cleanup for NT/Windows */
2901
2902static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002903NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002904{
2905 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002906}
2907
2908static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002909NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002910{
2911 WSADATA WSAData;
2912 int ret;
2913 char buf[100];
2914 ret = WSAStartup(0x0101, &WSAData);
2915 switch (ret) {
2916 case 0: /* no error */
2917 atexit(NTcleanup);
2918 return 1;
2919 case WSASYSNOTREADY:
2920 PyErr_SetString(PyExc_ImportError,
2921 "WSAStartup failed: network not ready");
2922 break;
2923 case WSAVERNOTSUPPORTED:
2924 case WSAEINVAL:
2925 PyErr_SetString(PyExc_ImportError,
2926 "WSAStartup failed: requested version not supported");
2927 break;
2928 default:
2929 sprintf(buf, "WSAStartup failed: error code %d", ret);
2930 PyErr_SetString(PyExc_ImportError, buf);
2931 break;
2932 }
2933 return 0;
2934}
2935
Guido van Rossum8d665e61996-06-26 18:22:49 +00002936#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002937
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002938#if defined(PYOS_OS2)
2939
2940/* Additional initialization and cleanup for OS/2 */
2941
2942static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002943OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002944{
2945 /* No cleanup is necessary for OS/2 Sockets */
2946}
2947
2948static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002949OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002950{
2951 char reason[64];
2952 int rc = sock_init();
2953
2954 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002955 atexit(OS2cleanup);
2956 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002957 }
2958
2959 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2960 PyErr_SetString(PyExc_ImportError, reason);
2961
Guido van Rossum32c575d1997-12-02 20:37:32 +00002962 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002963}
2964
2965#endif /* PYOS_OS2 */
2966
Guido van Rossum30a685f1991-06-27 15:51:29 +00002967/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002968 * This is called when the first 'import socket' is done,
2969 * via a table in config.c, if config.c is compiled with USE_SOCKET
2970 * defined.
2971 *
2972 * For MS_WINDOWS (which means any Windows variant), this module
2973 * is actually called "_socket", and there's a wrapper "socket.py"
2974 * which implements some missing functionality (such as makefile(),
2975 * dup() and fromfd()). The import of "_socket" may fail with an
2976 * ImportError exception if initialization of WINSOCK fails. When
2977 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2978 * scheduled to be made at exit time.
2979 *
2980 * For OS/2, this module is also called "_socket" and uses a wrapper
2981 * "socket.py" which implements that functionality that is missing
2982 * when PC operating systems don't put socket descriptors in the
2983 * operating system's filesystem layer.
2984 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002985
Guido van Rossum82a5c661998-07-07 20:45:43 +00002986static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002987"Implementation module for socket operations. See the socket module\n\
2988for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002989
2990static char sockettype_doc[] =
2991"A socket represents one endpoint of a network connection.\n\
2992\n\
2993Methods:\n\
2994\n\
2995accept() -- accept a connection, returning new socket and client address\n\
2996bind() -- bind the socket to a local address\n\
2997close() -- close the socket\n\
2998connect() -- connect the socket to a remote address\n\
2999connect_ex() -- connect, return an error code instead of an exception \n\
3000dup() -- return a new socket object identical to the current one (*)\n\
3001fileno() -- return underlying file descriptor\n\
3002getpeername() -- return remote address (*)\n\
3003getsockname() -- return local address\n\
3004getsockopt() -- get socket options\n\
3005listen() -- start listening for incoming connections\n\
3006makefile() -- return a file object corresponding tot the socket (*)\n\
3007recv() -- receive data\n\
3008recvfrom() -- receive data and sender's address\n\
3009send() -- send data\n\
3010sendto() -- send data to a given address\n\
3011setblocking() -- set or clear the blocking I/O flag\n\
3012setsockopt() -- set socket options\n\
3013shutdown() -- shut down traffic in one or both directions\n\
3014\n\
3015(*) not available on all platforms!)";
3016
Guido van Rossum3886bb61998-12-04 18:50:17 +00003017DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003018init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003019{
Guido van Rossum73624e91994-10-10 17:59:00 +00003020 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003021#ifdef RISCOS
3022 _kernel_swi_regs r;
3023 r.r[0]=0;
3024 _kernel_swi(0x43380, &r, &r);
3025 taskwindow = r.r[0];
3026#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00003027#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00003028 if (!NTinit())
3029 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00003030#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00003031#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003032 if (!OS2init())
3033 return;
Fred Drakea136d492000-08-16 14:18:30 +00003034#endif /* __TOS_OS2__ */
3035#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00003036#endif /* RISCOS */
Guido van Rossuma120ffc2001-01-22 15:29:14 +00003037#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003038 PySSL_Type.ob_type = &PyType_Type;
Guido van Rossuma120ffc2001-01-22 15:29:14 +00003039#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00003040 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00003041 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003042 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
3043 if (PySocket_Error == NULL)
3044 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003045 PyDict_SetItemString(d, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003046 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
3047 if (PyH_Error == NULL)
3048 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003049 PyDict_SetItemString(d, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003050 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
3051 NULL);
3052 if (PyGAI_Error == NULL)
3053 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003054 PyDict_SetItemString(d, "gaierror", PyGAI_Error);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003055#ifdef USE_SSL
3056 SSL_load_error_strings();
3057 SSLeay_add_ssl_algorithms();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003058 PySSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
3059 if (PySSLErrorObject == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003060 return;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003061 PyDict_SetItemString(d, "sslerror", PySSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003062 if (PyDict_SetItemString(d, "SSLType",
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003063 (PyObject *)&PySSL_Type) != 0)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003064 return;
Jeremy Hylton57ca8732001-10-11 00:00:17 +00003065 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
3066 SSL_ERROR_ZERO_RETURN);
3067 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
3068 SSL_ERROR_WANT_READ);
3069 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
3070 SSL_ERROR_WANT_WRITE);
3071 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
3072 SSL_ERROR_WANT_X509_LOOKUP);
3073 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
3074 SSL_ERROR_SYSCALL);
3075 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
3076 SSL_ERROR_SSL);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003077#endif /* USE_SSL */
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00003078 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00003079 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum91ba64d1997-06-02 22:18:09 +00003080 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00003081 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003082 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003083
3084 /* Address families (we only support AF_INET and AF_UNIX) */
3085#ifdef AF_UNSPEC
3086 insint(d, "AF_UNSPEC", AF_UNSPEC);
3087#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003088 insint(d, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003089#ifdef AF_INET6
3090 insint(d, "AF_INET6", AF_INET6);
3091#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003092#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003093 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003094#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003095#ifdef AF_AX25
3096 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
3097#endif
3098#ifdef AF_IPX
3099 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
3100#endif
3101#ifdef AF_APPLETALK
3102 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
3103#endif
3104#ifdef AF_NETROM
3105 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
3106#endif
3107#ifdef AF_BRIDGE
3108 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
3109#endif
3110#ifdef AF_AAL5
3111 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
3112#endif
3113#ifdef AF_X25
3114 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
3115#endif
3116#ifdef AF_INET6
3117 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
3118#endif
3119#ifdef AF_ROSE
3120 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
3121#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003122#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00003123 insint(d, "AF_PACKET", AF_PACKET);
3124 insint(d, "PF_PACKET", PF_PACKET);
3125 insint(d, "PACKET_HOST", PACKET_HOST);
3126 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
3127 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
3128 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3129 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
3130 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3131 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003132#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003133
3134 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003135 insint(d, "SOCK_STREAM", SOCK_STREAM);
3136 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003137#ifndef __BEOS__
3138/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003139 insint(d, "SOCK_RAW", SOCK_RAW);
3140 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3141 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003142#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003143
3144#ifdef SO_DEBUG
3145 insint(d, "SO_DEBUG", SO_DEBUG);
3146#endif
3147#ifdef SO_ACCEPTCONN
3148 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
3149#endif
3150#ifdef SO_REUSEADDR
3151 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
3152#endif
3153#ifdef SO_KEEPALIVE
3154 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
3155#endif
3156#ifdef SO_DONTROUTE
3157 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
3158#endif
3159#ifdef SO_BROADCAST
3160 insint(d, "SO_BROADCAST", SO_BROADCAST);
3161#endif
3162#ifdef SO_USELOOPBACK
3163 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
3164#endif
3165#ifdef SO_LINGER
3166 insint(d, "SO_LINGER", SO_LINGER);
3167#endif
3168#ifdef SO_OOBINLINE
3169 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
3170#endif
3171#ifdef SO_REUSEPORT
3172 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
3173#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003174#ifdef SO_SNDBUF
3175 insint(d, "SO_SNDBUF", SO_SNDBUF);
3176#endif
3177#ifdef SO_RCVBUF
3178 insint(d, "SO_RCVBUF", SO_RCVBUF);
3179#endif
3180#ifdef SO_SNDLOWAT
3181 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
3182#endif
3183#ifdef SO_RCVLOWAT
3184 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
3185#endif
3186#ifdef SO_SNDTIMEO
3187 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
3188#endif
3189#ifdef SO_RCVTIMEO
3190 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
3191#endif
3192#ifdef SO_ERROR
3193 insint(d, "SO_ERROR", SO_ERROR);
3194#endif
3195#ifdef SO_TYPE
3196 insint(d, "SO_TYPE", SO_TYPE);
3197#endif
3198
3199 /* Maximum number of connections for "listen" */
3200#ifdef SOMAXCONN
3201 insint(d, "SOMAXCONN", SOMAXCONN);
3202#else
3203 insint(d, "SOMAXCONN", 5); /* Common value */
3204#endif
3205
3206 /* Flags for send, recv */
3207#ifdef MSG_OOB
3208 insint(d, "MSG_OOB", MSG_OOB);
3209#endif
3210#ifdef MSG_PEEK
3211 insint(d, "MSG_PEEK", MSG_PEEK);
3212#endif
3213#ifdef MSG_DONTROUTE
3214 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
3215#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003216#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00003217 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003218#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003219#ifdef MSG_EOR
3220 insint(d, "MSG_EOR", MSG_EOR);
3221#endif
3222#ifdef MSG_TRUNC
3223 insint(d, "MSG_TRUNC", MSG_TRUNC);
3224#endif
3225#ifdef MSG_CTRUNC
3226 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
3227#endif
3228#ifdef MSG_WAITALL
3229 insint(d, "MSG_WAITALL", MSG_WAITALL);
3230#endif
3231#ifdef MSG_BTAG
3232 insint(d, "MSG_BTAG", MSG_BTAG);
3233#endif
3234#ifdef MSG_ETAG
3235 insint(d, "MSG_ETAG", MSG_ETAG);
3236#endif
3237
3238 /* Protocol level and numbers, usable for [gs]etsockopt */
3239#ifdef SOL_SOCKET
3240 insint(d, "SOL_SOCKET", SOL_SOCKET);
3241#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003242#ifdef SOL_IP
3243 insint(d, "SOL_IP", SOL_IP);
3244#else
3245 insint(d, "SOL_IP", 0);
3246#endif
3247#ifdef SOL_IPX
3248 insint(d, "SOL_IPX", SOL_IPX);
3249#endif
3250#ifdef SOL_AX25
3251 insint(d, "SOL_AX25", SOL_AX25);
3252#endif
3253#ifdef SOL_ATALK
3254 insint(d, "SOL_ATALK", SOL_ATALK);
3255#endif
3256#ifdef SOL_NETROM
3257 insint(d, "SOL_NETROM", SOL_NETROM);
3258#endif
3259#ifdef SOL_ROSE
3260 insint(d, "SOL_ROSE", SOL_ROSE);
3261#endif
3262#ifdef SOL_TCP
3263 insint(d, "SOL_TCP", SOL_TCP);
3264#else
3265 insint(d, "SOL_TCP", 6);
3266#endif
3267#ifdef SOL_UDP
3268 insint(d, "SOL_UDP", SOL_UDP);
3269#else
3270 insint(d, "SOL_UDP", 17);
3271#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003272#ifdef IPPROTO_IP
3273 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003274#else
3275 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003276#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003277#ifdef IPPROTO_HOPOPTS
3278 insint(d, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
3279#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003280#ifdef IPPROTO_ICMP
3281 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003282#else
3283 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003284#endif
3285#ifdef IPPROTO_IGMP
3286 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
3287#endif
3288#ifdef IPPROTO_GGP
3289 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
3290#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003291#ifdef IPPROTO_IPV4
3292 insint(d, "IPPROTO_IPV4", IPPROTO_IPV4);
3293#endif
3294#ifdef IPPROTO_IPIP
3295 insint(d, "IPPROTO_IPIP", IPPROTO_IPIP);
3296#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003297#ifdef IPPROTO_TCP
3298 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003299#else
3300 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003301#endif
3302#ifdef IPPROTO_EGP
3303 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
3304#endif
3305#ifdef IPPROTO_PUP
3306 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
3307#endif
3308#ifdef IPPROTO_UDP
3309 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003310#else
3311 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003312#endif
3313#ifdef IPPROTO_IDP
3314 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
3315#endif
3316#ifdef IPPROTO_HELLO
3317 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
3318#endif
3319#ifdef IPPROTO_ND
3320 insint(d, "IPPROTO_ND", IPPROTO_ND);
3321#endif
3322#ifdef IPPROTO_TP
3323 insint(d, "IPPROTO_TP", IPPROTO_TP);
3324#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003325#ifdef IPPROTO_IPV6
3326 insint(d, "IPPROTO_IPV6", IPPROTO_IPV6);
3327#endif
3328#ifdef IPPROTO_ROUTING
3329 insint(d, "IPPROTO_ROUTING", IPPROTO_ROUTING);
3330#endif
3331#ifdef IPPROTO_FRAGMENT
3332 insint(d, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
3333#endif
3334#ifdef IPPROTO_RSVP
3335 insint(d, "IPPROTO_RSVP", IPPROTO_RSVP);
3336#endif
3337#ifdef IPPROTO_GRE
3338 insint(d, "IPPROTO_GRE", IPPROTO_GRE);
3339#endif
3340#ifdef IPPROTO_ESP
3341 insint(d, "IPPROTO_ESP", IPPROTO_ESP);
3342#endif
3343#ifdef IPPROTO_AH
3344 insint(d, "IPPROTO_AH", IPPROTO_AH);
3345#endif
3346#ifdef IPPROTO_MOBILE
3347 insint(d, "IPPROTO_MOBILE", IPPROTO_MOBILE);
3348#endif
3349#ifdef IPPROTO_ICMPV6
3350 insint(d, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
3351#endif
3352#ifdef IPPROTO_NONE
3353 insint(d, "IPPROTO_NONE", IPPROTO_NONE);
3354#endif
3355#ifdef IPPROTO_DSTOPTS
3356 insint(d, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
3357#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003358#ifdef IPPROTO_XTP
3359 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
3360#endif
3361#ifdef IPPROTO_EON
3362 insint(d, "IPPROTO_EON", IPPROTO_EON);
3363#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003364#ifdef IPPROTO_PIM
3365 insint(d, "IPPROTO_PIM", IPPROTO_PIM);
3366#endif
3367#ifdef IPPROTO_IPCOMP
3368 insint(d, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
3369#endif
3370#ifdef IPPROTO_VRRP
3371 insint(d, "IPPROTO_VRRP", IPPROTO_VRRP);
3372#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003373#ifdef IPPROTO_BIP
3374 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
3375#endif
3376/**/
3377#ifdef IPPROTO_RAW
3378 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003379#else
3380 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003381#endif
3382#ifdef IPPROTO_MAX
3383 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
3384#endif
3385
3386 /* Some port configuration */
3387#ifdef IPPORT_RESERVED
3388 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
3389#else
3390 insint(d, "IPPORT_RESERVED", 1024);
3391#endif
3392#ifdef IPPORT_USERRESERVED
3393 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
3394#else
3395 insint(d, "IPPORT_USERRESERVED", 5000);
3396#endif
3397
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003398 /* Some reserved IP v.4 addresses */
3399#ifdef INADDR_ANY
3400 insint(d, "INADDR_ANY", INADDR_ANY);
3401#else
3402 insint(d, "INADDR_ANY", 0x00000000);
3403#endif
3404#ifdef INADDR_BROADCAST
3405 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
3406#else
3407 insint(d, "INADDR_BROADCAST", 0xffffffff);
3408#endif
3409#ifdef INADDR_LOOPBACK
3410 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
3411#else
3412 insint(d, "INADDR_LOOPBACK", 0x7F000001);
3413#endif
3414#ifdef INADDR_UNSPEC_GROUP
3415 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
3416#else
3417 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
3418#endif
3419#ifdef INADDR_ALLHOSTS_GROUP
3420 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
3421#else
3422 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
3423#endif
3424#ifdef INADDR_MAX_LOCAL_GROUP
3425 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
3426#else
3427 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
3428#endif
3429#ifdef INADDR_NONE
3430 insint(d, "INADDR_NONE", INADDR_NONE);
3431#else
3432 insint(d, "INADDR_NONE", 0xffffffff);
3433#endif
3434
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003435 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003436#ifdef IP_OPTIONS
3437 insint(d, "IP_OPTIONS", IP_OPTIONS);
3438#endif
3439#ifdef IP_HDRINCL
3440 insint(d, "IP_HDRINCL", IP_HDRINCL);
3441#endif
3442#ifdef IP_TOS
3443 insint(d, "IP_TOS", IP_TOS);
3444#endif
3445#ifdef IP_TTL
3446 insint(d, "IP_TTL", IP_TTL);
3447#endif
3448#ifdef IP_RECVOPTS
3449 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
3450#endif
3451#ifdef IP_RECVRETOPTS
3452 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
3453#endif
3454#ifdef IP_RECVDSTADDR
3455 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
3456#endif
3457#ifdef IP_RETOPTS
3458 insint(d, "IP_RETOPTS", IP_RETOPTS);
3459#endif
3460#ifdef IP_MULTICAST_IF
3461 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
3462#endif
3463#ifdef IP_MULTICAST_TTL
3464 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
3465#endif
3466#ifdef IP_MULTICAST_LOOP
3467 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
3468#endif
3469#ifdef IP_ADD_MEMBERSHIP
3470 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
3471#endif
3472#ifdef IP_DROP_MEMBERSHIP
3473 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
3474#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003475#ifdef IP_DEFAULT_MULTICAST_TTL
3476 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
3477#endif
3478#ifdef IP_DEFAULT_MULTICAST_LOOP
3479 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
3480#endif
3481#ifdef IP_MAX_MEMBERSHIPS
3482 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
3483#endif
3484
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003485 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3486#ifdef IPV6_JOIN_GROUP
3487 insint(d, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
3488#endif
3489#ifdef IPV6_LEAVE_GROUP
3490 insint(d, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
3491#endif
3492#ifdef IPV6_MULTICAST_HOPS
3493 insint(d, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
3494#endif
3495#ifdef IPV6_MULTICAST_IF
3496 insint(d, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
3497#endif
3498#ifdef IPV6_MULTICAST_LOOP
3499 insint(d, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
3500#endif
3501#ifdef IPV6_UNICAST_HOPS
3502 insint(d, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
3503#endif
3504
Guido van Rossum09be4091999-08-09 14:40:40 +00003505 /* TCP options */
3506#ifdef TCP_NODELAY
3507 insint(d, "TCP_NODELAY", TCP_NODELAY);
3508#endif
3509#ifdef TCP_MAXSEG
3510 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
3511#endif
3512
3513 /* IPX options */
3514#ifdef IPX_TYPE
3515 insint(d, "IPX_TYPE", IPX_TYPE);
3516#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003517
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003518 /* get{addr,name}info parameters */
3519#ifdef EAI_ADDRFAMILY
3520 insint(d, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
3521#endif
3522#ifdef EAI_AGAIN
3523 insint(d, "EAI_AGAIN", EAI_AGAIN);
3524#endif
3525#ifdef EAI_BADFLAGS
3526 insint(d, "EAI_BADFLAGS", EAI_BADFLAGS);
3527#endif
3528#ifdef EAI_FAIL
3529 insint(d, "EAI_FAIL", EAI_FAIL);
3530#endif
3531#ifdef EAI_FAMILY
3532 insint(d, "EAI_FAMILY", EAI_FAMILY);
3533#endif
3534#ifdef EAI_MEMORY
3535 insint(d, "EAI_MEMORY", EAI_MEMORY);
3536#endif
3537#ifdef EAI_NODATA
3538 insint(d, "EAI_NODATA", EAI_NODATA);
3539#endif
3540#ifdef EAI_NONAME
3541 insint(d, "EAI_NONAME", EAI_NONAME);
3542#endif
3543#ifdef EAI_SERVICE
3544 insint(d, "EAI_SERVICE", EAI_SERVICE);
3545#endif
3546#ifdef EAI_SOCKTYPE
3547 insint(d, "EAI_SOCKTYPE", EAI_SOCKTYPE);
3548#endif
3549#ifdef EAI_SYSTEM
3550 insint(d, "EAI_SYSTEM", EAI_SYSTEM);
3551#endif
3552#ifdef EAI_BADHINTS
3553 insint(d, "EAI_BADHINTS", EAI_BADHINTS);
3554#endif
3555#ifdef EAI_PROTOCOL
3556 insint(d, "EAI_PROTOCOL", EAI_PROTOCOL);
3557#endif
3558#ifdef EAI_MAX
3559 insint(d, "EAI_MAX", EAI_MAX);
3560#endif
3561#ifdef AI_PASSIVE
3562 insint(d, "AI_PASSIVE", AI_PASSIVE);
3563#endif
3564#ifdef AI_CANONNAME
3565 insint(d, "AI_CANONNAME", AI_CANONNAME);
3566#endif
3567#ifdef AI_NUMERICHOST
3568 insint(d, "AI_NUMERICHOST", AI_NUMERICHOST);
3569#endif
3570#ifdef AI_MASK
3571 insint(d, "AI_MASK", AI_MASK);
3572#endif
3573#ifdef AI_ALL
3574 insint(d, "AI_ALL", AI_ALL);
3575#endif
3576#ifdef AI_V4MAPPED_CFG
3577 insint(d, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
3578#endif
3579#ifdef AI_ADDRCONFIG
3580 insint(d, "AI_ADDRCONFIG", AI_ADDRCONFIG);
3581#endif
3582#ifdef AI_V4MAPPED
3583 insint(d, "AI_V4MAPPED", AI_V4MAPPED);
3584#endif
3585#ifdef AI_DEFAULT
3586 insint(d, "AI_DEFAULT", AI_DEFAULT);
3587#endif
3588#ifdef NI_MAXHOST
3589 insint(d, "NI_MAXHOST", NI_MAXHOST);
3590#endif
3591#ifdef NI_MAXSERV
3592 insint(d, "NI_MAXSERV", NI_MAXSERV);
3593#endif
3594#ifdef NI_NOFQDN
3595 insint(d, "NI_NOFQDN", NI_NOFQDN);
3596#endif
3597#ifdef NI_NUMERICHOST
3598 insint(d, "NI_NUMERICHOST", NI_NUMERICHOST);
3599#endif
3600#ifdef NI_NAMEREQD
3601 insint(d, "NI_NAMEREQD", NI_NAMEREQD);
3602#endif
3603#ifdef NI_NUMERICSERV
3604 insint(d, "NI_NUMERICSERV", NI_NUMERICSERV);
3605#endif
3606#ifdef NI_DGRAM
3607 insint(d, "NI_DGRAM", NI_DGRAM);
3608#endif
3609
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003610 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003611#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003612 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003613#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003614}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003615
3616/* Simplistic emulation code for inet_pton that only works for IPv4 */
3617#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003618int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003619inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003620{
3621 if(af == AF_INET){
3622 long packed_addr;
3623#ifdef USE_GUSI1
3624 packed_addr = (long)inet_addr(src).s_addr;
3625#else
3626 packed_addr = inet_addr(src);
3627#endif
3628 if (packed_addr == INADDR_NONE)
3629 return 0;
3630 memcpy(dst, &packed_addr, 4);
3631 return 1;
3632 }
3633 /* Should set errno to EAFNOSUPPORT */
3634 return -1;
3635}
3636
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003637const char *
3638inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003639{
3640 if (af == AF_INET) {
3641 struct in_addr packed_addr;
3642 if (size < 16)
3643 /* Should set errno to ENOSPC. */
3644 return NULL;
3645 memcpy(&packed_addr, src, sizeof(packed_addr));
3646 return strncpy(dst, inet_ntoa(packed_addr), size);
3647 }
3648 /* Should set errno to EAFNOSUPPORT */
3649 return NULL;
3650}
3651#endif