blob: 8c8ebb7b62f85d9751a1be0561f3c4248a65ead6 [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#ifdef RISCOS
134#define NO_DUP
135#undef off_t
136#undef uid_t
137#undef gid_t
138#undef errno
139#include <signal.h>
140#include "socklib.h"
141#include "inetlib.h"
142#include "netdb.h"
143#include "unixlib.h"
144#include "netinet/in.h"
145#include "sys/ioctl.h"
146#else /*RISCOS*/
147
Guido van Rossumb6775db1994-08-01 11:34:53 +0000148#include <sys/types.h>
Guido van Rossumed233a51992-06-23 09:07:03 +0000149
Guido van Rossum81194471991-07-27 21:42:02 +0000150#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000151#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000152#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000153#include <sys/socket.h>
154#include <netinet/in.h>
Fred Drake51d90362000-10-06 15:37:06 +0000155#if !(defined(__BEOS__) || defined(__CYGWIN__))
Andrew M. Kuchling52a644c2000-03-31 17:24:30 +0000156#include <netinet/tcp.h>
Fred Drake11b09362000-05-16 13:30:12 +0000157#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000158
Guido van Rossum9376b741999-09-15 22:01:40 +0000159/* Headers needed for inet_ntoa() and inet_addr() */
160#ifdef __BEOS__
161#include <net/netdb.h>
162#else
Guido van Rossumff3ab422000-04-24 15:16:03 +0000163#ifndef USE_GUSI1
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000164#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000165#endif
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000166#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000167
Guido van Rossume4485b01994-09-07 14:32:49 +0000168#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000169#else
170#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000171#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000172#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000173
174#endif /*RISCOS*/
175
Guido van Rossumb6775db1994-08-01 11:34:53 +0000176#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000177#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000178#else
179#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000180#endif
181
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000182#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000183#include <sys/ioctl.h>
184#include <net/if.h>
185#include <netpacket/packet.h>
186#endif
187
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000188#ifdef HAVE_STDDEF_H
189#include <stddef.h>
190#endif
191
192#ifndef offsetof
193#define offsetof(type, member) ((size_t)(&((type *)0)->member))
194#endif
195
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000196#ifndef O_NDELAY
197#define O_NDELAY O_NONBLOCK /* For QNX only? */
198#endif
199
Guido van Rossumff3ab422000-04-24 15:16:03 +0000200#ifdef USE_GUSI1
Jack Jansen508537b1996-02-14 15:57:45 +0000201/* fdopen() isn't declared in stdio.h (sigh) */
202#include <GUSI.h>
203#endif
204
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000205#include "addrinfo.h"
206
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000207#ifdef USE_SSL
Andrew M. Kuchling697a0b02001-01-18 17:41:41 +0000208#include "openssl/rsa.h"
209#include "openssl/crypto.h"
210#include "openssl/x509.h"
211#include "openssl/pem.h"
212#include "openssl/ssl.h"
213#include "openssl/err.h"
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +0000214#include "openssl/rand.h"
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000215#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000216
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000217#ifndef HAVE_INET_PTON
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000218int inet_pton (int af, const char *src, void *dst);
219const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000220#endif
221
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000222#ifdef __APPLE__
223/* On OS X, getaddrinfo returns no error indication of lookup
224 failure, so we must use the emulation instead of the libinfo
225 implementation. Unfortunately, performing an autoconf test
226 for this bug would require DNS access for the machine performing
227 the configuration, which is not acceptable. Therefore, we
228 determine the bug just by checking for __APPLE__. If this bug
229 gets ever fixed, perhaps checking for sys/version.h would be
230 appropriate, which is 10/0 on the system with the bug. */
231#undef HAVE_GETADDRINFO
232/* avoid clashes with the C library definition of the symbol. */
233#define getaddrinfo fake_getaddrinfo
234#endif
235
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000236/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000237#if !defined(HAVE_GETADDRINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000238#include "getaddrinfo.c"
239#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000240#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000241#include "getnameinfo.c"
242#endif
243
Guido van Rossumbcc20741998-08-04 22:53:56 +0000244#if defined(MS_WINDOWS) || defined(__BEOS__)
245/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000246/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000247#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000248#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000249#endif
250
Fred Drakea04eaad2000-06-30 02:46:07 +0000251/* abstract the socket file descriptor type */
252#ifdef MS_WINDOWS
253typedef SOCKET SOCKET_T;
254# ifdef MS_WIN64
255# define SIZEOF_SOCKET_T 8
256# else
257# define SIZEOF_SOCKET_T 4
258# endif
259#else
260typedef int SOCKET_T;
261# define SIZEOF_SOCKET_T SIZEOF_INT
262#endif
263
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000264#ifdef MS_WIN32
265# define EAFNOSUPPORT WSAEAFNOSUPPORT
266# define snprintf _snprintf
267#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000268
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000269#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000270#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000271#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000272#endif
273
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000274#ifndef SOCKETCLOSE
275#define SOCKETCLOSE close
276#endif
277
Guido van Rossum30a685f1991-06-27 15:51:29 +0000278/* Global variable holding the exception type for errors detected
279 by this module (but not argument type or memory errors, etc.). */
280
Guido van Rossum73624e91994-10-10 17:59:00 +0000281static PyObject *PySocket_Error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000282static PyObject *PyH_Error;
283static PyObject *PyGAI_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000284
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000285#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000286static PyObject *PySSLErrorObject;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000287#endif /* USE_SSL */
288
Guido van Rossum30a685f1991-06-27 15:51:29 +0000289
Guido van Rossum48a680c2001-03-02 06:34:14 +0000290#ifdef RISCOS
291/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
292static int taskwindow;
293#endif
294
295
Guido van Rossum30a685f1991-06-27 15:51:29 +0000296/* Convenience function to raise an error according to errno
297 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000298
Guido van Rossum73624e91994-10-10 17:59:00 +0000299static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000300PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000301{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000302#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000303 int err_no = WSAGetLastError();
304 if (err_no) {
305 static struct { int no; const char *msg; } *msgp, msgs[] = {
306 { WSAEINTR, "Interrupted system call" },
307 { WSAEBADF, "Bad file descriptor" },
308 { WSAEACCES, "Permission denied" },
309 { WSAEFAULT, "Bad address" },
310 { WSAEINVAL, "Invalid argument" },
311 { WSAEMFILE, "Too many open files" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000312 { WSAEWOULDBLOCK,
Mark Hammond46a733d2000-07-24 01:45:11 +0000313 "The socket operation could not complete "
314 "without blocking" },
315 { WSAEINPROGRESS, "Operation now in progress" },
316 { WSAEALREADY, "Operation already in progress" },
317 { WSAENOTSOCK, "Socket operation on non-socket" },
318 { WSAEDESTADDRREQ, "Destination address required" },
319 { WSAEMSGSIZE, "Message too long" },
320 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
321 { WSAENOPROTOOPT, "Protocol not available" },
322 { WSAEPROTONOSUPPORT, "Protocol not supported" },
323 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
324 { WSAEOPNOTSUPP, "Operation not supported" },
325 { WSAEPFNOSUPPORT, "Protocol family not supported" },
326 { WSAEAFNOSUPPORT, "Address family not supported" },
327 { WSAEADDRINUSE, "Address already in use" },
328 { WSAEADDRNOTAVAIL,
329 "Can't assign requested address" },
330 { WSAENETDOWN, "Network is down" },
331 { WSAENETUNREACH, "Network is unreachable" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000332 { WSAENETRESET,
Mark Hammond46a733d2000-07-24 01:45:11 +0000333 "Network dropped connection on reset" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000334 { WSAECONNABORTED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000335 "Software caused connection abort" },
336 { WSAECONNRESET, "Connection reset by peer" },
337 { WSAENOBUFS, "No buffer space available" },
338 { WSAEISCONN, "Socket is already connected" },
339 { WSAENOTCONN, "Socket is not connected" },
340 { WSAESHUTDOWN, "Can't send after socket shutdown" },
341 { WSAETOOMANYREFS,
342 "Too many references: can't splice" },
343 { WSAETIMEDOUT, "Operation timed out" },
344 { WSAECONNREFUSED, "Connection refused" },
345 { WSAELOOP, "Too many levels of symbolic links" },
346 { WSAENAMETOOLONG, "File name too long" },
347 { WSAEHOSTDOWN, "Host is down" },
348 { WSAEHOSTUNREACH, "No route to host" },
349 { WSAENOTEMPTY, "Directory not empty" },
350 { WSAEPROCLIM, "Too many processes" },
351 { WSAEUSERS, "Too many users" },
352 { WSAEDQUOT, "Disc quota exceeded" },
353 { WSAESTALE, "Stale NFS file handle" },
354 { WSAEREMOTE, "Too many levels of remote in path" },
355 { WSASYSNOTREADY,
356 "Network subsystem is unvailable" },
357 { WSAVERNOTSUPPORTED,
358 "WinSock version is not supported" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000359 { WSANOTINITIALISED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000360 "Successful WSAStartup() not yet performed" },
361 { WSAEDISCON, "Graceful shutdown in progress" },
362 /* Resolver errors */
363 { WSAHOST_NOT_FOUND, "No such host is known" },
364 { WSATRY_AGAIN, "Host not found, or server failed" },
365 { WSANO_RECOVERY,
366 "Unexpected server error encountered" },
367 { WSANO_DATA, "Valid name without requested data" },
368 { WSANO_ADDRESS, "No address, look for MX record" },
369 { 0, NULL }
370 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000371 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000372 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000373
Mark Hammond46a733d2000-07-24 01:45:11 +0000374 for (msgp = msgs; msgp->msg; msgp++) {
375 if (err_no == msgp->no) {
376 msg = msgp->msg;
377 break;
378 }
379 }
380
381 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000382 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000383 PyErr_SetObject(PySocket_Error, v);
384 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000385 }
386 return NULL;
387 }
388 else
389#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000390
391#if defined(PYOS_OS2)
392 if (sock_errno() != NO_ERROR) {
393 APIRET rc;
394 ULONG msglen;
395 char outbuf[100];
396 int myerrorcode = sock_errno();
397
398 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
399 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
400 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
401 if (rc == NO_ERROR) {
402 PyObject *v;
403
404 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
405 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
406 char *lastc = &outbuf[ strlen(outbuf)-1 ];
407 while (lastc > outbuf && isspace(*lastc))
408 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
409 }
410 v = Py_BuildValue("(is)", myerrorcode, outbuf);
411 if (v != NULL) {
412 PyErr_SetObject(PySocket_Error, v);
413 Py_DECREF(v);
414 }
415 return NULL;
416 }
417 }
418#endif
419
Guido van Rossum73624e91994-10-10 17:59:00 +0000420 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000421}
422
Guido van Rossum30a685f1991-06-27 15:51:29 +0000423
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000424static PyObject *
425PyH_Err(int h_error)
426{
427 PyObject *v;
428
429#ifdef HAVE_HSTRERROR
430 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
431#else
432 v = Py_BuildValue("(is)", h_error, "host not found");
433#endif
434 if (v != NULL) {
Martin v. Löwis864e9ff2001-08-04 22:32:03 +0000435 PyErr_SetObject(PyH_Error, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000436 Py_DECREF(v);
437 }
438
439 return NULL;
440}
441
442
443static PyObject *
444PyGAI_Err(int error)
445{
446 PyObject *v;
447
448 if (error == EAI_SYSTEM)
449 return PySocket_Err();
450
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000451#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000452 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000453#else
454 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
455#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000456 if (v != NULL) {
457 PyErr_SetObject(PyGAI_Error, v);
458 Py_DECREF(v);
459 }
460
461 return NULL;
462}
463
464
Guido van Rossum30a685f1991-06-27 15:51:29 +0000465/* The object holding a socket. It holds some extra information,
466 like the address family, which is used to decode socket address
467 arguments properly. */
468
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000469typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000470 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000471 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000472 int sock_family; /* Address family, e.g., AF_INET */
473 int sock_type; /* Socket type, e.g., SOCK_STREAM */
474 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000475 union sock_addr {
476 struct sockaddr_in in;
477#ifdef AF_UNIX
478 struct sockaddr_un un;
479#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000480#ifdef INET6
481 struct sockaddr_in6 in6;
482 struct sockaddr_storage storage;
483#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000484#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000485 struct sockaddr_ll ll;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000486#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000487 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000488} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000489
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000490#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000491
Jeremy Hyltonba699362001-10-11 17:23:34 +0000492#define X509_NAME_MAXLEN 256
493
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000494typedef struct {
495 PyObject_HEAD
496 PySocketSockObject *Socket; /* Socket on which we're layered */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000497 SSL_CTX* ctx;
498 SSL* ssl;
499 X509* server_cert;
500 BIO* sbio;
Jeremy Hyltonba699362001-10-11 17:23:34 +0000501 char server[X509_NAME_MAXLEN];
502 char issuer[X509_NAME_MAXLEN];
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000503
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000504} PySSLObject;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000505
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000506staticforward PyTypeObject PySSL_Type;
507staticforward PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args);
508staticforward PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000509
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000510#define PySSLObject_Check(v) ((v)->ob_type == &PySSL_Type)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000511
512#endif /* USE_SSL */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000513
Guido van Rossum30a685f1991-06-27 15:51:29 +0000514/* A forward reference to the Socktype type object.
515 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000516 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000517 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000518
Guido van Rossum73624e91994-10-10 17:59:00 +0000519staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000520
Guido van Rossum30a685f1991-06-27 15:51:29 +0000521
522/* Create a new socket object.
523 This just creates the object and initializes it.
524 If the creation fails, return NULL and set an exception (implicit
525 in NEWOBJ()). */
526
Guido van Rossum73624e91994-10-10 17:59:00 +0000527static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000528PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000529{
Guido van Rossum48a680c2001-03-02 06:34:14 +0000530#ifdef RISCOS
531 int block = 1;
532#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000533 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000534 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000535 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000536 if (s != NULL) {
537 s->sock_fd = fd;
538 s->sock_family = family;
539 s->sock_type = type;
540 s->sock_proto = proto;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000541#ifdef RISCOS
542 if(taskwindow) {
543 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
544 }
545#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000546 }
547 return s;
548}
549
Guido van Rossum30a685f1991-06-27 15:51:29 +0000550
Guido van Rossum48a680c2001-03-02 06:34:14 +0000551/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000552 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000553#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000554PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000555#endif
556
557
Guido van Rossum30a685f1991-06-27 15:51:29 +0000558/* Convert a string specifying a host name or one of a few symbolic
559 names to a numeric IP address. This usually calls gethostbyname()
560 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000561 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000562 an error occurred; then an exception is raised. */
563
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000564static int
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000565setipaddr(char* name, struct sockaddr * addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000566{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000567 struct addrinfo hints, *res;
568 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000569
Guido van Rossuma376cc51996-12-05 23:43:35 +0000570 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000571 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000572 int siz;
573 memset(&hints, 0, sizeof(hints));
574 hints.ai_family = af;
575 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
576 hints.ai_flags = AI_PASSIVE;
577 error = getaddrinfo(NULL, "0", &hints, &res);
578 if (error) {
579 PyGAI_Err(error);
580 return -1;
581 }
582 switch (res->ai_family) {
583 case AF_INET:
584 siz = 4;
585 break;
586#ifdef INET6
587 case AF_INET6:
588 siz = 16;
589 break;
590#endif
591 default:
592 freeaddrinfo(res);
593 PyErr_SetString(PySocket_Error,
594 "unsupported address family");
595 return -1;
596 }
597 if (res->ai_next) {
598 PyErr_SetString(PySocket_Error,
599 "wildcard resolved to multiple address");
600 return -1;
601 }
602 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
603 freeaddrinfo(res);
604 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000605 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000606 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000607 struct sockaddr_in *sin;
608 if (af != PF_INET && af != PF_UNSPEC) {
609 PyErr_SetString(PySocket_Error,
610 "address family mismatched");
611 return -1;
612 }
613 sin = (struct sockaddr_in *)addr_ret;
614 memset((void *) sin, '\0', sizeof(*sin));
615 sin->sin_family = AF_INET;
616#ifdef HAVE_SOCKADDR_SA_LEN
617 sin->sin_len = sizeof(*sin);
618#endif
619 sin->sin_addr.s_addr = INADDR_BROADCAST;
620 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000621 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000622 memset(&hints, 0, sizeof(hints));
623 hints.ai_family = af;
624 error = getaddrinfo(name, NULL, &hints, &res);
625 if (error) {
626 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000627 return -1;
628 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000629 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
630 freeaddrinfo(res);
631 switch (addr_ret->sa_family) {
632 case AF_INET:
633 return 4;
634#ifdef INET6
635 case AF_INET6:
636 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000637#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000638 default:
639 PyErr_SetString(PySocket_Error, "unknown address family");
640 return -1;
641 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000642}
643
Guido van Rossum30a685f1991-06-27 15:51:29 +0000644
Guido van Rossum30a685f1991-06-27 15:51:29 +0000645/* Create a string object representing an IP address.
646 This is always a string of the form 'dd.dd.dd.dd' (with variable
647 size numbers). */
648
Guido van Rossum73624e91994-10-10 17:59:00 +0000649static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000650makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000651{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000652 char buf[NI_MAXHOST];
653 int error;
654
655 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
656 NI_NUMERICHOST);
657 if (error) {
658 PyGAI_Err(error);
659 return NULL;
660 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000661 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000662}
663
664
665/* Create an object representing the given socket address,
666 suitable for passing it back to bind(), connect() etc.
667 The family field of the sockaddr structure is inspected
668 to determine what kind of address it really is. */
669
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000670/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000671static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000672makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000673{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000674 if (addrlen == 0) {
675 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000676 Py_INCREF(Py_None);
677 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000678 }
679
Guido van Rossumbcc20741998-08-04 22:53:56 +0000680#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000681 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000682 addr->sa_family = AF_INET;
683#endif
684
Guido van Rossum30a685f1991-06-27 15:51:29 +0000685 switch (addr->sa_family) {
686
687 case AF_INET:
688 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000689 struct sockaddr_in *a;
690 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000691 PyObject *ret = NULL;
692 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000693 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000694 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
695 Py_DECREF(addrobj);
696 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000697 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000698 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000699
Guido van Rossumb6775db1994-08-01 11:34:53 +0000700#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000701 case AF_UNIX:
702 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000703 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000704 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000705 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000706#endif /* AF_UNIX */
707
708#ifdef INET6
709 case AF_INET6:
710 {
711 struct sockaddr_in6 *a;
712 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
713 PyObject *ret = NULL;
714 if (addrobj) {
715 a = (struct sockaddr_in6 *)addr;
716 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
717 a->sin6_flowinfo, a->sin6_scope_id);
718 Py_DECREF(addrobj);
719 }
720 return ret;
721 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000722#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000723
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000724#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000725 case AF_PACKET:
726 {
727 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
728 char *ifname = "";
729 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000730 /* need to look up interface name give index */
731 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000732 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000733 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000734 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000735 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000736 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000737 a->sll_pkttype, a->sll_hatype,
738 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000739 }
740#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000741
Guido van Rossum30a685f1991-06-27 15:51:29 +0000742 /* More cases here... */
743
744 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000745 /* If we don't know the address family, don't raise an
746 exception -- return it as a tuple. */
747 return Py_BuildValue("is#",
748 addr->sa_family,
749 addr->sa_data,
750 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000751
Guido van Rossum30a685f1991-06-27 15:51:29 +0000752 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000753}
754
Guido van Rossum30a685f1991-06-27 15:51:29 +0000755
756/* Parse a socket address argument according to the socket object's
757 address family. Return 1 if the address was in the proper format,
758 0 of not. The address is returned through addr_ret, its length
759 through len_ret. */
760
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000761static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000762getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000763 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000764{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000765 switch (s->sock_family) {
766
Guido van Rossumb6775db1994-08-01 11:34:53 +0000767#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000768 case AF_UNIX:
769 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000770 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000771 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000772 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000773 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000774 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000775 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000776 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000777 PyErr_SetString(PySocket_Error,
778 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000779 return 0;
780 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000781 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000782 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000783 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000784 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000785 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000786 return 1;
787 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000788#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000789
Guido van Rossum30a685f1991-06-27 15:51:29 +0000790 case AF_INET:
791 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000792 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000793 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000794 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000795 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000796 if (!PyTuple_Check(args)) {
797 PyErr_Format(PyExc_TypeError,
798 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
799 args->ob_type->tp_name);
800 return 0;
801 }
802 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000803 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000804 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000805 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000806 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000807 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000808 *addr_ret = (struct sockaddr *) addr;
809 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000810 return 1;
811 }
812
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000813#ifdef INET6
814 case AF_INET6:
815 {
816 struct sockaddr_in6* addr;
817 char *host;
818 int port, flowinfo, scope_id;
819 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
820 flowinfo = scope_id = 0;
821 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
822 &scope_id)) {
823 return 0;
824 }
825 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
826 return 0;
827 addr->sin6_family = s->sock_family;
828 addr->sin6_port = htons((short)port);
829 addr->sin6_flowinfo = flowinfo;
830 addr->sin6_scope_id = scope_id;
831 *addr_ret = (struct sockaddr *) addr;
832 *len_ret = sizeof *addr;
833 return 1;
834 }
835#endif
836
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000837#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000838 case AF_PACKET:
839 {
840 struct sockaddr_ll* addr;
841 struct ifreq ifr;
842 char *interfaceName;
843 int protoNumber;
844 int hatype = 0;
845 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000846 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000847
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000848 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
849 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000850 return 0;
851 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
852 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000853 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +0000854 PySocket_Err();
Jeremy Hylton22308652001-02-02 03:23:09 +0000855 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000856 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000857 addr = &(s->sock_addr.ll);
858 addr->sll_family = AF_PACKET;
859 addr->sll_protocol = htons((short)protoNumber);
860 addr->sll_ifindex = ifr.ifr_ifindex;
861 addr->sll_pkttype = pkttype;
862 addr->sll_hatype = hatype;
863 *addr_ret = (struct sockaddr *) addr;
864 *len_ret = sizeof *addr;
865 return 1;
866 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000867#endif
868
Guido van Rossum30a685f1991-06-27 15:51:29 +0000869 /* More cases here... */
870
871 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000872 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000873 return 0;
874
875 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000876}
877
Guido van Rossum30a685f1991-06-27 15:51:29 +0000878
Guido van Rossum48a680c2001-03-02 06:34:14 +0000879/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000880 Return 1 if the family is known, 0 otherwise. The length is returned
881 through len_ret. */
882
883static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000884getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000885{
886 switch (s->sock_family) {
887
Guido van Rossumb6775db1994-08-01 11:34:53 +0000888#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000889 case AF_UNIX:
890 {
891 *len_ret = sizeof (struct sockaddr_un);
892 return 1;
893 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000894#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000895
896 case AF_INET:
897 {
898 *len_ret = sizeof (struct sockaddr_in);
899 return 1;
900 }
901
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000902#ifdef INET6
903 case AF_INET6:
904 {
905 *len_ret = sizeof (struct sockaddr_in6);
906 return 1;
907 }
908#endif
909
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000910#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000911 case AF_PACKET:
912 {
913 *len_ret = sizeof (struct sockaddr_ll);
914 return 1;
915 }
916#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000917
Guido van Rossum710e1df1992-06-12 10:39:36 +0000918 /* More cases here... */
919
920 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000921 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000922 return 0;
923
924 }
925}
926
927
Guido van Rossum30a685f1991-06-27 15:51:29 +0000928/* s.accept() method */
929
Guido van Rossum73624e91994-10-10 17:59:00 +0000930static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000931PySocketSock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000932{
933 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000934 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000935 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000936 PyObject *sock = NULL;
937 PyObject *addr = NULL;
938 PyObject *res = NULL;
939
Guido van Rossum710e1df1992-06-12 10:39:36 +0000940 if (!getsockaddrlen(s, &addrlen))
941 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000942 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000943 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000944 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000945 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000946#ifdef MS_WINDOWS
947 if (newfd == INVALID_SOCKET)
948#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000949 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000950#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000951 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000952
Guido van Rossum30a685f1991-06-27 15:51:29 +0000953 /* Create the new object with unspecified family,
954 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000955 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000956 s->sock_family,
957 s->sock_type,
958 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000959 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000960 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000961 goto finally;
962 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000963 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000964 addrlen);
965 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000966 goto finally;
967
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000968 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000969
970 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000971 Py_XDECREF(sock);
972 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000973 return res;
974}
975
Guido van Rossum82a5c661998-07-07 20:45:43 +0000976static char accept_doc[] =
977"accept() -> (socket object, address info)\n\
978\n\
979Wait for an incoming connection. Return a new socket representing the\n\
980connection, and the address of the client. For IP sockets, the address\n\
981info is a pair (hostaddr, port).";
982
Guido van Rossum30a685f1991-06-27 15:51:29 +0000983
Guido van Rossume4485b01994-09-07 14:32:49 +0000984/* s.setblocking(1 | 0) method */
985
Guido van Rossum73624e91994-10-10 17:59:00 +0000986static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000987PySocketSock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +0000988{
989 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000990#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000991#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000992 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000993#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000994#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000995 block = PyInt_AsLong(arg);
996 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +0000997 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000998 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000999#ifdef __BEOS__
1000 block = !block;
1001 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
1002 (void *)(&block), sizeof( int ) );
1003#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001004#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001005#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001006#ifdef PYOS_OS2
1007 block = !block;
1008 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
1009#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +00001010 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
1011 if (block)
1012 delay_flag &= (~O_NDELAY);
1013 else
1014 delay_flag |= O_NDELAY;
1015 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001016#endif /* !PYOS_OS2 */
1017#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001018 block = !block;
1019 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001020#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +00001021#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001022#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001023 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +00001024
Guido van Rossum73624e91994-10-10 17:59:00 +00001025 Py_INCREF(Py_None);
1026 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001027}
Guido van Rossume4485b01994-09-07 14:32:49 +00001028
Guido van Rossum82a5c661998-07-07 20:45:43 +00001029static char setblocking_doc[] =
1030"setblocking(flag)\n\
1031\n\
1032Set the socket to blocking (flag is true) or non-blocking (false).\n\
1033This uses the FIONBIO ioctl with the O_NDELAY flag.";
1034
Guido van Rossume4485b01994-09-07 14:32:49 +00001035
Guido van Rossum48a680c2001-03-02 06:34:14 +00001036#ifdef RISCOS
1037/* s.sleeptaskw(1 | 0) method */
1038
1039static PyObject *
1040PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
1041{
1042 int block;
1043 int delay_flag;
1044 if (!PyArg_GetInt(args, &block))
1045 return NULL;
1046 Py_BEGIN_ALLOW_THREADS
1047 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1048 Py_END_ALLOW_THREADS
1049
1050 Py_INCREF(Py_None);
1051 return Py_None;
1052}
1053static char sleeptaskw_doc[] =
1054"sleeptaskw(flag)\n\
1055\n\
1056Allow sleeps in taskwindows.";
1057#endif
1058
1059
Guido van Rossumaee08791992-09-08 09:05:33 +00001060/* s.setsockopt() method.
1061 With an integer third argument, sets an integer option.
1062 With a string third argument, sets an option from a buffer;
1063 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001064
Guido van Rossum73624e91994-10-10 17:59:00 +00001065static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001066PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001067{
1068 int level;
1069 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001070 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001071 char *buf;
1072 int buflen;
1073 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001074
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001075 if (PyArg_ParseTuple(args, "iii:setsockopt",
1076 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001077 buf = (char *) &flag;
1078 buflen = sizeof flag;
1079 }
1080 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001081 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001082 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1083 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001084 return NULL;
1085 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001086 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001087 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001088 return PySocket_Err();
1089 Py_INCREF(Py_None);
1090 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001091}
1092
Guido van Rossum82a5c661998-07-07 20:45:43 +00001093static char setsockopt_doc[] =
1094"setsockopt(level, option, value)\n\
1095\n\
1096Set a socket option. See the Unix manual for level and option.\n\
1097The value argument can either be an integer or a string.";
1098
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001099
Guido van Rossumaee08791992-09-08 09:05:33 +00001100/* s.getsockopt() method.
1101 With two arguments, retrieves an integer option.
1102 With a third integer argument, retrieves a string buffer of that size;
1103 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001104
Guido van Rossum73624e91994-10-10 17:59:00 +00001105static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001106PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001107{
1108 int level;
1109 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001110 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001111 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001112 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001113
Guido van Rossumbcc20741998-08-04 22:53:56 +00001114#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001115 /* We have incomplete socket support. */
1116 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001117 return NULL;
1118#else
1119
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001120 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1121 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001122 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001123
Guido van Rossumbe32c891996-06-20 16:25:29 +00001124 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001125 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001126 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001127 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001128 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001129 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001130 return PySocket_Err();
1131 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001132 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001133 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001134 PyErr_SetString(PySocket_Error,
1135 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001136 return NULL;
1137 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001138 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001139 if (buf == NULL)
1140 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001141 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001142 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001143 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001144 Py_DECREF(buf);
1145 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +00001146 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001147 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001148 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001149#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001150}
1151
Guido van Rossum82a5c661998-07-07 20:45:43 +00001152static char getsockopt_doc[] =
1153"getsockopt(level, option[, buffersize]) -> value\n\
1154\n\
1155Get a socket option. See the Unix manual for level and option.\n\
1156If a nonzero buffersize argument is given, the return value is a\n\
1157string of that length; otherwise it is an integer.";
1158
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001159
Fred Drake728819a2000-07-01 03:40:12 +00001160/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001161
Guido van Rossum73624e91994-10-10 17:59:00 +00001162static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001163PySocketSock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001164{
1165 struct sockaddr *addr;
1166 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001167 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001168
Fred Drake728819a2000-07-01 03:40:12 +00001169 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001170 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001171 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001172 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001173 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001174 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001175 return PySocket_Err();
1176 Py_INCREF(Py_None);
1177 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001178}
1179
Guido van Rossum82a5c661998-07-07 20:45:43 +00001180static char bind_doc[] =
1181"bind(address)\n\
1182\n\
1183Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001184pair (host, port); the host must refer to the local host. For raw packet\n\
1185sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001186
Guido van Rossum30a685f1991-06-27 15:51:29 +00001187
1188/* s.close() method.
1189 Set the file descriptor to -1 so operations tried subsequently
1190 will surely fail. */
1191
Guido van Rossum73624e91994-10-10 17:59:00 +00001192static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001193PySocketSock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001194{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001195 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001196
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001197 if ((fd = s->sock_fd) != -1) {
1198 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001199 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001200 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001201 Py_END_ALLOW_THREADS
1202 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001203 Py_INCREF(Py_None);
1204 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001205}
1206
Guido van Rossum82a5c661998-07-07 20:45:43 +00001207static char close_doc[] =
1208"close()\n\
1209\n\
1210Close the socket. It cannot be used after this call.";
1211
Guido van Rossum30a685f1991-06-27 15:51:29 +00001212
Fred Drake728819a2000-07-01 03:40:12 +00001213/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001214
Guido van Rossum73624e91994-10-10 17:59:00 +00001215static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001216PySocketSock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001217{
1218 struct sockaddr *addr;
1219 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001220 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001221
Fred Drake728819a2000-07-01 03:40:12 +00001222 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001223 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001224 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001225 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001226 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001227 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001228 return PySocket_Err();
1229 Py_INCREF(Py_None);
1230 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001231}
1232
Guido van Rossum82a5c661998-07-07 20:45:43 +00001233static char connect_doc[] =
1234"connect(address)\n\
1235\n\
1236Connect the socket to a remote address. For IP sockets, the address\n\
1237is a pair (host, port).";
1238
Guido van Rossum30a685f1991-06-27 15:51:29 +00001239
Fred Drake728819a2000-07-01 03:40:12 +00001240/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001241
1242static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001243PySocketSock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001244{
1245 struct sockaddr *addr;
1246 int addrlen;
1247 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001248
Fred Drake728819a2000-07-01 03:40:12 +00001249 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001250 return NULL;
1251 Py_BEGIN_ALLOW_THREADS
1252 res = connect(s->sock_fd, addr, addrlen);
1253 Py_END_ALLOW_THREADS
1254 if (res != 0)
1255 res = errno;
1256 return PyInt_FromLong((long) res);
1257}
1258
Guido van Rossum82a5c661998-07-07 20:45:43 +00001259static char connect_ex_doc[] =
1260"connect_ex(address)\n\
1261\n\
1262This is like connect(address), but returns an error code (the errno value)\n\
1263instead of raising an exception when an error occurs.";
1264
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001265
Guido van Rossumed233a51992-06-23 09:07:03 +00001266/* s.fileno() method */
1267
Guido van Rossum73624e91994-10-10 17:59:00 +00001268static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001269PySocketSock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001270{
Fred Drakea04eaad2000-06-30 02:46:07 +00001271#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001272 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001273#else
1274 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1275#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001276}
1277
Guido van Rossum82a5c661998-07-07 20:45:43 +00001278static char fileno_doc[] =
1279"fileno() -> integer\n\
1280\n\
1281Return the integer file descriptor of the socket.";
1282
Guido van Rossumed233a51992-06-23 09:07:03 +00001283
Guido van Rossumbe32c891996-06-20 16:25:29 +00001284#ifndef NO_DUP
1285/* s.dup() method */
1286
1287static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001288PySocketSock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001289{
Fred Drakea04eaad2000-06-30 02:46:07 +00001290 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001291 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001292
Guido van Rossumbe32c891996-06-20 16:25:29 +00001293 newfd = dup(s->sock_fd);
1294 if (newfd < 0)
1295 return PySocket_Err();
1296 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001297 s->sock_family,
1298 s->sock_type,
1299 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001300 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001301 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001302 return sock;
1303}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001304
1305static char dup_doc[] =
1306"dup() -> socket object\n\
1307\n\
1308Return a new socket object connected to the same system resource.";
1309
Guido van Rossumbe32c891996-06-20 16:25:29 +00001310#endif
1311
1312
Guido van Rossumc89705d1992-11-26 08:54:07 +00001313/* s.getsockname() method */
1314
Guido van Rossum73624e91994-10-10 17:59:00 +00001315static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001316PySocketSock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001317{
1318 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001319 int res;
1320 socklen_t addrlen;
1321
Guido van Rossumc89705d1992-11-26 08:54:07 +00001322 if (!getsockaddrlen(s, &addrlen))
1323 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001324 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001325 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001326 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001327 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001328 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001329 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001330 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001331}
1332
Guido van Rossum82a5c661998-07-07 20:45:43 +00001333static char getsockname_doc[] =
1334"getsockname() -> address info\n\
1335\n\
1336Return the address of the local endpoint. For IP sockets, the address\n\
1337info is a pair (hostaddr, port).";
1338
Guido van Rossumc89705d1992-11-26 08:54:07 +00001339
Guido van Rossumb6775db1994-08-01 11:34:53 +00001340#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001341/* s.getpeername() method */
1342
Guido van Rossum73624e91994-10-10 17:59:00 +00001343static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001344PySocketSock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001345{
1346 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001347 int res;
1348 socklen_t addrlen;
1349
Guido van Rossumc89705d1992-11-26 08:54:07 +00001350 if (!getsockaddrlen(s, &addrlen))
1351 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001352 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001353 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001354 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001355 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001356 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001357 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001358 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001359}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001360
1361static char getpeername_doc[] =
1362"getpeername() -> address info\n\
1363\n\
1364Return the address of the remote endpoint. For IP sockets, the address\n\
1365info is a pair (hostaddr, port).";
1366
Guido van Rossumb6775db1994-08-01 11:34:53 +00001367#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001368
1369
Guido van Rossum30a685f1991-06-27 15:51:29 +00001370/* s.listen(n) method */
1371
Guido van Rossum73624e91994-10-10 17:59:00 +00001372static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001373PySocketSock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001374{
1375 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001376 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001377
1378 backlog = PyInt_AsLong(arg);
1379 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001380 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001381 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001382 if (backlog < 1)
1383 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001384 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001385 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001386 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001387 return PySocket_Err();
1388 Py_INCREF(Py_None);
1389 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001390}
1391
Guido van Rossum82a5c661998-07-07 20:45:43 +00001392static char listen_doc[] =
1393"listen(backlog)\n\
1394\n\
1395Enable a server to accept connections. The backlog argument must be at\n\
1396least 1; it specifies the number of unaccepted connection that the system\n\
1397will allow before refusing new connections.";
1398
1399
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001400#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001401/* s.makefile(mode) method.
1402 Create a new open file object referring to a dupped version of
1403 the socket's file descriptor. (The dup() call is necessary so
1404 that the open file and socket objects may be closed independent
1405 of each other.)
1406 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1407
Guido van Rossum73624e91994-10-10 17:59:00 +00001408static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001409PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001410{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001411 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001412 char *mode = "r";
1413 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001414#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001415 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001416#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001417 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001418#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001419 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001420 PyObject *f;
1421
Guido van Rossum43713e52000-02-29 13:59:29 +00001422 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001423 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001424#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001425 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1426 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001427#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001428 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001429#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001430 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001431 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001432 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001433 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001434 }
1435 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1436 if (f != NULL)
1437 PyFile_SetBufSize(f, bufsize);
1438 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001439}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001440
1441static char makefile_doc[] =
1442"makefile([mode[, buffersize]]) -> file object\n\
1443\n\
1444Return a regular file object corresponding to the socket.\n\
1445The mode and buffersize arguments are as for the built-in open() function.";
1446
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001447#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001448
Guido van Rossum48a680c2001-03-02 06:34:14 +00001449
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001450/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001451
Guido van Rossum73624e91994-10-10 17:59:00 +00001452static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001453PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001454{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001455 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001456 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001457 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001458 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001459 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001460 if (buf == NULL)
1461 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001462 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001463 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001464 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001465 if (n < 0) {
1466 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001467 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001468 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001469 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001470 return NULL;
1471 return buf;
1472}
1473
Guido van Rossum82a5c661998-07-07 20:45:43 +00001474static char recv_doc[] =
1475"recv(buffersize[, flags]) -> data\n\
1476\n\
1477Receive up to buffersize bytes from the socket. For the optional flags\n\
1478argument, see the Unix manual. When no data is available, block until\n\
1479at least one byte is available or until the remote end is closed. When\n\
1480the remote end is closed and all data is read, return the empty string.";
1481
Guido van Rossum30a685f1991-06-27 15:51:29 +00001482
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001483/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001484
Guido van Rossum73624e91994-10-10 17:59:00 +00001485static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001486PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001487{
1488 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001489 PyObject *buf = NULL;
1490 PyObject *addr = NULL;
1491 PyObject *ret = NULL;
1492
Guido van Rossumff3ab422000-04-24 15:16:03 +00001493 int len, n, flags = 0;
1494 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001495 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001496 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001497 if (!getsockaddrlen(s, &addrlen))
1498 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001499 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001500 if (buf == NULL)
1501 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001502 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001503 memset(addrbuf, 0, addrlen);
1504 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001505#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001506#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001507 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001508#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001509 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001510#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001511#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001512 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001513#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001514 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001515 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001516 if (n < 0) {
1517 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001518 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001519 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001520 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001521 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001522
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001523 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001524 goto finally;
1525
Guido van Rossum73624e91994-10-10 17:59:00 +00001526 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001527 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001528 Py_XDECREF(addr);
1529 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001530 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001531}
1532
Guido van Rossum82a5c661998-07-07 20:45:43 +00001533static char recvfrom_doc[] =
1534"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1535\n\
1536Like recv(buffersize, flags) but also return the sender's address info.";
1537
Guido van Rossum30a685f1991-06-27 15:51:29 +00001538
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001539/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001540
Guido van Rossum73624e91994-10-10 17:59:00 +00001541static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001542PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001543{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001544 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001545 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001546 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001547 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001548 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001549 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001550 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001551 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001552 return PySocket_Err();
1553 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001554}
1555
Guido van Rossum82a5c661998-07-07 20:45:43 +00001556static char send_doc[] =
1557"send(data[, flags])\n\
1558\n\
1559Send a data string to the socket. For the optional flags\n\
1560argument, see the Unix manual.";
1561
Guido van Rossum30a685f1991-06-27 15:51:29 +00001562
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001563/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001564
Guido van Rossum73624e91994-10-10 17:59:00 +00001565static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001566PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001567{
Guido van Rossum73624e91994-10-10 17:59:00 +00001568 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001569 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001570 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001571 int addrlen, len, n, flags;
1572 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001573 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001574 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001575 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1576 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001577 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001578 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001579 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001580 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001581 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001582 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001583 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001584 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001585 return PySocket_Err();
1586 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001587}
1588
Guido van Rossum82a5c661998-07-07 20:45:43 +00001589static char sendto_doc[] =
1590"sendto(data[, flags], address)\n\
1591\n\
1592Like send(data, flags) but allows specifying the destination address.\n\
1593For IP sockets, the address is a pair (hostaddr, port).";
1594
Guido van Rossum30a685f1991-06-27 15:51:29 +00001595
1596/* s.shutdown(how) method */
1597
Guido van Rossum73624e91994-10-10 17:59:00 +00001598static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001599PySocketSock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001600{
1601 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001602 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001603
1604 how = PyInt_AsLong(arg);
1605 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001606 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001607 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001608 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001609 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001610 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001611 return PySocket_Err();
1612 Py_INCREF(Py_None);
1613 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001614}
1615
Guido van Rossum82a5c661998-07-07 20:45:43 +00001616static char shutdown_doc[] =
1617"shutdown(flag)\n\
1618\n\
1619Shut down the reading side of the socket (flag == 0), the writing side\n\
1620of the socket (flag == 1), or both ends (flag == 2).";
1621
Guido van Rossum30a685f1991-06-27 15:51:29 +00001622
1623/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001624
Guido van Rossum73624e91994-10-10 17:59:00 +00001625static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum17209fc2001-10-15 21:12:54 +00001626 {"accept", (PyCFunction)PySocketSock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001627 accept_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001628 {"bind", (PyCFunction)PySocketSock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001629 bind_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00001630 {"close", (PyCFunction)PySocketSock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001631 close_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001632 {"connect", (PyCFunction)PySocketSock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001633 connect_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001634 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001635 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001636#ifndef NO_DUP
Guido van Rossum17209fc2001-10-15 21:12:54 +00001637 {"dup", (PyCFunction)PySocketSock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001638 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001639#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001640 {"fileno", (PyCFunction)PySocketSock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001641 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001642#ifdef HAVE_GETPEERNAME
Guido van Rossum17209fc2001-10-15 21:12:54 +00001643 {"getpeername", (PyCFunction)PySocketSock_getpeername,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001644 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001645#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001646 {"getsockname", (PyCFunction)PySocketSock_getsockname,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001647 METH_NOARGS, getsockname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001648 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1649 getsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001650 {"listen", (PyCFunction)PySocketSock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001651 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001652#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001653 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1654 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001655#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001656 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1657 recv_doc},
1658 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1659 recvfrom_doc},
1660 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1661 send_doc},
1662 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1663 sendto_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001664 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001665 setblocking_doc},
1666 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1667 setsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001668 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001669 shutdown_doc},
1670#ifdef RISCOS
1671 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1672 sleeptaskw_doc},
1673#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001674 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001675};
1676
Guido van Rossum30a685f1991-06-27 15:51:29 +00001677
Guido van Rossum73624e91994-10-10 17:59:00 +00001678/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001679 First close the file description. */
1680
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001681static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001682PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001683{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001684 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001685 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001686 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001687}
1688
Guido van Rossum30a685f1991-06-27 15:51:29 +00001689
1690/* Return a socket object's named attribute. */
1691
Guido van Rossum73624e91994-10-10 17:59:00 +00001692static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001693PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001694{
Guido van Rossum73624e91994-10-10 17:59:00 +00001695 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001696}
1697
Guido van Rossum30a685f1991-06-27 15:51:29 +00001698
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001699static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001700PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001701{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001702 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001703#if SIZEOF_SOCKET_T > SIZEOF_LONG
1704 if (s->sock_fd > LONG_MAX) {
1705 /* this can occur on Win64, and actually there is a special
1706 ugly printf formatter for decimal pointer length integer
1707 printing, only bother if necessary*/
1708 PyErr_SetString(PyExc_OverflowError,
1709 "no printf formatter to display the socket descriptor in decimal");
1710 return NULL;
1711 }
1712#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001713 sprintf(buf,
1714 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001715 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001716 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001717}
1718
1719
Guido van Rossumb6775db1994-08-01 11:34:53 +00001720/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001721
Guido van Rossum73624e91994-10-10 17:59:00 +00001722static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001723 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001724 0,
1725 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001726 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001727 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001728 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001729 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001730 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001731 0, /*tp_setattr*/
1732 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001733 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001734 0, /*tp_as_number*/
1735 0, /*tp_as_sequence*/
1736 0, /*tp_as_mapping*/
1737};
1738
Guido van Rossum30a685f1991-06-27 15:51:29 +00001739
Guido van Rossum81194471991-07-27 21:42:02 +00001740/* Python interface to gethostname(). */
1741
1742/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001743static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001744PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001745{
1746 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001747 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001748 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001749 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001750 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001751 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001752 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001753 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001754 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001755 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001756 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001757}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001758
Guido van Rossum82a5c661998-07-07 20:45:43 +00001759static char gethostname_doc[] =
1760"gethostname() -> string\n\
1761\n\
1762Return the current host name.";
1763
Guido van Rossumff4949e1992-08-05 19:58:53 +00001764
Guido van Rossum30a685f1991-06-27 15:51:29 +00001765/* Python interface to gethostbyname(name). */
1766
1767/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001768static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001769PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001770{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001771 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001772 struct sockaddr_storage addrbuf;
1773
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001774 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001775 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001776 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001777 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001778 return makeipaddr((struct sockaddr *)&addrbuf,
1779 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001780}
1781
Guido van Rossum82a5c661998-07-07 20:45:43 +00001782static char gethostbyname_doc[] =
1783"gethostbyname(host) -> address\n\
1784\n\
1785Return the IP address (a string of the form '255.255.255.255') for a host.";
1786
1787
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001788/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1789
1790static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001791gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001792{
1793 char **pch;
1794 PyObject *rtn_tuple = (PyObject *)NULL;
1795 PyObject *name_list = (PyObject *)NULL;
1796 PyObject *addr_list = (PyObject *)NULL;
1797 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001798
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001799 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001800 /* Let's get real error message to return */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001801 PyH_Err(h_errno);
1802 return NULL;
1803 }
1804 if (h->h_addrtype != af) {
1805#ifdef HAVE_STRERROR
1806 /* Let's get real error message to return */
1807 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001808#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001809 PyErr_SetString(PySocket_Error,
1810 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001811#endif
1812 return NULL;
1813 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001814 switch (af) {
1815 case AF_INET:
1816 if (alen < sizeof(struct sockaddr_in))
1817 return NULL;
1818 break;
1819#ifdef INET6
1820 case AF_INET6:
1821 if (alen < sizeof(struct sockaddr_in6))
1822 return NULL;
1823 break;
1824#endif
1825 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001826 if ((name_list = PyList_New(0)) == NULL)
1827 goto err;
1828 if ((addr_list = PyList_New(0)) == NULL)
1829 goto err;
1830 for (pch = h->h_aliases; *pch != NULL; pch++) {
1831 int status;
1832 tmp = PyString_FromString(*pch);
1833 if (tmp == NULL)
1834 goto err;
1835 status = PyList_Append(name_list, tmp);
1836 Py_DECREF(tmp);
1837 if (status)
1838 goto err;
1839 }
1840 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1841 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001842 switch (af) {
1843 case AF_INET:
1844 {
1845 struct sockaddr_in sin;
1846 memset(&sin, 0, sizeof(sin));
1847 sin.sin_family = af;
1848#ifdef HAVE_SOCKADDR_SA_LEN
1849 sin.sin_len = sizeof(sin);
1850#endif
1851 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
1852 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
1853 if (pch == h->h_addr_list && alen >= sizeof(sin))
1854 memcpy((char *) addr, &sin, sizeof(sin));
1855 break;
1856 }
1857#ifdef INET6
1858 case AF_INET6:
1859 {
1860 struct sockaddr_in6 sin6;
1861 memset(&sin6, 0, sizeof(sin6));
1862 sin6.sin6_family = af;
1863#ifdef HAVE_SOCKADDR_SA_LEN
1864 sin6.sin6_len = sizeof(sin6);
1865#endif
1866 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
1867 tmp = makeipaddr((struct sockaddr *)&sin6,
1868 sizeof(sin6));
1869 if (pch == h->h_addr_list && alen >= sizeof(sin6))
1870 memcpy((char *) addr, &sin6, sizeof(sin6));
1871 break;
1872 }
1873#endif
1874 default: /* can't happen */
1875 PyErr_SetString(PySocket_Error,
1876 "unsupported address family");
1877 return NULL;
1878 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001879 if (tmp == NULL)
1880 goto err;
1881 status = PyList_Append(addr_list, tmp);
1882 Py_DECREF(tmp);
1883 if (status)
1884 goto err;
1885 }
1886 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1887 err:
1888 Py_XDECREF(name_list);
1889 Py_XDECREF(addr_list);
1890 return rtn_tuple;
1891}
1892
1893
1894/* Python interface to gethostbyname_ex(name). */
1895
1896/*ARGSUSED*/
1897static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001898PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001899{
1900 char *name;
1901 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001902 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001903 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00001904 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001905#ifdef HAVE_GETHOSTBYNAME_R
1906 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001907#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1908 struct hostent_data data;
1909#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001910 char buf[16384];
1911 int buf_len = (sizeof buf) - 1;
1912 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001913#endif
1914#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001915 int result;
1916#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001917#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001918
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001919 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001920 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001921 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001922 return NULL;
1923 Py_BEGIN_ALLOW_THREADS
1924#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001925#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001926 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001927#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001928 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001929#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001930 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001931 result = gethostbyname_r(name, &hp_allocated, &data);
1932 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001933#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001934#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001935#ifdef USE_GETHOSTBYNAME_LOCK
1936 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001937#endif
1938 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001939#endif /* HAVE_GETHOSTBYNAME_R */
1940 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001941 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
1942 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
1943 sa = (struct sockaddr*)&addr;
1944 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00001945#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001946 PyThread_release_lock(gethostbyname_lock);
1947#endif
1948 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001949}
1950
1951static char ghbn_ex_doc[] =
1952"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1953\n\
1954Return the true host name, a list of aliases, and a list of IP addresses,\n\
1955for a host. The host argument is a string giving a host name or IP number.";
1956
1957
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001958/* Python interface to gethostbyaddr(IP). */
1959
1960/*ARGSUSED*/
1961static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001962PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001963{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001964#ifdef INET6
1965 struct sockaddr_storage addr;
1966#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001967 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001968#endif
1969 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001970 char *ip_num;
1971 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001972 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001973#ifdef HAVE_GETHOSTBYNAME_R
1974 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001975#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1976 struct hostent_data data;
1977#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001978 char buf[16384];
1979 int buf_len = (sizeof buf) - 1;
1980 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001981#endif
1982#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001983 int result;
1984#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001985#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001986 char *ap;
1987 int al;
1988 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001989
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001990 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001991 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001992 af = PF_UNSPEC;
1993 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001994 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001995 af = sa->sa_family;
1996 ap = NULL;
1997 al = 0;
1998 switch (af) {
1999 case AF_INET:
2000 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2001 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2002 break;
2003#ifdef INET6
2004 case AF_INET6:
2005 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2006 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2007 break;
2008#endif
2009 default:
2010 PyErr_SetString(PySocket_Error, "unsupported address family");
2011 return NULL;
2012 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002013 Py_BEGIN_ALLOW_THREADS
2014#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002015#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002016 result = gethostbyaddr_r(ap, al, af,
2017 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002018 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002019#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002020 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002021 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002022#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002023 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002024 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002025 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002026#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002027#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002028#ifdef USE_GETHOSTBYNAME_LOCK
2029 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002030#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002031 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002032#endif /* HAVE_GETHOSTBYNAME_R */
2033 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002034 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002035#ifdef USE_GETHOSTBYNAME_LOCK
2036 PyThread_release_lock(gethostbyname_lock);
2037#endif
2038 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002039}
2040
Guido van Rossum82a5c661998-07-07 20:45:43 +00002041static char gethostbyaddr_doc[] =
2042"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2043\n\
2044Return the true host name, a list of aliases, and a list of IP addresses,\n\
2045for a host. The host argument is a string giving a host name or IP number.";
2046
Guido van Rossum30a685f1991-06-27 15:51:29 +00002047
2048/* Python interface to getservbyname(name).
2049 This only returns the port number, since the other info is already
2050 known or not useful (like the list of aliases). */
2051
2052/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002053static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002054PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002055{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002056 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002057 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002058 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002059 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002060 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002061 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002062 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002063 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002064 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002065 return NULL;
2066 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002067 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002068}
2069
Guido van Rossum82a5c661998-07-07 20:45:43 +00002070static char getservbyname_doc[] =
2071"getservbyname(servicename, protocolname) -> integer\n\
2072\n\
2073Return a port number from a service name and protocol name.\n\
2074The protocol name should be 'tcp' or 'udp'.";
2075
Guido van Rossum30a685f1991-06-27 15:51:29 +00002076
Guido van Rossum3901d851996-12-19 16:35:04 +00002077/* Python interface to getprotobyname(name).
2078 This only returns the protocol number, since the other info is
2079 already known or not useful (like the list of aliases). */
2080
2081/*ARGSUSED*/
2082static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002083PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002084{
2085 char *name;
2086 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002087#ifdef __BEOS__
2088/* Not available in BeOS yet. - [cjh] */
2089 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2090 return NULL;
2091#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002092 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002093 return NULL;
2094 Py_BEGIN_ALLOW_THREADS
2095 sp = getprotobyname(name);
2096 Py_END_ALLOW_THREADS
2097 if (sp == NULL) {
2098 PyErr_SetString(PySocket_Error, "protocol not found");
2099 return NULL;
2100 }
2101 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002102#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002103}
2104
Guido van Rossum82a5c661998-07-07 20:45:43 +00002105static char getprotobyname_doc[] =
2106"getprotobyname(name) -> integer\n\
2107\n\
2108Return the protocol number for the named protocol. (Rarely used.)";
2109
Guido van Rossum3901d851996-12-19 16:35:04 +00002110
Guido van Rossum30a685f1991-06-27 15:51:29 +00002111/* Python interface to socket(family, type, proto).
2112 The third (protocol) argument is optional.
2113 Return a new socket object. */
2114
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002115/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002116static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002117PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002118{
Guido van Rossum73624e91994-10-10 17:59:00 +00002119 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002120 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002121 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00002122 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002123 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002124 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002125 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002126 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00002127#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002128 if (fd == INVALID_SOCKET)
2129#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002130 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002131#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002132 return PySocket_Err();
2133 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002134 /* If the object can't be created, don't forget to close the
2135 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002136 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002137 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00002138 /* From now on, ignore SIGPIPE and let the error checking
2139 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002140#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00002141 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002142#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002143 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002144}
2145
Guido van Rossum82a5c661998-07-07 20:45:43 +00002146static char socket_doc[] =
2147"socket(family, type[, proto]) -> socket object\n\
2148\n\
2149Open a socket of the given type. The family argument specifies the\n\
2150address family; it is normally AF_INET, sometimes AF_UNIX.\n\
2151The type argument specifies whether this is a stream (SOCK_STREAM)\n\
2152or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
2153specifying the default protocol.";
2154
2155
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002156#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002157/* Create a socket object from a numeric file description.
2158 Useful e.g. if stdin is a socket.
2159 Additional arguments as for socket(). */
2160
2161/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002162static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002163PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002164{
Guido van Rossum73624e91994-10-10 17:59:00 +00002165 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002166 SOCKET_T fd;
2167 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002168 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2169 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002170 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002171 /* Dup the fd so it and the socket can be closed independently */
2172 fd = dup(fd);
2173 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002174 return PySocket_Err();
2175 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002176 /* From now on, ignore SIGPIPE and let the error checking
2177 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002178#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002179 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002180#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002181 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002182}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002183
2184static char fromfd_doc[] =
2185"fromfd(fd, family, type[, proto]) -> socket object\n\
2186\n\
2187Create a socket object from the given file descriptor.\n\
2188The remaining arguments are the same as for socket().";
2189
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002190#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002191
Guido van Rossum82a5c661998-07-07 20:45:43 +00002192
Guido van Rossum006bf911996-06-12 04:04:55 +00002193static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002194PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002195{
2196 int x1, x2;
2197
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002198 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002199 return NULL;
2200 }
2201 x2 = (int)ntohs((short)x1);
2202 return PyInt_FromLong(x2);
2203}
2204
Guido van Rossum82a5c661998-07-07 20:45:43 +00002205static char ntohs_doc[] =
2206"ntohs(integer) -> integer\n\
2207\n\
2208Convert a 16-bit integer from network to host byte order.";
2209
2210
Guido van Rossum006bf911996-06-12 04:04:55 +00002211static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002212PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002213{
2214 int x1, x2;
2215
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002216 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002217 return NULL;
2218 }
2219 x2 = ntohl(x1);
2220 return PyInt_FromLong(x2);
2221}
2222
Guido van Rossum82a5c661998-07-07 20:45:43 +00002223static char ntohl_doc[] =
2224"ntohl(integer) -> integer\n\
2225\n\
2226Convert a 32-bit integer from network to host byte order.";
2227
2228
Guido van Rossum006bf911996-06-12 04:04:55 +00002229static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002230PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002231{
2232 int x1, x2;
2233
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002234 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002235 return NULL;
2236 }
2237 x2 = (int)htons((short)x1);
2238 return PyInt_FromLong(x2);
2239}
2240
Guido van Rossum82a5c661998-07-07 20:45:43 +00002241static char htons_doc[] =
2242"htons(integer) -> integer\n\
2243\n\
2244Convert a 16-bit integer from host to network byte order.";
2245
2246
Guido van Rossum006bf911996-06-12 04:04:55 +00002247static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002248PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002249{
2250 int x1, x2;
2251
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002252 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002253 return NULL;
2254 }
2255 x2 = htonl(x1);
2256 return PyInt_FromLong(x2);
2257}
2258
Guido van Rossum82a5c661998-07-07 20:45:43 +00002259static char htonl_doc[] =
2260"htonl(integer) -> integer\n\
2261\n\
2262Convert a 32-bit integer from host to network byte order.";
2263
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002264/*
2265 * socket.inet_aton() and socket.inet_ntoa() functions
2266 *
2267 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2268 *
2269 */
2270
Guido van Rossum48a680c2001-03-02 06:34:14 +00002271static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002272"inet_aton(string) -> packed 32-bit IP representation\n\
2273\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002274Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002275binary format used in low-level network functions.";
2276
2277static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002278PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002279{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002280#ifndef INADDR_NONE
2281#define INADDR_NONE (-1)
2282#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002283
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002284 /* Have to use inet_addr() instead */
2285 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002286 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002287
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002288 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002289 return NULL;
2290 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002291#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002292 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002293#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002294 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002295#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002296
2297 if (packed_addr == INADDR_NONE) { /* invalid address */
2298 PyErr_SetString(PySocket_Error,
2299 "illegal IP address string passed to inet_aton");
2300 return NULL;
2301 }
2302
2303 return PyString_FromStringAndSize((char *) &packed_addr,
2304 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002305}
2306
Guido van Rossum48a680c2001-03-02 06:34:14 +00002307static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002308"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002309\n\
2310Convert an IP address from 32-bit packed binary format to string format";
2311
2312static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002313PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002314{
2315 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002316 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002317 struct in_addr packed_addr;
2318
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002319 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002320 return NULL;
2321 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002322
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002323 if (addr_len != sizeof(packed_addr)) {
2324 PyErr_SetString(PySocket_Error,
2325 "packed IP wrong length for inet_ntoa");
2326 return NULL;
2327 }
2328
2329 memcpy(&packed_addr, packed_str, addr_len);
2330
2331 return PyString_FromString(inet_ntoa(packed_addr));
2332}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002333
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002334/* Python interface to getaddrinfo(host, port). */
2335
2336/*ARGSUSED*/
2337static PyObject *
2338PySocket_getaddrinfo(PyObject *self, PyObject *args)
2339{
2340 struct addrinfo hints, *res0, *res;
2341 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002342 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002343 char *hptr, *pptr;
2344 int family, socktype, protocol, flags;
2345 int error;
2346 PyObject *all = (PyObject *)NULL;
2347 PyObject *single = (PyObject *)NULL;
2348
2349 family = socktype = protocol = flags = 0;
2350 family = PF_UNSPEC;
2351 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2352 &hptr, &pobj, &family, &socktype,
2353 &protocol, &flags)) {
2354 return NULL;
2355 }
2356 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002357 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002358 pptr = pbuf;
2359 } else if (PyString_Check(pobj)) {
2360 pptr = PyString_AsString(pobj);
2361 } else if (pobj == Py_None) {
2362 pptr = (char *)NULL;
2363 } else {
2364 PyErr_SetString(PySocket_Error, "Int or String expected");
2365 return NULL;
2366 }
2367 memset(&hints, 0, sizeof(hints));
2368 hints.ai_family = family;
2369 hints.ai_socktype = socktype;
2370 hints.ai_protocol = protocol;
2371 hints.ai_flags = flags;
2372 error = getaddrinfo(hptr, pptr, &hints, &res0);
2373 if (error) {
2374 PyGAI_Err(error);
2375 return NULL;
2376 }
2377
2378 if ((all = PyList_New(0)) == NULL)
2379 goto err;
2380 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002381 PyObject *addr =
2382 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2383 if (addr == NULL)
2384 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002385 single = Py_BuildValue("iiisO", res->ai_family,
2386 res->ai_socktype, res->ai_protocol,
2387 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002388 addr);
2389 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002390 if (single == NULL)
2391 goto err;
2392
2393 if (PyList_Append(all, single))
2394 goto err;
2395 Py_XDECREF(single);
2396 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002397 return all;
2398 err:
2399 Py_XDECREF(single);
2400 Py_XDECREF(all);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002401 return (PyObject *)NULL;
2402}
2403
2404static char getaddrinfo_doc[] =
2405"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2406 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2407\n\
2408Resolve host and port into addrinfo struct.";
2409
2410/* Python interface to getnameinfo(sa, flags). */
2411
2412/*ARGSUSED*/
2413static PyObject *
2414PySocket_getnameinfo(PyObject *self, PyObject *args)
2415{
2416 PyObject *sa = (PyObject *)NULL;
2417 int flags;
2418 char *hostp;
2419 int n, port, flowinfo, scope_id;
2420 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2421 struct addrinfo hints, *res = NULL;
2422 int error;
2423 PyObject *ret = (PyObject *)NULL;
2424
2425 flags = flowinfo = scope_id = 0;
2426 if (PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags) == 0)
2427 return NULL;
2428 n = PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, scope_id);
2429 if (n == 0)
2430 goto fail;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002431 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002432 memset(&hints, 0, sizeof(hints));
2433 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002434 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002435 error = getaddrinfo(hostp, pbuf, &hints, &res);
2436 if (error) {
2437 PyGAI_Err(error);
2438 goto fail;
2439 }
2440 if (res->ai_next) {
2441 PyErr_SetString(PySocket_Error,
2442 "sockaddr resolved to multiple addresses");
2443 goto fail;
2444 }
2445 switch (res->ai_family) {
2446 case AF_INET:
2447 {
2448 char *t1;
2449 int t2;
2450 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2451 PyErr_SetString(PySocket_Error,
2452 "IPv4 sockaddr must be 2 tuple");
2453 goto fail;
2454 }
2455 break;
2456 }
2457#ifdef INET6
2458 case AF_INET6:
2459 {
2460 struct sockaddr_in6 *sin6;
2461 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2462 sin6->sin6_flowinfo = flowinfo;
2463 sin6->sin6_scope_id = scope_id;
2464 break;
2465 }
2466#endif
2467 }
2468 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2469 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2470 if (error) {
2471 PyGAI_Err(error);
2472 goto fail;
2473 }
2474 ret = Py_BuildValue("ss", hbuf, pbuf);
2475
2476fail:
2477 if (res)
2478 freeaddrinfo(res);
2479 Py_XDECREF(sa);
2480 return ret;
2481}
2482
2483static char getnameinfo_doc[] =
2484"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2485\n\
2486Get host and port for a sockaddr.";
2487
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002488/* XXX It might be helpful to augment the error message generated
2489 below with the name of the SSL function that generated the error.
2490 I expect it's obvious most of the time.
2491*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002492
2493#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002494static PyObject *
2495PySSL_SetError(SSL *ssl, int ret)
2496{
2497 PyObject *v, *n, *s;
2498 char *errstr;
2499 int err;
2500
2501 assert(ret <= 0);
2502
2503 err = SSL_get_error(ssl, ret);
2504 n = PyInt_FromLong(err);
2505 if (n == NULL)
2506 return NULL;
2507 v = PyTuple_New(2);
2508 if (v == NULL) {
2509 Py_DECREF(n);
2510 return NULL;
2511 }
2512
2513 switch (SSL_get_error(ssl, ret)) {
2514 case SSL_ERROR_ZERO_RETURN:
2515 errstr = "TLS/SSL connection has been closed";
2516 break;
2517 case SSL_ERROR_WANT_READ:
2518 errstr = "The operation did not complete (read)";
2519 break;
2520 case SSL_ERROR_WANT_WRITE:
2521 errstr = "The operation did not complete (write)";
2522 break;
2523 case SSL_ERROR_WANT_X509_LOOKUP:
2524 errstr = "The operation did not complete (X509 lookup)";
2525 break;
2526 case SSL_ERROR_SYSCALL:
2527 case SSL_ERROR_SSL:
2528 {
2529 unsigned long e = ERR_get_error();
2530 if (e == 0) {
2531 /* an EOF was observed that violates the protocol */
2532 errstr = "EOF occurred in violation of protocol";
2533 } else if (e == -1) {
2534 /* the underlying BIO reported an I/O error */
2535 Py_DECREF(v);
2536 Py_DECREF(n);
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +00002537 return PySocket_Err();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002538 } else {
2539 /* XXX Protected by global interpreter lock */
2540 errstr = ERR_error_string(e, NULL);
2541 }
2542 break;
2543 }
2544 default:
2545 errstr = "Invalid error code";
2546 }
2547 s = PyString_FromString(errstr);
2548 if (s == NULL) {
2549 Py_DECREF(v);
2550 Py_DECREF(n);
2551 }
2552 PyTuple_SET_ITEM(v, 0, n);
2553 PyTuple_SET_ITEM(v, 1, s);
2554 PyErr_SetObject(PySSLErrorObject, v);
2555 return NULL;
2556}
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002557
2558/* This is a C function to be called for new object initialization */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002559static PySSLObject *
2560newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002561{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002562 PySSLObject *self;
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002563 char *errstr = NULL;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002564 int ret;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002565
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002566 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002567 if (self == NULL){
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002568 errstr = "newPySSLObject error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002569 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002570 }
Jeremy Hyltonba699362001-10-11 17:23:34 +00002571 memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
2572 memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002573 self->server_cert = NULL;
2574 self->ssl = NULL;
2575 self->ctx = NULL;
2576 self->Socket = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002577
Jeremy Hylton22738b92001-10-10 22:37:48 +00002578 if ((key_file && !cert_file) || (!key_file && cert_file)) {
2579 errstr = "Both the key & certificate files must be specified";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002580 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002581 }
2582
Jeremy Hylton22738b92001-10-10 22:37:48 +00002583 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2584 if (self->ctx == NULL) {
2585 errstr = "SSL_CTX_new error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002586 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002587 }
2588
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002589 if (key_file) {
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002590 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002591 SSL_FILETYPE_PEM) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002592 errstr = "SSL_CTX_use_PrivateKey_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002593 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002594 }
2595
2596 if (SSL_CTX_use_certificate_chain_file(self->ctx,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002597 cert_file) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002598 errstr = "SSL_CTX_use_certificate_chain_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002599 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002600 }
2601 }
2602
2603 SSL_CTX_set_verify(self->ctx,
2604 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2605 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2606 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2607 SSL_set_connect_state(self->ssl);
2608
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002609 /* Actually negotiate SSL connection */
2610 /* XXX If SSL_connect() returns 0, it's also a failure. */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002611 ret = SSL_connect(self->ssl);
2612 if (ret <= 0) {
2613 PySSL_SetError(self->ssl, ret);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002614 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002615 }
2616 self->ssl->debug = 1;
2617
2618 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2619 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002620 self->server, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002621 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002622 self->issuer, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002623 }
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002624 self->Socket = Sock;
2625 Py_INCREF(self->Socket);
2626 return self;
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002627 fail:
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002628 if (errstr)
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002629 PyErr_SetString(PySSLErrorObject, errstr);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002630 Py_DECREF(self);
2631 return NULL;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002632}
2633
2634/* This is the Python function called for new object initialization */
2635static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002636PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002637{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002638 PySSLObject *rv;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002639 PySocketSockObject *Sock;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002640 char *key_file = NULL;
2641 char *cert_file = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002642
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002643 if (!PyArg_ParseTuple(args, "O!|zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002644 &PySocketSock_Type, (PyObject*)&Sock,
Jeremy Hyltonab006452001-10-10 03:33:24 +00002645 &key_file, &cert_file))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002646 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002647
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002648 rv = newPySSLObject(Sock, key_file, cert_file);
Jeremy Hyltonab006452001-10-10 03:33:24 +00002649 if (rv == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002650 return NULL;
2651 return (PyObject *)rv;
2652}
2653
2654static char ssl_doc[] =
Jeremy Hyltonba699362001-10-11 17:23:34 +00002655"ssl(socket, [keyfile, certfile]) -> sslobject";
2656
2657/* SSL object methods */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002658
2659static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002660PySSL_server(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002661{
2662 return PyString_FromString(self->server);
2663}
2664
2665static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002666PySSL_issuer(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002667{
2668 return PyString_FromString(self->issuer);
2669}
2670
2671
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002672static void PySSL_dealloc(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002673{
2674 if (self->server_cert) /* Possible not to have one? */
2675 X509_free (self->server_cert);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002676 if (self->ssl)
2677 SSL_free(self->ssl);
2678 if (self->ctx)
2679 SSL_CTX_free(self->ctx);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002680 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002681 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002682}
2683
Jeremy Hyltonba699362001-10-11 17:23:34 +00002684static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
2685{
2686 char *data;
2687 int len;
2688
2689 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
2690 return NULL;
2691
2692 len = SSL_write(self->ssl, data, len);
2693 if (len > 0)
2694 return PyInt_FromLong(len);
2695 else
2696 return PySSL_SetError(self->ssl, len);
2697}
2698
2699static char PySSL_SSLwrite_doc[] =
2700"write(s) -> len\n\
2701\n\
2702Writes the string s into the SSL object. Returns the number\n\
2703of bytes written.";
2704
2705static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
2706{
2707 PyObject *buf;
2708 int count = 0;
2709 int len = 1024;
2710
2711 if (!PyArg_ParseTuple(args, "|i:read", &len))
2712 return NULL;
2713
2714 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2715 return NULL;
2716
2717 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2718 if (count <= 0) {
2719 Py_DECREF(buf);
2720 return PySSL_SetError(self->ssl, count);
2721 }
2722 if (count != len && _PyString_Resize(&buf, count) < 0)
2723 return NULL;
2724 return buf;
2725}
2726
2727static char PySSL_SSLread_doc[] =
2728"read([len]) -> string\n\
2729\n\
2730Read up to len bytes from the SSL socket.";
2731
2732static PyMethodDef PySSLMethods[] = {
2733 {"write", (PyCFunction)PySSL_SSLwrite, 1,
2734 PySSL_SSLwrite_doc},
2735 {"read", (PyCFunction)PySSL_SSLread, 1,
2736 PySSL_SSLread_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00002737 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
2738 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Jeremy Hyltonba699362001-10-11 17:23:34 +00002739 {NULL, NULL}
2740};
2741
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002742static PyObject *PySSL_getattr(PySSLObject *self, char *name)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002743{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002744 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002745}
2746
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002747staticforward PyTypeObject PySSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002748 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002749 0, /*ob_size*/
2750 "SSL", /*tp_name*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002751 sizeof(PySSLObject), /*tp_basicsize*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002752 0, /*tp_itemsize*/
2753 /* methods */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002754 (destructor)PySSL_dealloc, /*tp_dealloc*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002755 0, /*tp_print*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002756 (getattrfunc)PySSL_getattr, /*tp_getattr*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002757 0, /*tp_setattr*/
2758 0, /*tp_compare*/
2759 0, /*tp_repr*/
2760 0, /*tp_as_number*/
2761 0, /*tp_as_sequence*/
2762 0, /*tp_as_mapping*/
2763 0, /*tp_hash*/
2764};
2765
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002766/* helper routines for seeding the SSL PRNG */
2767static PyObject *
2768PySSL_RAND_add(PyObject *self, PyObject *args)
2769{
2770 char *buf;
2771 int len;
2772 double entropy;
2773
2774 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
2775 return NULL;
2776 RAND_add(buf, len, entropy);
2777 Py_INCREF(Py_None);
2778 return Py_None;
2779}
2780
2781static char PySSL_RAND_add_doc[] =
2782"RAND_add(string, entropy)\n\
2783\n\
2784Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
2785bound on the entropy contained in string.";
2786
2787static PyObject *
2788PySSL_RAND_status(PyObject *self)
2789{
2790 return PyInt_FromLong(RAND_status());
2791}
2792
2793static char PySSL_RAND_status_doc[] =
2794"RAND_status() -> 0 or 1\n\
2795\n\
2796Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
2797It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
2798using the ssl() function.";
2799
2800static PyObject *
2801PySSL_RAND_egd(PyObject *self, PyObject *arg)
2802{
2803 int bytes;
2804
2805 if (!PyString_Check(arg))
2806 return PyErr_Format(PyExc_TypeError,
2807 "RAND_egd() expected string, found %s",
2808 arg->ob_type->tp_name);
2809 bytes = RAND_egd(PyString_AS_STRING(arg));
2810 if (bytes == -1) {
2811 PyErr_SetString(PySSLErrorObject,
2812 "EGD connection failed or EGD did not return "
2813 "enough data to seed the PRNG");
2814 return NULL;
2815 }
2816 return PyInt_FromLong(bytes);
2817}
2818
2819static char PySSL_RAND_egd_doc[] =
2820"RAND_egd(path) -> bytes
2821\n\
2822Queries the entropy gather daemon (EGD) on socket path. Returns number\n\
2823of bytes read. Raises socket.sslerror if connection to EGD fails or\n\
2824if it does provide enough data to seed PRNG.";
2825
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002826#endif /* USE_SSL */
2827
2828
Guido van Rossum30a685f1991-06-27 15:51:29 +00002829/* List of functions exported by this module. */
2830
Guido van Rossum73624e91994-10-10 17:59:00 +00002831static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002832 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002833 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002834 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002835 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002836 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002837 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002838 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002839 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002840 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002841 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002842 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002843 METH_VARARGS,getprotobyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002844 {"socket", PySocket_socket,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002845 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002846#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002847 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002848 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002849#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002850 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002851 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002852 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002853 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002854 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002855 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002856 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002857 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002858 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002859 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002860 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002861 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002862 {"getaddrinfo", PySocket_getaddrinfo,
2863 METH_VARARGS, getaddrinfo_doc},
2864 {"getnameinfo", PySocket_getnameinfo,
2865 METH_VARARGS, getnameinfo_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002866#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002867 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002868 METH_VARARGS, ssl_doc},
Jeremy Hyltonde80f2e2001-10-18 00:28:50 +00002869 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
2870 PySSL_RAND_add_doc},
2871 {"RAND_egd", PySSL_RAND_egd, METH_O,
2872 PySSL_RAND_egd_doc},
2873 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
2874 PySSL_RAND_status_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002875#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002876 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002877};
2878
Guido van Rossum30a685f1991-06-27 15:51:29 +00002879
2880/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002881 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002882 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002883 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002884static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002885insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002886{
Guido van Rossum73624e91994-10-10 17:59:00 +00002887 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002888 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002889 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002890
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002891 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002892}
2893
Guido van Rossum30a685f1991-06-27 15:51:29 +00002894
Guido van Rossum8d665e61996-06-26 18:22:49 +00002895#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002896
2897/* Additional initialization and cleanup for NT/Windows */
2898
2899static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002900NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002901{
2902 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002903}
2904
2905static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002906NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002907{
2908 WSADATA WSAData;
2909 int ret;
2910 char buf[100];
2911 ret = WSAStartup(0x0101, &WSAData);
2912 switch (ret) {
2913 case 0: /* no error */
2914 atexit(NTcleanup);
2915 return 1;
2916 case WSASYSNOTREADY:
2917 PyErr_SetString(PyExc_ImportError,
2918 "WSAStartup failed: network not ready");
2919 break;
2920 case WSAVERNOTSUPPORTED:
2921 case WSAEINVAL:
2922 PyErr_SetString(PyExc_ImportError,
2923 "WSAStartup failed: requested version not supported");
2924 break;
2925 default:
2926 sprintf(buf, "WSAStartup failed: error code %d", ret);
2927 PyErr_SetString(PyExc_ImportError, buf);
2928 break;
2929 }
2930 return 0;
2931}
2932
Guido van Rossum8d665e61996-06-26 18:22:49 +00002933#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002934
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002935#if defined(PYOS_OS2)
2936
2937/* Additional initialization and cleanup for OS/2 */
2938
2939static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002940OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002941{
2942 /* No cleanup is necessary for OS/2 Sockets */
2943}
2944
2945static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002946OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002947{
2948 char reason[64];
2949 int rc = sock_init();
2950
2951 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002952 atexit(OS2cleanup);
2953 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002954 }
2955
2956 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2957 PyErr_SetString(PyExc_ImportError, reason);
2958
Guido van Rossum32c575d1997-12-02 20:37:32 +00002959 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002960}
2961
2962#endif /* PYOS_OS2 */
2963
Guido van Rossum30a685f1991-06-27 15:51:29 +00002964/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002965 * This is called when the first 'import socket' is done,
2966 * via a table in config.c, if config.c is compiled with USE_SOCKET
2967 * defined.
2968 *
2969 * For MS_WINDOWS (which means any Windows variant), this module
2970 * is actually called "_socket", and there's a wrapper "socket.py"
2971 * which implements some missing functionality (such as makefile(),
2972 * dup() and fromfd()). The import of "_socket" may fail with an
2973 * ImportError exception if initialization of WINSOCK fails. When
2974 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2975 * scheduled to be made at exit time.
2976 *
2977 * For OS/2, this module is also called "_socket" and uses a wrapper
2978 * "socket.py" which implements that functionality that is missing
2979 * when PC operating systems don't put socket descriptors in the
2980 * operating system's filesystem layer.
2981 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002982
Guido van Rossum82a5c661998-07-07 20:45:43 +00002983static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002984"Implementation module for socket operations. See the socket module\n\
2985for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002986
2987static char sockettype_doc[] =
2988"A socket represents one endpoint of a network connection.\n\
2989\n\
2990Methods:\n\
2991\n\
2992accept() -- accept a connection, returning new socket and client address\n\
2993bind() -- bind the socket to a local address\n\
2994close() -- close the socket\n\
2995connect() -- connect the socket to a remote address\n\
2996connect_ex() -- connect, return an error code instead of an exception \n\
2997dup() -- return a new socket object identical to the current one (*)\n\
2998fileno() -- return underlying file descriptor\n\
2999getpeername() -- return remote address (*)\n\
3000getsockname() -- return local address\n\
3001getsockopt() -- get socket options\n\
3002listen() -- start listening for incoming connections\n\
3003makefile() -- return a file object corresponding tot the socket (*)\n\
3004recv() -- receive data\n\
3005recvfrom() -- receive data and sender's address\n\
3006send() -- send data\n\
3007sendto() -- send data to a given address\n\
3008setblocking() -- set or clear the blocking I/O flag\n\
3009setsockopt() -- set socket options\n\
3010shutdown() -- shut down traffic in one or both directions\n\
3011\n\
3012(*) not available on all platforms!)";
3013
Guido van Rossum3886bb61998-12-04 18:50:17 +00003014DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003015init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003016{
Guido van Rossum73624e91994-10-10 17:59:00 +00003017 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003018#ifdef RISCOS
3019 _kernel_swi_regs r;
3020 r.r[0]=0;
3021 _kernel_swi(0x43380, &r, &r);
3022 taskwindow = r.r[0];
3023#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00003024#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00003025 if (!NTinit())
3026 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00003027#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00003028#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003029 if (!OS2init())
3030 return;
Fred Drakea136d492000-08-16 14:18:30 +00003031#endif /* __TOS_OS2__ */
3032#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00003033#endif /* RISCOS */
Guido van Rossuma120ffc2001-01-22 15:29:14 +00003034#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003035 PySSL_Type.ob_type = &PyType_Type;
Guido van Rossuma120ffc2001-01-22 15:29:14 +00003036#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00003037 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00003038 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003039 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
3040 if (PySocket_Error == NULL)
3041 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003042 PyDict_SetItemString(d, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003043 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
3044 if (PyH_Error == NULL)
3045 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003046 PyDict_SetItemString(d, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003047 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
3048 NULL);
3049 if (PyGAI_Error == NULL)
3050 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00003051 PyDict_SetItemString(d, "gaierror", PyGAI_Error);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003052#ifdef USE_SSL
3053 SSL_load_error_strings();
3054 SSLeay_add_ssl_algorithms();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003055 PySSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
3056 if (PySSLErrorObject == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003057 return;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003058 PyDict_SetItemString(d, "sslerror", PySSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003059 if (PyDict_SetItemString(d, "SSLType",
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00003060 (PyObject *)&PySSL_Type) != 0)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003061 return;
Jeremy Hylton57ca8732001-10-11 00:00:17 +00003062 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
3063 SSL_ERROR_ZERO_RETURN);
3064 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
3065 SSL_ERROR_WANT_READ);
3066 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
3067 SSL_ERROR_WANT_WRITE);
3068 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
3069 SSL_ERROR_WANT_X509_LOOKUP);
3070 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
3071 SSL_ERROR_SYSCALL);
3072 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
3073 SSL_ERROR_SSL);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003074#endif /* USE_SSL */
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00003075 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00003076 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum91ba64d1997-06-02 22:18:09 +00003077 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00003078 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003079 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003080
3081 /* Address families (we only support AF_INET and AF_UNIX) */
3082#ifdef AF_UNSPEC
3083 insint(d, "AF_UNSPEC", AF_UNSPEC);
3084#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003085 insint(d, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003086#ifdef AF_INET6
3087 insint(d, "AF_INET6", AF_INET6);
3088#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003089#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003090 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003091#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003092#ifdef AF_AX25
3093 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
3094#endif
3095#ifdef AF_IPX
3096 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
3097#endif
3098#ifdef AF_APPLETALK
3099 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
3100#endif
3101#ifdef AF_NETROM
3102 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
3103#endif
3104#ifdef AF_BRIDGE
3105 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
3106#endif
3107#ifdef AF_AAL5
3108 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
3109#endif
3110#ifdef AF_X25
3111 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
3112#endif
3113#ifdef AF_INET6
3114 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
3115#endif
3116#ifdef AF_ROSE
3117 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
3118#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003119#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00003120 insint(d, "AF_PACKET", AF_PACKET);
3121 insint(d, "PF_PACKET", PF_PACKET);
3122 insint(d, "PACKET_HOST", PACKET_HOST);
3123 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
3124 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
3125 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3126 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
3127 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3128 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003129#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003130
3131 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003132 insint(d, "SOCK_STREAM", SOCK_STREAM);
3133 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003134#ifndef __BEOS__
3135/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003136 insint(d, "SOCK_RAW", SOCK_RAW);
3137 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3138 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003139#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003140
3141#ifdef SO_DEBUG
3142 insint(d, "SO_DEBUG", SO_DEBUG);
3143#endif
3144#ifdef SO_ACCEPTCONN
3145 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
3146#endif
3147#ifdef SO_REUSEADDR
3148 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
3149#endif
3150#ifdef SO_KEEPALIVE
3151 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
3152#endif
3153#ifdef SO_DONTROUTE
3154 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
3155#endif
3156#ifdef SO_BROADCAST
3157 insint(d, "SO_BROADCAST", SO_BROADCAST);
3158#endif
3159#ifdef SO_USELOOPBACK
3160 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
3161#endif
3162#ifdef SO_LINGER
3163 insint(d, "SO_LINGER", SO_LINGER);
3164#endif
3165#ifdef SO_OOBINLINE
3166 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
3167#endif
3168#ifdef SO_REUSEPORT
3169 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
3170#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003171#ifdef SO_SNDBUF
3172 insint(d, "SO_SNDBUF", SO_SNDBUF);
3173#endif
3174#ifdef SO_RCVBUF
3175 insint(d, "SO_RCVBUF", SO_RCVBUF);
3176#endif
3177#ifdef SO_SNDLOWAT
3178 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
3179#endif
3180#ifdef SO_RCVLOWAT
3181 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
3182#endif
3183#ifdef SO_SNDTIMEO
3184 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
3185#endif
3186#ifdef SO_RCVTIMEO
3187 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
3188#endif
3189#ifdef SO_ERROR
3190 insint(d, "SO_ERROR", SO_ERROR);
3191#endif
3192#ifdef SO_TYPE
3193 insint(d, "SO_TYPE", SO_TYPE);
3194#endif
3195
3196 /* Maximum number of connections for "listen" */
3197#ifdef SOMAXCONN
3198 insint(d, "SOMAXCONN", SOMAXCONN);
3199#else
3200 insint(d, "SOMAXCONN", 5); /* Common value */
3201#endif
3202
3203 /* Flags for send, recv */
3204#ifdef MSG_OOB
3205 insint(d, "MSG_OOB", MSG_OOB);
3206#endif
3207#ifdef MSG_PEEK
3208 insint(d, "MSG_PEEK", MSG_PEEK);
3209#endif
3210#ifdef MSG_DONTROUTE
3211 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
3212#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003213#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00003214 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003215#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003216#ifdef MSG_EOR
3217 insint(d, "MSG_EOR", MSG_EOR);
3218#endif
3219#ifdef MSG_TRUNC
3220 insint(d, "MSG_TRUNC", MSG_TRUNC);
3221#endif
3222#ifdef MSG_CTRUNC
3223 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
3224#endif
3225#ifdef MSG_WAITALL
3226 insint(d, "MSG_WAITALL", MSG_WAITALL);
3227#endif
3228#ifdef MSG_BTAG
3229 insint(d, "MSG_BTAG", MSG_BTAG);
3230#endif
3231#ifdef MSG_ETAG
3232 insint(d, "MSG_ETAG", MSG_ETAG);
3233#endif
3234
3235 /* Protocol level and numbers, usable for [gs]etsockopt */
3236#ifdef SOL_SOCKET
3237 insint(d, "SOL_SOCKET", SOL_SOCKET);
3238#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003239#ifdef SOL_IP
3240 insint(d, "SOL_IP", SOL_IP);
3241#else
3242 insint(d, "SOL_IP", 0);
3243#endif
3244#ifdef SOL_IPX
3245 insint(d, "SOL_IPX", SOL_IPX);
3246#endif
3247#ifdef SOL_AX25
3248 insint(d, "SOL_AX25", SOL_AX25);
3249#endif
3250#ifdef SOL_ATALK
3251 insint(d, "SOL_ATALK", SOL_ATALK);
3252#endif
3253#ifdef SOL_NETROM
3254 insint(d, "SOL_NETROM", SOL_NETROM);
3255#endif
3256#ifdef SOL_ROSE
3257 insint(d, "SOL_ROSE", SOL_ROSE);
3258#endif
3259#ifdef SOL_TCP
3260 insint(d, "SOL_TCP", SOL_TCP);
3261#else
3262 insint(d, "SOL_TCP", 6);
3263#endif
3264#ifdef SOL_UDP
3265 insint(d, "SOL_UDP", SOL_UDP);
3266#else
3267 insint(d, "SOL_UDP", 17);
3268#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003269#ifdef IPPROTO_IP
3270 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003271#else
3272 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003273#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003274#ifdef IPPROTO_HOPOPTS
3275 insint(d, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
3276#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003277#ifdef IPPROTO_ICMP
3278 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003279#else
3280 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003281#endif
3282#ifdef IPPROTO_IGMP
3283 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
3284#endif
3285#ifdef IPPROTO_GGP
3286 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
3287#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003288#ifdef IPPROTO_IPV4
3289 insint(d, "IPPROTO_IPV4", IPPROTO_IPV4);
3290#endif
3291#ifdef IPPROTO_IPIP
3292 insint(d, "IPPROTO_IPIP", IPPROTO_IPIP);
3293#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003294#ifdef IPPROTO_TCP
3295 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003296#else
3297 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003298#endif
3299#ifdef IPPROTO_EGP
3300 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
3301#endif
3302#ifdef IPPROTO_PUP
3303 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
3304#endif
3305#ifdef IPPROTO_UDP
3306 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003307#else
3308 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003309#endif
3310#ifdef IPPROTO_IDP
3311 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
3312#endif
3313#ifdef IPPROTO_HELLO
3314 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
3315#endif
3316#ifdef IPPROTO_ND
3317 insint(d, "IPPROTO_ND", IPPROTO_ND);
3318#endif
3319#ifdef IPPROTO_TP
3320 insint(d, "IPPROTO_TP", IPPROTO_TP);
3321#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003322#ifdef IPPROTO_IPV6
3323 insint(d, "IPPROTO_IPV6", IPPROTO_IPV6);
3324#endif
3325#ifdef IPPROTO_ROUTING
3326 insint(d, "IPPROTO_ROUTING", IPPROTO_ROUTING);
3327#endif
3328#ifdef IPPROTO_FRAGMENT
3329 insint(d, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
3330#endif
3331#ifdef IPPROTO_RSVP
3332 insint(d, "IPPROTO_RSVP", IPPROTO_RSVP);
3333#endif
3334#ifdef IPPROTO_GRE
3335 insint(d, "IPPROTO_GRE", IPPROTO_GRE);
3336#endif
3337#ifdef IPPROTO_ESP
3338 insint(d, "IPPROTO_ESP", IPPROTO_ESP);
3339#endif
3340#ifdef IPPROTO_AH
3341 insint(d, "IPPROTO_AH", IPPROTO_AH);
3342#endif
3343#ifdef IPPROTO_MOBILE
3344 insint(d, "IPPROTO_MOBILE", IPPROTO_MOBILE);
3345#endif
3346#ifdef IPPROTO_ICMPV6
3347 insint(d, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
3348#endif
3349#ifdef IPPROTO_NONE
3350 insint(d, "IPPROTO_NONE", IPPROTO_NONE);
3351#endif
3352#ifdef IPPROTO_DSTOPTS
3353 insint(d, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
3354#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003355#ifdef IPPROTO_XTP
3356 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
3357#endif
3358#ifdef IPPROTO_EON
3359 insint(d, "IPPROTO_EON", IPPROTO_EON);
3360#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003361#ifdef IPPROTO_PIM
3362 insint(d, "IPPROTO_PIM", IPPROTO_PIM);
3363#endif
3364#ifdef IPPROTO_IPCOMP
3365 insint(d, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
3366#endif
3367#ifdef IPPROTO_VRRP
3368 insint(d, "IPPROTO_VRRP", IPPROTO_VRRP);
3369#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003370#ifdef IPPROTO_BIP
3371 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
3372#endif
3373/**/
3374#ifdef IPPROTO_RAW
3375 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003376#else
3377 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003378#endif
3379#ifdef IPPROTO_MAX
3380 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
3381#endif
3382
3383 /* Some port configuration */
3384#ifdef IPPORT_RESERVED
3385 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
3386#else
3387 insint(d, "IPPORT_RESERVED", 1024);
3388#endif
3389#ifdef IPPORT_USERRESERVED
3390 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
3391#else
3392 insint(d, "IPPORT_USERRESERVED", 5000);
3393#endif
3394
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003395 /* Some reserved IP v.4 addresses */
3396#ifdef INADDR_ANY
3397 insint(d, "INADDR_ANY", INADDR_ANY);
3398#else
3399 insint(d, "INADDR_ANY", 0x00000000);
3400#endif
3401#ifdef INADDR_BROADCAST
3402 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
3403#else
3404 insint(d, "INADDR_BROADCAST", 0xffffffff);
3405#endif
3406#ifdef INADDR_LOOPBACK
3407 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
3408#else
3409 insint(d, "INADDR_LOOPBACK", 0x7F000001);
3410#endif
3411#ifdef INADDR_UNSPEC_GROUP
3412 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
3413#else
3414 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
3415#endif
3416#ifdef INADDR_ALLHOSTS_GROUP
3417 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
3418#else
3419 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
3420#endif
3421#ifdef INADDR_MAX_LOCAL_GROUP
3422 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
3423#else
3424 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
3425#endif
3426#ifdef INADDR_NONE
3427 insint(d, "INADDR_NONE", INADDR_NONE);
3428#else
3429 insint(d, "INADDR_NONE", 0xffffffff);
3430#endif
3431
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003432 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003433#ifdef IP_OPTIONS
3434 insint(d, "IP_OPTIONS", IP_OPTIONS);
3435#endif
3436#ifdef IP_HDRINCL
3437 insint(d, "IP_HDRINCL", IP_HDRINCL);
3438#endif
3439#ifdef IP_TOS
3440 insint(d, "IP_TOS", IP_TOS);
3441#endif
3442#ifdef IP_TTL
3443 insint(d, "IP_TTL", IP_TTL);
3444#endif
3445#ifdef IP_RECVOPTS
3446 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
3447#endif
3448#ifdef IP_RECVRETOPTS
3449 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
3450#endif
3451#ifdef IP_RECVDSTADDR
3452 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
3453#endif
3454#ifdef IP_RETOPTS
3455 insint(d, "IP_RETOPTS", IP_RETOPTS);
3456#endif
3457#ifdef IP_MULTICAST_IF
3458 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
3459#endif
3460#ifdef IP_MULTICAST_TTL
3461 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
3462#endif
3463#ifdef IP_MULTICAST_LOOP
3464 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
3465#endif
3466#ifdef IP_ADD_MEMBERSHIP
3467 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
3468#endif
3469#ifdef IP_DROP_MEMBERSHIP
3470 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
3471#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003472#ifdef IP_DEFAULT_MULTICAST_TTL
3473 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
3474#endif
3475#ifdef IP_DEFAULT_MULTICAST_LOOP
3476 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
3477#endif
3478#ifdef IP_MAX_MEMBERSHIPS
3479 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
3480#endif
3481
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003482 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3483#ifdef IPV6_JOIN_GROUP
3484 insint(d, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
3485#endif
3486#ifdef IPV6_LEAVE_GROUP
3487 insint(d, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
3488#endif
3489#ifdef IPV6_MULTICAST_HOPS
3490 insint(d, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
3491#endif
3492#ifdef IPV6_MULTICAST_IF
3493 insint(d, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
3494#endif
3495#ifdef IPV6_MULTICAST_LOOP
3496 insint(d, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
3497#endif
3498#ifdef IPV6_UNICAST_HOPS
3499 insint(d, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
3500#endif
3501
Guido van Rossum09be4091999-08-09 14:40:40 +00003502 /* TCP options */
3503#ifdef TCP_NODELAY
3504 insint(d, "TCP_NODELAY", TCP_NODELAY);
3505#endif
3506#ifdef TCP_MAXSEG
3507 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
3508#endif
3509
3510 /* IPX options */
3511#ifdef IPX_TYPE
3512 insint(d, "IPX_TYPE", IPX_TYPE);
3513#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003514
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003515 /* get{addr,name}info parameters */
3516#ifdef EAI_ADDRFAMILY
3517 insint(d, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
3518#endif
3519#ifdef EAI_AGAIN
3520 insint(d, "EAI_AGAIN", EAI_AGAIN);
3521#endif
3522#ifdef EAI_BADFLAGS
3523 insint(d, "EAI_BADFLAGS", EAI_BADFLAGS);
3524#endif
3525#ifdef EAI_FAIL
3526 insint(d, "EAI_FAIL", EAI_FAIL);
3527#endif
3528#ifdef EAI_FAMILY
3529 insint(d, "EAI_FAMILY", EAI_FAMILY);
3530#endif
3531#ifdef EAI_MEMORY
3532 insint(d, "EAI_MEMORY", EAI_MEMORY);
3533#endif
3534#ifdef EAI_NODATA
3535 insint(d, "EAI_NODATA", EAI_NODATA);
3536#endif
3537#ifdef EAI_NONAME
3538 insint(d, "EAI_NONAME", EAI_NONAME);
3539#endif
3540#ifdef EAI_SERVICE
3541 insint(d, "EAI_SERVICE", EAI_SERVICE);
3542#endif
3543#ifdef EAI_SOCKTYPE
3544 insint(d, "EAI_SOCKTYPE", EAI_SOCKTYPE);
3545#endif
3546#ifdef EAI_SYSTEM
3547 insint(d, "EAI_SYSTEM", EAI_SYSTEM);
3548#endif
3549#ifdef EAI_BADHINTS
3550 insint(d, "EAI_BADHINTS", EAI_BADHINTS);
3551#endif
3552#ifdef EAI_PROTOCOL
3553 insint(d, "EAI_PROTOCOL", EAI_PROTOCOL);
3554#endif
3555#ifdef EAI_MAX
3556 insint(d, "EAI_MAX", EAI_MAX);
3557#endif
3558#ifdef AI_PASSIVE
3559 insint(d, "AI_PASSIVE", AI_PASSIVE);
3560#endif
3561#ifdef AI_CANONNAME
3562 insint(d, "AI_CANONNAME", AI_CANONNAME);
3563#endif
3564#ifdef AI_NUMERICHOST
3565 insint(d, "AI_NUMERICHOST", AI_NUMERICHOST);
3566#endif
3567#ifdef AI_MASK
3568 insint(d, "AI_MASK", AI_MASK);
3569#endif
3570#ifdef AI_ALL
3571 insint(d, "AI_ALL", AI_ALL);
3572#endif
3573#ifdef AI_V4MAPPED_CFG
3574 insint(d, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
3575#endif
3576#ifdef AI_ADDRCONFIG
3577 insint(d, "AI_ADDRCONFIG", AI_ADDRCONFIG);
3578#endif
3579#ifdef AI_V4MAPPED
3580 insint(d, "AI_V4MAPPED", AI_V4MAPPED);
3581#endif
3582#ifdef AI_DEFAULT
3583 insint(d, "AI_DEFAULT", AI_DEFAULT);
3584#endif
3585#ifdef NI_MAXHOST
3586 insint(d, "NI_MAXHOST", NI_MAXHOST);
3587#endif
3588#ifdef NI_MAXSERV
3589 insint(d, "NI_MAXSERV", NI_MAXSERV);
3590#endif
3591#ifdef NI_NOFQDN
3592 insint(d, "NI_NOFQDN", NI_NOFQDN);
3593#endif
3594#ifdef NI_NUMERICHOST
3595 insint(d, "NI_NUMERICHOST", NI_NUMERICHOST);
3596#endif
3597#ifdef NI_NAMEREQD
3598 insint(d, "NI_NAMEREQD", NI_NAMEREQD);
3599#endif
3600#ifdef NI_NUMERICSERV
3601 insint(d, "NI_NUMERICSERV", NI_NUMERICSERV);
3602#endif
3603#ifdef NI_DGRAM
3604 insint(d, "NI_DGRAM", NI_DGRAM);
3605#endif
3606
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003607 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003608#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003609 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003610#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003611}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003612
3613/* Simplistic emulation code for inet_pton that only works for IPv4 */
3614#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003615int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003616inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003617{
3618 if(af == AF_INET){
3619 long packed_addr;
3620#ifdef USE_GUSI1
3621 packed_addr = (long)inet_addr(src).s_addr;
3622#else
3623 packed_addr = inet_addr(src);
3624#endif
3625 if (packed_addr == INADDR_NONE)
3626 return 0;
3627 memcpy(dst, &packed_addr, 4);
3628 return 1;
3629 }
3630 /* Should set errno to EAFNOSUPPORT */
3631 return -1;
3632}
3633
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003634const char *
3635inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003636{
3637 if (af == AF_INET) {
3638 struct in_addr packed_addr;
3639 if (size < 16)
3640 /* Should set errno to ENOSPC. */
3641 return NULL;
3642 memcpy(&packed_addr, src, sizeof(packed_addr));
3643 return strncpy(dst, inet_ntoa(packed_addr), size);
3644 }
3645 /* Should set errno to EAFNOSUPPORT */
3646 return NULL;
3647}
3648#endif