blob: 2ca99c96b129eadb747a0a28a39a3ed37fbf42d8 [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
97#elif defined(__sun__) || defined(__sgi)
98#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"
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000214#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000215
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000216#ifndef HAVE_INET_PTON
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000217int inet_pton (int af, const char *src, void *dst);
218const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000219#endif
220
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000221#ifdef __APPLE__
222/* On OS X, getaddrinfo returns no error indication of lookup
223 failure, so we must use the emulation instead of the libinfo
224 implementation. Unfortunately, performing an autoconf test
225 for this bug would require DNS access for the machine performing
226 the configuration, which is not acceptable. Therefore, we
227 determine the bug just by checking for __APPLE__. If this bug
228 gets ever fixed, perhaps checking for sys/version.h would be
229 appropriate, which is 10/0 on the system with the bug. */
230#undef HAVE_GETADDRINFO
231/* avoid clashes with the C library definition of the symbol. */
232#define getaddrinfo fake_getaddrinfo
233#endif
234
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000235/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000236#if !defined(HAVE_GETADDRINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000237#include "getaddrinfo.c"
238#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000239#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000240#include "getnameinfo.c"
241#endif
242
Guido van Rossumbcc20741998-08-04 22:53:56 +0000243#if defined(MS_WINDOWS) || defined(__BEOS__)
244/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000245/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000246#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000247#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000248#endif
249
Fred Drakea04eaad2000-06-30 02:46:07 +0000250/* abstract the socket file descriptor type */
251#ifdef MS_WINDOWS
252typedef SOCKET SOCKET_T;
253# ifdef MS_WIN64
254# define SIZEOF_SOCKET_T 8
255# else
256# define SIZEOF_SOCKET_T 4
257# endif
258#else
259typedef int SOCKET_T;
260# define SIZEOF_SOCKET_T SIZEOF_INT
261#endif
262
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000263#ifdef MS_WIN32
264# define EAFNOSUPPORT WSAEAFNOSUPPORT
265# define snprintf _snprintf
266#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000267
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000268#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000269#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000270#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000271#endif
272
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000273#ifndef SOCKETCLOSE
274#define SOCKETCLOSE close
275#endif
276
Guido van Rossum30a685f1991-06-27 15:51:29 +0000277/* Global variable holding the exception type for errors detected
278 by this module (but not argument type or memory errors, etc.). */
279
Guido van Rossum73624e91994-10-10 17:59:00 +0000280static PyObject *PySocket_Error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000281static PyObject *PyH_Error;
282static PyObject *PyGAI_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000283
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000284#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000285static PyObject *PySSLErrorObject;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000286#endif /* USE_SSL */
287
Guido van Rossum30a685f1991-06-27 15:51:29 +0000288
Guido van Rossum48a680c2001-03-02 06:34:14 +0000289#ifdef RISCOS
290/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
291static int taskwindow;
292#endif
293
294
Guido van Rossum30a685f1991-06-27 15:51:29 +0000295/* Convenience function to raise an error according to errno
296 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000297
Guido van Rossum73624e91994-10-10 17:59:00 +0000298static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000299PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000300{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000301#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000302 int err_no = WSAGetLastError();
303 if (err_no) {
304 static struct { int no; const char *msg; } *msgp, msgs[] = {
305 { WSAEINTR, "Interrupted system call" },
306 { WSAEBADF, "Bad file descriptor" },
307 { WSAEACCES, "Permission denied" },
308 { WSAEFAULT, "Bad address" },
309 { WSAEINVAL, "Invalid argument" },
310 { WSAEMFILE, "Too many open files" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000311 { WSAEWOULDBLOCK,
Mark Hammond46a733d2000-07-24 01:45:11 +0000312 "The socket operation could not complete "
313 "without blocking" },
314 { WSAEINPROGRESS, "Operation now in progress" },
315 { WSAEALREADY, "Operation already in progress" },
316 { WSAENOTSOCK, "Socket operation on non-socket" },
317 { WSAEDESTADDRREQ, "Destination address required" },
318 { WSAEMSGSIZE, "Message too long" },
319 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
320 { WSAENOPROTOOPT, "Protocol not available" },
321 { WSAEPROTONOSUPPORT, "Protocol not supported" },
322 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
323 { WSAEOPNOTSUPP, "Operation not supported" },
324 { WSAEPFNOSUPPORT, "Protocol family not supported" },
325 { WSAEAFNOSUPPORT, "Address family not supported" },
326 { WSAEADDRINUSE, "Address already in use" },
327 { WSAEADDRNOTAVAIL,
328 "Can't assign requested address" },
329 { WSAENETDOWN, "Network is down" },
330 { WSAENETUNREACH, "Network is unreachable" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000331 { WSAENETRESET,
Mark Hammond46a733d2000-07-24 01:45:11 +0000332 "Network dropped connection on reset" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000333 { WSAECONNABORTED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000334 "Software caused connection abort" },
335 { WSAECONNRESET, "Connection reset by peer" },
336 { WSAENOBUFS, "No buffer space available" },
337 { WSAEISCONN, "Socket is already connected" },
338 { WSAENOTCONN, "Socket is not connected" },
339 { WSAESHUTDOWN, "Can't send after socket shutdown" },
340 { WSAETOOMANYREFS,
341 "Too many references: can't splice" },
342 { WSAETIMEDOUT, "Operation timed out" },
343 { WSAECONNREFUSED, "Connection refused" },
344 { WSAELOOP, "Too many levels of symbolic links" },
345 { WSAENAMETOOLONG, "File name too long" },
346 { WSAEHOSTDOWN, "Host is down" },
347 { WSAEHOSTUNREACH, "No route to host" },
348 { WSAENOTEMPTY, "Directory not empty" },
349 { WSAEPROCLIM, "Too many processes" },
350 { WSAEUSERS, "Too many users" },
351 { WSAEDQUOT, "Disc quota exceeded" },
352 { WSAESTALE, "Stale NFS file handle" },
353 { WSAEREMOTE, "Too many levels of remote in path" },
354 { WSASYSNOTREADY,
355 "Network subsystem is unvailable" },
356 { WSAVERNOTSUPPORTED,
357 "WinSock version is not supported" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000358 { WSANOTINITIALISED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000359 "Successful WSAStartup() not yet performed" },
360 { WSAEDISCON, "Graceful shutdown in progress" },
361 /* Resolver errors */
362 { WSAHOST_NOT_FOUND, "No such host is known" },
363 { WSATRY_AGAIN, "Host not found, or server failed" },
364 { WSANO_RECOVERY,
365 "Unexpected server error encountered" },
366 { WSANO_DATA, "Valid name without requested data" },
367 { WSANO_ADDRESS, "No address, look for MX record" },
368 { 0, NULL }
369 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000370 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000371 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000372
Mark Hammond46a733d2000-07-24 01:45:11 +0000373 for (msgp = msgs; msgp->msg; msgp++) {
374 if (err_no == msgp->no) {
375 msg = msgp->msg;
376 break;
377 }
378 }
379
380 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000381 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000382 PyErr_SetObject(PySocket_Error, v);
383 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000384 }
385 return NULL;
386 }
387 else
388#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000389
390#if defined(PYOS_OS2)
391 if (sock_errno() != NO_ERROR) {
392 APIRET rc;
393 ULONG msglen;
394 char outbuf[100];
395 int myerrorcode = sock_errno();
396
397 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
398 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
399 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
400 if (rc == NO_ERROR) {
401 PyObject *v;
402
403 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
404 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
405 char *lastc = &outbuf[ strlen(outbuf)-1 ];
406 while (lastc > outbuf && isspace(*lastc))
407 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
408 }
409 v = Py_BuildValue("(is)", myerrorcode, outbuf);
410 if (v != NULL) {
411 PyErr_SetObject(PySocket_Error, v);
412 Py_DECREF(v);
413 }
414 return NULL;
415 }
416 }
417#endif
418
Guido van Rossum73624e91994-10-10 17:59:00 +0000419 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000420}
421
Guido van Rossum30a685f1991-06-27 15:51:29 +0000422
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000423static PyObject *
424PyH_Err(int h_error)
425{
426 PyObject *v;
427
428#ifdef HAVE_HSTRERROR
429 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
430#else
431 v = Py_BuildValue("(is)", h_error, "host not found");
432#endif
433 if (v != NULL) {
Martin v. Löwis864e9ff2001-08-04 22:32:03 +0000434 PyErr_SetObject(PyH_Error, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000435 Py_DECREF(v);
436 }
437
438 return NULL;
439}
440
441
442static PyObject *
443PyGAI_Err(int error)
444{
445 PyObject *v;
446
447 if (error == EAI_SYSTEM)
448 return PySocket_Err();
449
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000450#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000451 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000452#else
453 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
454#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000455 if (v != NULL) {
456 PyErr_SetObject(PyGAI_Error, v);
457 Py_DECREF(v);
458 }
459
460 return NULL;
461}
462
463
Guido van Rossum30a685f1991-06-27 15:51:29 +0000464/* The object holding a socket. It holds some extra information,
465 like the address family, which is used to decode socket address
466 arguments properly. */
467
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000468typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000469 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000470 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000471 int sock_family; /* Address family, e.g., AF_INET */
472 int sock_type; /* Socket type, e.g., SOCK_STREAM */
473 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000474 union sock_addr {
475 struct sockaddr_in in;
476#ifdef AF_UNIX
477 struct sockaddr_un un;
478#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000479#ifdef INET6
480 struct sockaddr_in6 in6;
481 struct sockaddr_storage storage;
482#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000483#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000484 struct sockaddr_ll ll;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000485#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000486 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000487} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000488
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000489#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000490
Jeremy Hyltonba699362001-10-11 17:23:34 +0000491#define X509_NAME_MAXLEN 256
492
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000493typedef struct {
494 PyObject_HEAD
495 PySocketSockObject *Socket; /* Socket on which we're layered */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000496 SSL_CTX* ctx;
497 SSL* ssl;
498 X509* server_cert;
499 BIO* sbio;
Jeremy Hyltonba699362001-10-11 17:23:34 +0000500 char server[X509_NAME_MAXLEN];
501 char issuer[X509_NAME_MAXLEN];
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000502
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000503} PySSLObject;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000504
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000505staticforward PyTypeObject PySSL_Type;
506staticforward PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args);
507staticforward PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000508
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000509#define PySSLObject_Check(v) ((v)->ob_type == &PySSL_Type)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000510
511#endif /* USE_SSL */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000512
Guido van Rossum30a685f1991-06-27 15:51:29 +0000513/* A forward reference to the Socktype type object.
514 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000515 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000516 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000517
Guido van Rossum73624e91994-10-10 17:59:00 +0000518staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000519
Guido van Rossum30a685f1991-06-27 15:51:29 +0000520
521/* Create a new socket object.
522 This just creates the object and initializes it.
523 If the creation fails, return NULL and set an exception (implicit
524 in NEWOBJ()). */
525
Guido van Rossum73624e91994-10-10 17:59:00 +0000526static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000527PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000528{
Guido van Rossum48a680c2001-03-02 06:34:14 +0000529#ifdef RISCOS
530 int block = 1;
531#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000532 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000533 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000534 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000535 if (s != NULL) {
536 s->sock_fd = fd;
537 s->sock_family = family;
538 s->sock_type = type;
539 s->sock_proto = proto;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000540#ifdef RISCOS
541 if(taskwindow) {
542 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
543 }
544#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000545 }
546 return s;
547}
548
Guido van Rossum30a685f1991-06-27 15:51:29 +0000549
Guido van Rossum48a680c2001-03-02 06:34:14 +0000550/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000551 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000552#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000553PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000554#endif
555
556
Guido van Rossum30a685f1991-06-27 15:51:29 +0000557/* Convert a string specifying a host name or one of a few symbolic
558 names to a numeric IP address. This usually calls gethostbyname()
559 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000560 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000561 an error occurred; then an exception is raised. */
562
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000563static int
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000564setipaddr(char* name, struct sockaddr * addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000565{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000566 struct addrinfo hints, *res;
567 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000568
Guido van Rossuma376cc51996-12-05 23:43:35 +0000569 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000570 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000571 int siz;
572 memset(&hints, 0, sizeof(hints));
573 hints.ai_family = af;
574 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
575 hints.ai_flags = AI_PASSIVE;
576 error = getaddrinfo(NULL, "0", &hints, &res);
577 if (error) {
578 PyGAI_Err(error);
579 return -1;
580 }
581 switch (res->ai_family) {
582 case AF_INET:
583 siz = 4;
584 break;
585#ifdef INET6
586 case AF_INET6:
587 siz = 16;
588 break;
589#endif
590 default:
591 freeaddrinfo(res);
592 PyErr_SetString(PySocket_Error,
593 "unsupported address family");
594 return -1;
595 }
596 if (res->ai_next) {
597 PyErr_SetString(PySocket_Error,
598 "wildcard resolved to multiple address");
599 return -1;
600 }
601 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
602 freeaddrinfo(res);
603 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000604 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000605 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000606 struct sockaddr_in *sin;
607 if (af != PF_INET && af != PF_UNSPEC) {
608 PyErr_SetString(PySocket_Error,
609 "address family mismatched");
610 return -1;
611 }
612 sin = (struct sockaddr_in *)addr_ret;
613 memset((void *) sin, '\0', sizeof(*sin));
614 sin->sin_family = AF_INET;
615#ifdef HAVE_SOCKADDR_SA_LEN
616 sin->sin_len = sizeof(*sin);
617#endif
618 sin->sin_addr.s_addr = INADDR_BROADCAST;
619 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000620 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000621 memset(&hints, 0, sizeof(hints));
622 hints.ai_family = af;
623 error = getaddrinfo(name, NULL, &hints, &res);
624 if (error) {
625 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000626 return -1;
627 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000628 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
629 freeaddrinfo(res);
630 switch (addr_ret->sa_family) {
631 case AF_INET:
632 return 4;
633#ifdef INET6
634 case AF_INET6:
635 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000636#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000637 default:
638 PyErr_SetString(PySocket_Error, "unknown address family");
639 return -1;
640 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000641}
642
Guido van Rossum30a685f1991-06-27 15:51:29 +0000643
Guido van Rossum30a685f1991-06-27 15:51:29 +0000644/* Create a string object representing an IP address.
645 This is always a string of the form 'dd.dd.dd.dd' (with variable
646 size numbers). */
647
Guido van Rossum73624e91994-10-10 17:59:00 +0000648static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000649makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000650{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000651 char buf[NI_MAXHOST];
652 int error;
653
654 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
655 NI_NUMERICHOST);
656 if (error) {
657 PyGAI_Err(error);
658 return NULL;
659 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000660 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000661}
662
663
664/* Create an object representing the given socket address,
665 suitable for passing it back to bind(), connect() etc.
666 The family field of the sockaddr structure is inspected
667 to determine what kind of address it really is. */
668
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000669/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000670static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000671makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000672{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000673 if (addrlen == 0) {
674 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000675 Py_INCREF(Py_None);
676 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000677 }
678
Guido van Rossumbcc20741998-08-04 22:53:56 +0000679#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000680 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000681 addr->sa_family = AF_INET;
682#endif
683
Guido van Rossum30a685f1991-06-27 15:51:29 +0000684 switch (addr->sa_family) {
685
686 case AF_INET:
687 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000688 struct sockaddr_in *a;
689 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000690 PyObject *ret = NULL;
691 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000692 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000693 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
694 Py_DECREF(addrobj);
695 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000696 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000697 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000698
Guido van Rossumb6775db1994-08-01 11:34:53 +0000699#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000700 case AF_UNIX:
701 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000702 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000703 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000704 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000705#endif /* AF_UNIX */
706
707#ifdef INET6
708 case AF_INET6:
709 {
710 struct sockaddr_in6 *a;
711 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
712 PyObject *ret = NULL;
713 if (addrobj) {
714 a = (struct sockaddr_in6 *)addr;
715 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
716 a->sin6_flowinfo, a->sin6_scope_id);
717 Py_DECREF(addrobj);
718 }
719 return ret;
720 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000721#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000722
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000723#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000724 case AF_PACKET:
725 {
726 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
727 char *ifname = "";
728 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000729 /* need to look up interface name give index */
730 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000731 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000732 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000733 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000734 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000735 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000736 a->sll_pkttype, a->sll_hatype,
737 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000738 }
739#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000740
Guido van Rossum30a685f1991-06-27 15:51:29 +0000741 /* More cases here... */
742
743 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000744 /* If we don't know the address family, don't raise an
745 exception -- return it as a tuple. */
746 return Py_BuildValue("is#",
747 addr->sa_family,
748 addr->sa_data,
749 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000750
Guido van Rossum30a685f1991-06-27 15:51:29 +0000751 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000752}
753
Guido van Rossum30a685f1991-06-27 15:51:29 +0000754
755/* Parse a socket address argument according to the socket object's
756 address family. Return 1 if the address was in the proper format,
757 0 of not. The address is returned through addr_ret, its length
758 through len_ret. */
759
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000760static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000761getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000762 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000763{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000764 switch (s->sock_family) {
765
Guido van Rossumb6775db1994-08-01 11:34:53 +0000766#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000767 case AF_UNIX:
768 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000769 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000770 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000771 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000772 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000773 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000774 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000775 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000776 PyErr_SetString(PySocket_Error,
777 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000778 return 0;
779 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000780 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000781 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000782 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000783 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000784 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000785 return 1;
786 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000787#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000788
Guido van Rossum30a685f1991-06-27 15:51:29 +0000789 case AF_INET:
790 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000791 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000792 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000793 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000794 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000795 if (!PyTuple_Check(args)) {
796 PyErr_Format(PyExc_TypeError,
797 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
798 args->ob_type->tp_name);
799 return 0;
800 }
801 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000802 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000803 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000804 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000805 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000806 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000807 *addr_ret = (struct sockaddr *) addr;
808 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000809 return 1;
810 }
811
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000812#ifdef INET6
813 case AF_INET6:
814 {
815 struct sockaddr_in6* addr;
816 char *host;
817 int port, flowinfo, scope_id;
818 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
819 flowinfo = scope_id = 0;
820 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
821 &scope_id)) {
822 return 0;
823 }
824 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
825 return 0;
826 addr->sin6_family = s->sock_family;
827 addr->sin6_port = htons((short)port);
828 addr->sin6_flowinfo = flowinfo;
829 addr->sin6_scope_id = scope_id;
830 *addr_ret = (struct sockaddr *) addr;
831 *len_ret = sizeof *addr;
832 return 1;
833 }
834#endif
835
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000836#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000837 case AF_PACKET:
838 {
839 struct sockaddr_ll* addr;
840 struct ifreq ifr;
841 char *interfaceName;
842 int protoNumber;
843 int hatype = 0;
844 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000845 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000846
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000847 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
848 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000849 return 0;
850 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
851 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000852 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +0000853 PySocket_Err();
Jeremy Hylton22308652001-02-02 03:23:09 +0000854 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000855 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000856 addr = &(s->sock_addr.ll);
857 addr->sll_family = AF_PACKET;
858 addr->sll_protocol = htons((short)protoNumber);
859 addr->sll_ifindex = ifr.ifr_ifindex;
860 addr->sll_pkttype = pkttype;
861 addr->sll_hatype = hatype;
862 *addr_ret = (struct sockaddr *) addr;
863 *len_ret = sizeof *addr;
864 return 1;
865 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000866#endif
867
Guido van Rossum30a685f1991-06-27 15:51:29 +0000868 /* More cases here... */
869
870 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000871 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000872 return 0;
873
874 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000875}
876
Guido van Rossum30a685f1991-06-27 15:51:29 +0000877
Guido van Rossum48a680c2001-03-02 06:34:14 +0000878/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000879 Return 1 if the family is known, 0 otherwise. The length is returned
880 through len_ret. */
881
882static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000883getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000884{
885 switch (s->sock_family) {
886
Guido van Rossumb6775db1994-08-01 11:34:53 +0000887#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000888 case AF_UNIX:
889 {
890 *len_ret = sizeof (struct sockaddr_un);
891 return 1;
892 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000893#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000894
895 case AF_INET:
896 {
897 *len_ret = sizeof (struct sockaddr_in);
898 return 1;
899 }
900
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000901#ifdef INET6
902 case AF_INET6:
903 {
904 *len_ret = sizeof (struct sockaddr_in6);
905 return 1;
906 }
907#endif
908
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000909#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000910 case AF_PACKET:
911 {
912 *len_ret = sizeof (struct sockaddr_ll);
913 return 1;
914 }
915#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000916
Guido van Rossum710e1df1992-06-12 10:39:36 +0000917 /* More cases here... */
918
919 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000920 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000921 return 0;
922
923 }
924}
925
926
Guido van Rossum30a685f1991-06-27 15:51:29 +0000927/* s.accept() method */
928
Guido van Rossum73624e91994-10-10 17:59:00 +0000929static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000930PySocketSock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000931{
932 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000933 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000934 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000935 PyObject *sock = NULL;
936 PyObject *addr = NULL;
937 PyObject *res = NULL;
938
Guido van Rossum710e1df1992-06-12 10:39:36 +0000939 if (!getsockaddrlen(s, &addrlen))
940 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000941 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000942 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000943 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000944 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000945#ifdef MS_WINDOWS
946 if (newfd == INVALID_SOCKET)
947#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000948 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000949#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000950 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000951
Guido van Rossum30a685f1991-06-27 15:51:29 +0000952 /* Create the new object with unspecified family,
953 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000954 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000955 s->sock_family,
956 s->sock_type,
957 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000958 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000959 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000960 goto finally;
961 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000962 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000963 addrlen);
964 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000965 goto finally;
966
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000967 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000968
969 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000970 Py_XDECREF(sock);
971 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000972 return res;
973}
974
Guido van Rossum82a5c661998-07-07 20:45:43 +0000975static char accept_doc[] =
976"accept() -> (socket object, address info)\n\
977\n\
978Wait for an incoming connection. Return a new socket representing the\n\
979connection, and the address of the client. For IP sockets, the address\n\
980info is a pair (hostaddr, port).";
981
Guido van Rossum30a685f1991-06-27 15:51:29 +0000982
Guido van Rossume4485b01994-09-07 14:32:49 +0000983/* s.setblocking(1 | 0) method */
984
Guido van Rossum73624e91994-10-10 17:59:00 +0000985static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000986PySocketSock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +0000987{
988 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000989#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000990#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000991 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000992#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000993#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000994 block = PyInt_AsLong(arg);
995 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +0000996 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000997 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000998#ifdef __BEOS__
999 block = !block;
1000 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
1001 (void *)(&block), sizeof( int ) );
1002#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001003#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001004#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001005#ifdef PYOS_OS2
1006 block = !block;
1007 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
1008#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +00001009 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
1010 if (block)
1011 delay_flag &= (~O_NDELAY);
1012 else
1013 delay_flag |= O_NDELAY;
1014 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001015#endif /* !PYOS_OS2 */
1016#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001017 block = !block;
1018 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001019#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +00001020#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001021#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001022 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +00001023
Guido van Rossum73624e91994-10-10 17:59:00 +00001024 Py_INCREF(Py_None);
1025 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001026}
Guido van Rossume4485b01994-09-07 14:32:49 +00001027
Guido van Rossum82a5c661998-07-07 20:45:43 +00001028static char setblocking_doc[] =
1029"setblocking(flag)\n\
1030\n\
1031Set the socket to blocking (flag is true) or non-blocking (false).\n\
1032This uses the FIONBIO ioctl with the O_NDELAY flag.";
1033
Guido van Rossume4485b01994-09-07 14:32:49 +00001034
Guido van Rossum48a680c2001-03-02 06:34:14 +00001035#ifdef RISCOS
1036/* s.sleeptaskw(1 | 0) method */
1037
1038static PyObject *
1039PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
1040{
1041 int block;
1042 int delay_flag;
1043 if (!PyArg_GetInt(args, &block))
1044 return NULL;
1045 Py_BEGIN_ALLOW_THREADS
1046 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1047 Py_END_ALLOW_THREADS
1048
1049 Py_INCREF(Py_None);
1050 return Py_None;
1051}
1052static char sleeptaskw_doc[] =
1053"sleeptaskw(flag)\n\
1054\n\
1055Allow sleeps in taskwindows.";
1056#endif
1057
1058
Guido van Rossumaee08791992-09-08 09:05:33 +00001059/* s.setsockopt() method.
1060 With an integer third argument, sets an integer option.
1061 With a string third argument, sets an option from a buffer;
1062 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001063
Guido van Rossum73624e91994-10-10 17:59:00 +00001064static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001065PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001066{
1067 int level;
1068 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001069 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001070 char *buf;
1071 int buflen;
1072 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001073
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001074 if (PyArg_ParseTuple(args, "iii:setsockopt",
1075 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001076 buf = (char *) &flag;
1077 buflen = sizeof flag;
1078 }
1079 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001080 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001081 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1082 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001083 return NULL;
1084 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001085 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001086 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001087 return PySocket_Err();
1088 Py_INCREF(Py_None);
1089 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001090}
1091
Guido van Rossum82a5c661998-07-07 20:45:43 +00001092static char setsockopt_doc[] =
1093"setsockopt(level, option, value)\n\
1094\n\
1095Set a socket option. See the Unix manual for level and option.\n\
1096The value argument can either be an integer or a string.";
1097
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001098
Guido van Rossumaee08791992-09-08 09:05:33 +00001099/* s.getsockopt() method.
1100 With two arguments, retrieves an integer option.
1101 With a third integer argument, retrieves a string buffer of that size;
1102 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001103
Guido van Rossum73624e91994-10-10 17:59:00 +00001104static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001105PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001106{
1107 int level;
1108 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001109 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001110 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001111 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001112
Guido van Rossumbcc20741998-08-04 22:53:56 +00001113#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001114 /* We have incomplete socket support. */
1115 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001116 return NULL;
1117#else
1118
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001119 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1120 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001121 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001122
Guido van Rossumbe32c891996-06-20 16:25:29 +00001123 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001124 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001125 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001126 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001127 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001128 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001129 return PySocket_Err();
1130 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001131 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001132 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001133 PyErr_SetString(PySocket_Error,
1134 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001135 return NULL;
1136 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001137 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001138 if (buf == NULL)
1139 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001140 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001141 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001142 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001143 Py_DECREF(buf);
1144 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +00001145 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001146 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001147 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001148#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001149}
1150
Guido van Rossum82a5c661998-07-07 20:45:43 +00001151static char getsockopt_doc[] =
1152"getsockopt(level, option[, buffersize]) -> value\n\
1153\n\
1154Get a socket option. See the Unix manual for level and option.\n\
1155If a nonzero buffersize argument is given, the return value is a\n\
1156string of that length; otherwise it is an integer.";
1157
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001158
Fred Drake728819a2000-07-01 03:40:12 +00001159/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001160
Guido van Rossum73624e91994-10-10 17:59:00 +00001161static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001162PySocketSock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001163{
1164 struct sockaddr *addr;
1165 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001166 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001167
Fred Drake728819a2000-07-01 03:40:12 +00001168 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001169 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001170 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001171 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001172 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001173 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001174 return PySocket_Err();
1175 Py_INCREF(Py_None);
1176 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001177}
1178
Guido van Rossum82a5c661998-07-07 20:45:43 +00001179static char bind_doc[] =
1180"bind(address)\n\
1181\n\
1182Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001183pair (host, port); the host must refer to the local host. For raw packet\n\
1184sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001185
Guido van Rossum30a685f1991-06-27 15:51:29 +00001186
1187/* s.close() method.
1188 Set the file descriptor to -1 so operations tried subsequently
1189 will surely fail. */
1190
Guido van Rossum73624e91994-10-10 17:59:00 +00001191static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001192PySocketSock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001193{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001194 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001195
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001196 if ((fd = s->sock_fd) != -1) {
1197 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001198 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001199 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001200 Py_END_ALLOW_THREADS
1201 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001202 Py_INCREF(Py_None);
1203 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001204}
1205
Guido van Rossum82a5c661998-07-07 20:45:43 +00001206static char close_doc[] =
1207"close()\n\
1208\n\
1209Close the socket. It cannot be used after this call.";
1210
Guido van Rossum30a685f1991-06-27 15:51:29 +00001211
Fred Drake728819a2000-07-01 03:40:12 +00001212/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001213
Guido van Rossum73624e91994-10-10 17:59:00 +00001214static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001215PySocketSock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001216{
1217 struct sockaddr *addr;
1218 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001219 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001220
Fred Drake728819a2000-07-01 03:40:12 +00001221 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001222 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001223 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001224 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001225 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001226 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001227 return PySocket_Err();
1228 Py_INCREF(Py_None);
1229 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001230}
1231
Guido van Rossum82a5c661998-07-07 20:45:43 +00001232static char connect_doc[] =
1233"connect(address)\n\
1234\n\
1235Connect the socket to a remote address. For IP sockets, the address\n\
1236is a pair (host, port).";
1237
Guido van Rossum30a685f1991-06-27 15:51:29 +00001238
Fred Drake728819a2000-07-01 03:40:12 +00001239/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001240
1241static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001242PySocketSock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001243{
1244 struct sockaddr *addr;
1245 int addrlen;
1246 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001247
Fred Drake728819a2000-07-01 03:40:12 +00001248 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001249 return NULL;
1250 Py_BEGIN_ALLOW_THREADS
1251 res = connect(s->sock_fd, addr, addrlen);
1252 Py_END_ALLOW_THREADS
1253 if (res != 0)
1254 res = errno;
1255 return PyInt_FromLong((long) res);
1256}
1257
Guido van Rossum82a5c661998-07-07 20:45:43 +00001258static char connect_ex_doc[] =
1259"connect_ex(address)\n\
1260\n\
1261This is like connect(address), but returns an error code (the errno value)\n\
1262instead of raising an exception when an error occurs.";
1263
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001264
Guido van Rossumed233a51992-06-23 09:07:03 +00001265/* s.fileno() method */
1266
Guido van Rossum73624e91994-10-10 17:59:00 +00001267static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001268PySocketSock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001269{
Fred Drakea04eaad2000-06-30 02:46:07 +00001270#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001271 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001272#else
1273 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1274#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001275}
1276
Guido van Rossum82a5c661998-07-07 20:45:43 +00001277static char fileno_doc[] =
1278"fileno() -> integer\n\
1279\n\
1280Return the integer file descriptor of the socket.";
1281
Guido van Rossumed233a51992-06-23 09:07:03 +00001282
Guido van Rossumbe32c891996-06-20 16:25:29 +00001283#ifndef NO_DUP
1284/* s.dup() method */
1285
1286static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001287PySocketSock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001288{
Fred Drakea04eaad2000-06-30 02:46:07 +00001289 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001290 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001291
Guido van Rossumbe32c891996-06-20 16:25:29 +00001292 newfd = dup(s->sock_fd);
1293 if (newfd < 0)
1294 return PySocket_Err();
1295 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001296 s->sock_family,
1297 s->sock_type,
1298 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001299 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001300 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001301 return sock;
1302}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001303
1304static char dup_doc[] =
1305"dup() -> socket object\n\
1306\n\
1307Return a new socket object connected to the same system resource.";
1308
Guido van Rossumbe32c891996-06-20 16:25:29 +00001309#endif
1310
1311
Guido van Rossumc89705d1992-11-26 08:54:07 +00001312/* s.getsockname() method */
1313
Guido van Rossum73624e91994-10-10 17:59:00 +00001314static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001315PySocketSock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001316{
1317 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001318 int res;
1319 socklen_t addrlen;
1320
Guido van Rossumc89705d1992-11-26 08:54:07 +00001321 if (!getsockaddrlen(s, &addrlen))
1322 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001323 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001324 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001325 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001326 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001327 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001328 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001329 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001330}
1331
Guido van Rossum82a5c661998-07-07 20:45:43 +00001332static char getsockname_doc[] =
1333"getsockname() -> address info\n\
1334\n\
1335Return the address of the local endpoint. For IP sockets, the address\n\
1336info is a pair (hostaddr, port).";
1337
Guido van Rossumc89705d1992-11-26 08:54:07 +00001338
Guido van Rossumb6775db1994-08-01 11:34:53 +00001339#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001340/* s.getpeername() method */
1341
Guido van Rossum73624e91994-10-10 17:59:00 +00001342static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001343PySocketSock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001344{
1345 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001346 int res;
1347 socklen_t addrlen;
1348
Guido van Rossumc89705d1992-11-26 08:54:07 +00001349 if (!getsockaddrlen(s, &addrlen))
1350 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001351 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001352 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001353 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001354 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001355 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001356 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001357 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001358}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001359
1360static char getpeername_doc[] =
1361"getpeername() -> address info\n\
1362\n\
1363Return the address of the remote endpoint. For IP sockets, the address\n\
1364info is a pair (hostaddr, port).";
1365
Guido van Rossumb6775db1994-08-01 11:34:53 +00001366#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001367
1368
Guido van Rossum30a685f1991-06-27 15:51:29 +00001369/* s.listen(n) method */
1370
Guido van Rossum73624e91994-10-10 17:59:00 +00001371static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001372PySocketSock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001373{
1374 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001375 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001376
1377 backlog = PyInt_AsLong(arg);
1378 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001379 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001380 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001381 if (backlog < 1)
1382 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001383 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001384 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001385 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001386 return PySocket_Err();
1387 Py_INCREF(Py_None);
1388 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001389}
1390
Guido van Rossum82a5c661998-07-07 20:45:43 +00001391static char listen_doc[] =
1392"listen(backlog)\n\
1393\n\
1394Enable a server to accept connections. The backlog argument must be at\n\
1395least 1; it specifies the number of unaccepted connection that the system\n\
1396will allow before refusing new connections.";
1397
1398
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001399#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001400/* s.makefile(mode) method.
1401 Create a new open file object referring to a dupped version of
1402 the socket's file descriptor. (The dup() call is necessary so
1403 that the open file and socket objects may be closed independent
1404 of each other.)
1405 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1406
Guido van Rossum73624e91994-10-10 17:59:00 +00001407static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001408PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001409{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001410 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001411 char *mode = "r";
1412 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001413#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001414 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001415#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001416 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001417#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001418 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001419 PyObject *f;
1420
Guido van Rossum43713e52000-02-29 13:59:29 +00001421 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001422 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001423#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001424 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1425 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001426#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001427 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001428#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001429 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001430 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001431 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001432 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001433 }
1434 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1435 if (f != NULL)
1436 PyFile_SetBufSize(f, bufsize);
1437 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001438}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001439
1440static char makefile_doc[] =
1441"makefile([mode[, buffersize]]) -> file object\n\
1442\n\
1443Return a regular file object corresponding to the socket.\n\
1444The mode and buffersize arguments are as for the built-in open() function.";
1445
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001446#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001447
Guido van Rossum48a680c2001-03-02 06:34:14 +00001448
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001449/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001450
Guido van Rossum73624e91994-10-10 17:59:00 +00001451static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001452PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001453{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001454 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001455 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001456 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001457 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001458 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001459 if (buf == NULL)
1460 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001461 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001462 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001463 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001464 if (n < 0) {
1465 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001466 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001467 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001468 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001469 return NULL;
1470 return buf;
1471}
1472
Guido van Rossum82a5c661998-07-07 20:45:43 +00001473static char recv_doc[] =
1474"recv(buffersize[, flags]) -> data\n\
1475\n\
1476Receive up to buffersize bytes from the socket. For the optional flags\n\
1477argument, see the Unix manual. When no data is available, block until\n\
1478at least one byte is available or until the remote end is closed. When\n\
1479the remote end is closed and all data is read, return the empty string.";
1480
Guido van Rossum30a685f1991-06-27 15:51:29 +00001481
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001482/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001483
Guido van Rossum73624e91994-10-10 17:59:00 +00001484static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001485PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001486{
1487 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001488 PyObject *buf = NULL;
1489 PyObject *addr = NULL;
1490 PyObject *ret = NULL;
1491
Guido van Rossumff3ab422000-04-24 15:16:03 +00001492 int len, n, flags = 0;
1493 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001494 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001495 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001496 if (!getsockaddrlen(s, &addrlen))
1497 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001498 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001499 if (buf == NULL)
1500 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001501 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001502 memset(addrbuf, 0, addrlen);
1503 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001504#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001505#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001506 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001507#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001508 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001509#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001510#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001511 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001512#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001513 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001514 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001515 if (n < 0) {
1516 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001517 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001518 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001519 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001520 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001521
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001522 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001523 goto finally;
1524
Guido van Rossum73624e91994-10-10 17:59:00 +00001525 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001526 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001527 Py_XDECREF(addr);
1528 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001529 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001530}
1531
Guido van Rossum82a5c661998-07-07 20:45:43 +00001532static char recvfrom_doc[] =
1533"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1534\n\
1535Like recv(buffersize, flags) but also return the sender's address info.";
1536
Guido van Rossum30a685f1991-06-27 15:51:29 +00001537
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001538/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001539
Guido van Rossum73624e91994-10-10 17:59:00 +00001540static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001541PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001542{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001543 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001544 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001545 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001546 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001547 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001548 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001549 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001550 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001551 return PySocket_Err();
1552 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001553}
1554
Guido van Rossum82a5c661998-07-07 20:45:43 +00001555static char send_doc[] =
1556"send(data[, flags])\n\
1557\n\
1558Send a data string to the socket. For the optional flags\n\
1559argument, see the Unix manual.";
1560
Guido van Rossum30a685f1991-06-27 15:51:29 +00001561
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001562/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001563
Guido van Rossum73624e91994-10-10 17:59:00 +00001564static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001565PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001566{
Guido van Rossum73624e91994-10-10 17:59:00 +00001567 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001568 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001569 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001570 int addrlen, len, n, flags;
1571 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001572 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001573 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001574 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1575 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001576 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001577 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001578 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001579 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001580 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001581 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001582 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001583 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001584 return PySocket_Err();
1585 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001586}
1587
Guido van Rossum82a5c661998-07-07 20:45:43 +00001588static char sendto_doc[] =
1589"sendto(data[, flags], address)\n\
1590\n\
1591Like send(data, flags) but allows specifying the destination address.\n\
1592For IP sockets, the address is a pair (hostaddr, port).";
1593
Guido van Rossum30a685f1991-06-27 15:51:29 +00001594
1595/* s.shutdown(how) method */
1596
Guido van Rossum73624e91994-10-10 17:59:00 +00001597static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001598PySocketSock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001599{
1600 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001601 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001602
1603 how = PyInt_AsLong(arg);
1604 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001605 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001606 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001607 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001608 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001609 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001610 return PySocket_Err();
1611 Py_INCREF(Py_None);
1612 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001613}
1614
Guido van Rossum82a5c661998-07-07 20:45:43 +00001615static char shutdown_doc[] =
1616"shutdown(flag)\n\
1617\n\
1618Shut down the reading side of the socket (flag == 0), the writing side\n\
1619of the socket (flag == 1), or both ends (flag == 2).";
1620
Guido van Rossum30a685f1991-06-27 15:51:29 +00001621
1622/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001623
Guido van Rossum73624e91994-10-10 17:59:00 +00001624static PyMethodDef PySocketSock_methods[] = {
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001625 {"accept", (PyNoArgsFunction)PySocketSock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001626 accept_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001627 {"bind", (PyCFunction)PySocketSock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001628 bind_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001629 {"close", (PyNoArgsFunction)PySocketSock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001630 close_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001631 {"connect", (PyCFunction)PySocketSock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001632 connect_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001633 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001634 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001635#ifndef NO_DUP
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001636 {"dup", (PyNoArgsFunction)PySocketSock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001637 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001638#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001639 {"fileno", (PyNoArgsFunction)PySocketSock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001640 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001641#ifdef HAVE_GETPEERNAME
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001642 {"getpeername", (PyNoArgsFunction)PySocketSock_getpeername,
1643 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001644#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001645 {"getsockname", (PyNoArgsFunction)PySocketSock_getsockname,
1646 METH_NOARGS, getsockname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001647 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1648 getsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001649 {"listen", (PyCFunction)PySocketSock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001650 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001651#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001652 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1653 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001654#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001655 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1656 recv_doc},
1657 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1658 recvfrom_doc},
1659 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1660 send_doc},
1661 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1662 sendto_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001663 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001664 setblocking_doc},
1665 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1666 setsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001667 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001668 shutdown_doc},
1669#ifdef RISCOS
1670 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1671 sleeptaskw_doc},
1672#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001673 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001674};
1675
Guido van Rossum30a685f1991-06-27 15:51:29 +00001676
Guido van Rossum73624e91994-10-10 17:59:00 +00001677/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001678 First close the file description. */
1679
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001680static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001681PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001682{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001683 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001684 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001685 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001686}
1687
Guido van Rossum30a685f1991-06-27 15:51:29 +00001688
1689/* Return a socket object's named attribute. */
1690
Guido van Rossum73624e91994-10-10 17:59:00 +00001691static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001692PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001693{
Guido van Rossum73624e91994-10-10 17:59:00 +00001694 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001695}
1696
Guido van Rossum30a685f1991-06-27 15:51:29 +00001697
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001698static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001699PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001700{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001701 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001702#if SIZEOF_SOCKET_T > SIZEOF_LONG
1703 if (s->sock_fd > LONG_MAX) {
1704 /* this can occur on Win64, and actually there is a special
1705 ugly printf formatter for decimal pointer length integer
1706 printing, only bother if necessary*/
1707 PyErr_SetString(PyExc_OverflowError,
1708 "no printf formatter to display the socket descriptor in decimal");
1709 return NULL;
1710 }
1711#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001712 sprintf(buf,
1713 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001714 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001715 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001716}
1717
1718
Guido van Rossumb6775db1994-08-01 11:34:53 +00001719/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001720
Guido van Rossum73624e91994-10-10 17:59:00 +00001721static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001722 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001723 0,
1724 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001725 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001726 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001727 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001728 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001729 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001730 0, /*tp_setattr*/
1731 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001732 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001733 0, /*tp_as_number*/
1734 0, /*tp_as_sequence*/
1735 0, /*tp_as_mapping*/
1736};
1737
Guido van Rossum30a685f1991-06-27 15:51:29 +00001738
Guido van Rossum81194471991-07-27 21:42:02 +00001739/* Python interface to gethostname(). */
1740
1741/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001742static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001743PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001744{
1745 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001746 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001747 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001748 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001749 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001750 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001751 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001752 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001753 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001754 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001755 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001756}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001757
Guido van Rossum82a5c661998-07-07 20:45:43 +00001758static char gethostname_doc[] =
1759"gethostname() -> string\n\
1760\n\
1761Return the current host name.";
1762
Guido van Rossumff4949e1992-08-05 19:58:53 +00001763
Guido van Rossum30a685f1991-06-27 15:51:29 +00001764/* Python interface to gethostbyname(name). */
1765
1766/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001767static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001768PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001769{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001770 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001771 struct sockaddr_storage addrbuf;
1772
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001773 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001774 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001775 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001776 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001777 return makeipaddr((struct sockaddr *)&addrbuf,
1778 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001779}
1780
Guido van Rossum82a5c661998-07-07 20:45:43 +00001781static char gethostbyname_doc[] =
1782"gethostbyname(host) -> address\n\
1783\n\
1784Return the IP address (a string of the form '255.255.255.255') for a host.";
1785
1786
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001787/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1788
1789static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001790gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001791{
1792 char **pch;
1793 PyObject *rtn_tuple = (PyObject *)NULL;
1794 PyObject *name_list = (PyObject *)NULL;
1795 PyObject *addr_list = (PyObject *)NULL;
1796 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001797
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001798 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001799 /* Let's get real error message to return */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001800 PyH_Err(h_errno);
1801 return NULL;
1802 }
1803 if (h->h_addrtype != af) {
1804#ifdef HAVE_STRERROR
1805 /* Let's get real error message to return */
1806 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001807#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001808 PyErr_SetString(PySocket_Error,
1809 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001810#endif
1811 return NULL;
1812 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001813 switch (af) {
1814 case AF_INET:
1815 if (alen < sizeof(struct sockaddr_in))
1816 return NULL;
1817 break;
1818#ifdef INET6
1819 case AF_INET6:
1820 if (alen < sizeof(struct sockaddr_in6))
1821 return NULL;
1822 break;
1823#endif
1824 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001825 if ((name_list = PyList_New(0)) == NULL)
1826 goto err;
1827 if ((addr_list = PyList_New(0)) == NULL)
1828 goto err;
1829 for (pch = h->h_aliases; *pch != NULL; pch++) {
1830 int status;
1831 tmp = PyString_FromString(*pch);
1832 if (tmp == NULL)
1833 goto err;
1834 status = PyList_Append(name_list, tmp);
1835 Py_DECREF(tmp);
1836 if (status)
1837 goto err;
1838 }
1839 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1840 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001841 switch (af) {
1842 case AF_INET:
1843 {
1844 struct sockaddr_in sin;
1845 memset(&sin, 0, sizeof(sin));
1846 sin.sin_family = af;
1847#ifdef HAVE_SOCKADDR_SA_LEN
1848 sin.sin_len = sizeof(sin);
1849#endif
1850 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
1851 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
1852 if (pch == h->h_addr_list && alen >= sizeof(sin))
1853 memcpy((char *) addr, &sin, sizeof(sin));
1854 break;
1855 }
1856#ifdef INET6
1857 case AF_INET6:
1858 {
1859 struct sockaddr_in6 sin6;
1860 memset(&sin6, 0, sizeof(sin6));
1861 sin6.sin6_family = af;
1862#ifdef HAVE_SOCKADDR_SA_LEN
1863 sin6.sin6_len = sizeof(sin6);
1864#endif
1865 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
1866 tmp = makeipaddr((struct sockaddr *)&sin6,
1867 sizeof(sin6));
1868 if (pch == h->h_addr_list && alen >= sizeof(sin6))
1869 memcpy((char *) addr, &sin6, sizeof(sin6));
1870 break;
1871 }
1872#endif
1873 default: /* can't happen */
1874 PyErr_SetString(PySocket_Error,
1875 "unsupported address family");
1876 return NULL;
1877 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001878 if (tmp == NULL)
1879 goto err;
1880 status = PyList_Append(addr_list, tmp);
1881 Py_DECREF(tmp);
1882 if (status)
1883 goto err;
1884 }
1885 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1886 err:
1887 Py_XDECREF(name_list);
1888 Py_XDECREF(addr_list);
1889 return rtn_tuple;
1890}
1891
1892
1893/* Python interface to gethostbyname_ex(name). */
1894
1895/*ARGSUSED*/
1896static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001897PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001898{
1899 char *name;
1900 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001901 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001902 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00001903 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001904#ifdef HAVE_GETHOSTBYNAME_R
1905 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001906#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1907 struct hostent_data data;
1908#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001909 char buf[16384];
1910 int buf_len = (sizeof buf) - 1;
1911 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001912#endif
1913#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001914 int result;
1915#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001916#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001917
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001918 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001919 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001920 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001921 return NULL;
1922 Py_BEGIN_ALLOW_THREADS
1923#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001924#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001925 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001926#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001927 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001928#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001929 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001930 result = gethostbyname_r(name, &hp_allocated, &data);
1931 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001932#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001933#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001934#ifdef USE_GETHOSTBYNAME_LOCK
1935 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001936#endif
1937 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001938#endif /* HAVE_GETHOSTBYNAME_R */
1939 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001940 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
1941 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
1942 sa = (struct sockaddr*)&addr;
1943 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00001944#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001945 PyThread_release_lock(gethostbyname_lock);
1946#endif
1947 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001948}
1949
1950static char ghbn_ex_doc[] =
1951"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1952\n\
1953Return the true host name, a list of aliases, and a list of IP addresses,\n\
1954for a host. The host argument is a string giving a host name or IP number.";
1955
1956
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001957/* Python interface to gethostbyaddr(IP). */
1958
1959/*ARGSUSED*/
1960static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001961PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001962{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001963#ifdef INET6
1964 struct sockaddr_storage addr;
1965#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001966 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001967#endif
1968 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001969 char *ip_num;
1970 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001971 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001972#ifdef HAVE_GETHOSTBYNAME_R
1973 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001974#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1975 struct hostent_data data;
1976#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001977 char buf[16384];
1978 int buf_len = (sizeof buf) - 1;
1979 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001980#endif
1981#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001982 int result;
1983#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001984#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001985 char *ap;
1986 int al;
1987 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001988
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001989 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001990 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001991 af = PF_UNSPEC;
1992 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001993 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001994 af = sa->sa_family;
1995 ap = NULL;
1996 al = 0;
1997 switch (af) {
1998 case AF_INET:
1999 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2000 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2001 break;
2002#ifdef INET6
2003 case AF_INET6:
2004 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2005 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2006 break;
2007#endif
2008 default:
2009 PyErr_SetString(PySocket_Error, "unsupported address family");
2010 return NULL;
2011 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002012 Py_BEGIN_ALLOW_THREADS
2013#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002014#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002015 result = gethostbyaddr_r(ap, al, af,
2016 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002017 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002018#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002019 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002020 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002021#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002022 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002023 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002024 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002025#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002026#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002027#ifdef USE_GETHOSTBYNAME_LOCK
2028 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002029#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002030 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002031#endif /* HAVE_GETHOSTBYNAME_R */
2032 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002033 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002034#ifdef USE_GETHOSTBYNAME_LOCK
2035 PyThread_release_lock(gethostbyname_lock);
2036#endif
2037 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002038}
2039
Guido van Rossum82a5c661998-07-07 20:45:43 +00002040static char gethostbyaddr_doc[] =
2041"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2042\n\
2043Return the true host name, a list of aliases, and a list of IP addresses,\n\
2044for a host. The host argument is a string giving a host name or IP number.";
2045
Guido van Rossum30a685f1991-06-27 15:51:29 +00002046
2047/* Python interface to getservbyname(name).
2048 This only returns the port number, since the other info is already
2049 known or not useful (like the list of aliases). */
2050
2051/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002052static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002053PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002054{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002055 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002056 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002057 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002058 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002059 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002060 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002061 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002062 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002063 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002064 return NULL;
2065 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002066 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002067}
2068
Guido van Rossum82a5c661998-07-07 20:45:43 +00002069static char getservbyname_doc[] =
2070"getservbyname(servicename, protocolname) -> integer\n\
2071\n\
2072Return a port number from a service name and protocol name.\n\
2073The protocol name should be 'tcp' or 'udp'.";
2074
Guido van Rossum30a685f1991-06-27 15:51:29 +00002075
Guido van Rossum3901d851996-12-19 16:35:04 +00002076/* Python interface to getprotobyname(name).
2077 This only returns the protocol number, since the other info is
2078 already known or not useful (like the list of aliases). */
2079
2080/*ARGSUSED*/
2081static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002082PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002083{
2084 char *name;
2085 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002086#ifdef __BEOS__
2087/* Not available in BeOS yet. - [cjh] */
2088 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2089 return NULL;
2090#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002091 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002092 return NULL;
2093 Py_BEGIN_ALLOW_THREADS
2094 sp = getprotobyname(name);
2095 Py_END_ALLOW_THREADS
2096 if (sp == NULL) {
2097 PyErr_SetString(PySocket_Error, "protocol not found");
2098 return NULL;
2099 }
2100 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002101#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002102}
2103
Guido van Rossum82a5c661998-07-07 20:45:43 +00002104static char getprotobyname_doc[] =
2105"getprotobyname(name) -> integer\n\
2106\n\
2107Return the protocol number for the named protocol. (Rarely used.)";
2108
Guido van Rossum3901d851996-12-19 16:35:04 +00002109
Guido van Rossum30a685f1991-06-27 15:51:29 +00002110/* Python interface to socket(family, type, proto).
2111 The third (protocol) argument is optional.
2112 Return a new socket object. */
2113
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002114/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002115static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002116PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002117{
Guido van Rossum73624e91994-10-10 17:59:00 +00002118 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002119 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002120 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00002121 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002122 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002123 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002124 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002125 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00002126#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002127 if (fd == INVALID_SOCKET)
2128#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002129 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002130#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002131 return PySocket_Err();
2132 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002133 /* If the object can't be created, don't forget to close the
2134 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002135 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002136 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00002137 /* From now on, ignore SIGPIPE and let the error checking
2138 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002139#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00002140 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002141#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002142 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002143}
2144
Guido van Rossum82a5c661998-07-07 20:45:43 +00002145static char socket_doc[] =
2146"socket(family, type[, proto]) -> socket object\n\
2147\n\
2148Open a socket of the given type. The family argument specifies the\n\
2149address family; it is normally AF_INET, sometimes AF_UNIX.\n\
2150The type argument specifies whether this is a stream (SOCK_STREAM)\n\
2151or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
2152specifying the default protocol.";
2153
2154
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002155#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002156/* Create a socket object from a numeric file description.
2157 Useful e.g. if stdin is a socket.
2158 Additional arguments as for socket(). */
2159
2160/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002161static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002162PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002163{
Guido van Rossum73624e91994-10-10 17:59:00 +00002164 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002165 SOCKET_T fd;
2166 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002167 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2168 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002169 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002170 /* Dup the fd so it and the socket can be closed independently */
2171 fd = dup(fd);
2172 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002173 return PySocket_Err();
2174 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002175 /* From now on, ignore SIGPIPE and let the error checking
2176 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002177#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002178 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002179#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002180 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002181}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002182
2183static char fromfd_doc[] =
2184"fromfd(fd, family, type[, proto]) -> socket object\n\
2185\n\
2186Create a socket object from the given file descriptor.\n\
2187The remaining arguments are the same as for socket().";
2188
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002189#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002190
Guido van Rossum82a5c661998-07-07 20:45:43 +00002191
Guido van Rossum006bf911996-06-12 04:04:55 +00002192static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002193PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002194{
2195 int x1, x2;
2196
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002197 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002198 return NULL;
2199 }
2200 x2 = (int)ntohs((short)x1);
2201 return PyInt_FromLong(x2);
2202}
2203
Guido van Rossum82a5c661998-07-07 20:45:43 +00002204static char ntohs_doc[] =
2205"ntohs(integer) -> integer\n\
2206\n\
2207Convert a 16-bit integer from network to host byte order.";
2208
2209
Guido van Rossum006bf911996-06-12 04:04:55 +00002210static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002211PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002212{
2213 int x1, x2;
2214
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002215 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002216 return NULL;
2217 }
2218 x2 = ntohl(x1);
2219 return PyInt_FromLong(x2);
2220}
2221
Guido van Rossum82a5c661998-07-07 20:45:43 +00002222static char ntohl_doc[] =
2223"ntohl(integer) -> integer\n\
2224\n\
2225Convert a 32-bit integer from network to host byte order.";
2226
2227
Guido van Rossum006bf911996-06-12 04:04:55 +00002228static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002229PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002230{
2231 int x1, x2;
2232
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002233 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002234 return NULL;
2235 }
2236 x2 = (int)htons((short)x1);
2237 return PyInt_FromLong(x2);
2238}
2239
Guido van Rossum82a5c661998-07-07 20:45:43 +00002240static char htons_doc[] =
2241"htons(integer) -> integer\n\
2242\n\
2243Convert a 16-bit integer from host to network byte order.";
2244
2245
Guido van Rossum006bf911996-06-12 04:04:55 +00002246static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002247PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002248{
2249 int x1, x2;
2250
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002251 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002252 return NULL;
2253 }
2254 x2 = htonl(x1);
2255 return PyInt_FromLong(x2);
2256}
2257
Guido van Rossum82a5c661998-07-07 20:45:43 +00002258static char htonl_doc[] =
2259"htonl(integer) -> integer\n\
2260\n\
2261Convert a 32-bit integer from host to network byte order.";
2262
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002263/*
2264 * socket.inet_aton() and socket.inet_ntoa() functions
2265 *
2266 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2267 *
2268 */
2269
Guido van Rossum48a680c2001-03-02 06:34:14 +00002270static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002271"inet_aton(string) -> packed 32-bit IP representation\n\
2272\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002273Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002274binary format used in low-level network functions.";
2275
2276static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002277PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002278{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002279#ifndef INADDR_NONE
2280#define INADDR_NONE (-1)
2281#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002282
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002283 /* Have to use inet_addr() instead */
2284 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002285 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002286
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002287 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002288 return NULL;
2289 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002290#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002291 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002292#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002293 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002294#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002295
2296 if (packed_addr == INADDR_NONE) { /* invalid address */
2297 PyErr_SetString(PySocket_Error,
2298 "illegal IP address string passed to inet_aton");
2299 return NULL;
2300 }
2301
2302 return PyString_FromStringAndSize((char *) &packed_addr,
2303 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002304}
2305
Guido van Rossum48a680c2001-03-02 06:34:14 +00002306static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002307"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002308\n\
2309Convert an IP address from 32-bit packed binary format to string format";
2310
2311static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002312PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002313{
2314 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002315 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002316 struct in_addr packed_addr;
2317
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002318 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002319 return NULL;
2320 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002321
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002322 if (addr_len != sizeof(packed_addr)) {
2323 PyErr_SetString(PySocket_Error,
2324 "packed IP wrong length for inet_ntoa");
2325 return NULL;
2326 }
2327
2328 memcpy(&packed_addr, packed_str, addr_len);
2329
2330 return PyString_FromString(inet_ntoa(packed_addr));
2331}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002332
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002333/* Python interface to getaddrinfo(host, port). */
2334
2335/*ARGSUSED*/
2336static PyObject *
2337PySocket_getaddrinfo(PyObject *self, PyObject *args)
2338{
2339 struct addrinfo hints, *res0, *res;
2340 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002341 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002342 char *hptr, *pptr;
2343 int family, socktype, protocol, flags;
2344 int error;
2345 PyObject *all = (PyObject *)NULL;
2346 PyObject *single = (PyObject *)NULL;
2347
2348 family = socktype = protocol = flags = 0;
2349 family = PF_UNSPEC;
2350 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2351 &hptr, &pobj, &family, &socktype,
2352 &protocol, &flags)) {
2353 return NULL;
2354 }
2355 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002356 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002357 pptr = pbuf;
2358 } else if (PyString_Check(pobj)) {
2359 pptr = PyString_AsString(pobj);
2360 } else if (pobj == Py_None) {
2361 pptr = (char *)NULL;
2362 } else {
2363 PyErr_SetString(PySocket_Error, "Int or String expected");
2364 return NULL;
2365 }
2366 memset(&hints, 0, sizeof(hints));
2367 hints.ai_family = family;
2368 hints.ai_socktype = socktype;
2369 hints.ai_protocol = protocol;
2370 hints.ai_flags = flags;
2371 error = getaddrinfo(hptr, pptr, &hints, &res0);
2372 if (error) {
2373 PyGAI_Err(error);
2374 return NULL;
2375 }
2376
2377 if ((all = PyList_New(0)) == NULL)
2378 goto err;
2379 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002380 PyObject *addr =
2381 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2382 if (addr == NULL)
2383 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002384 single = Py_BuildValue("iiisO", res->ai_family,
2385 res->ai_socktype, res->ai_protocol,
2386 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002387 addr);
2388 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002389 if (single == NULL)
2390 goto err;
2391
2392 if (PyList_Append(all, single))
2393 goto err;
2394 Py_XDECREF(single);
2395 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002396 return all;
2397 err:
2398 Py_XDECREF(single);
2399 Py_XDECREF(all);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002400 return (PyObject *)NULL;
2401}
2402
2403static char getaddrinfo_doc[] =
2404"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2405 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2406\n\
2407Resolve host and port into addrinfo struct.";
2408
2409/* Python interface to getnameinfo(sa, flags). */
2410
2411/*ARGSUSED*/
2412static PyObject *
2413PySocket_getnameinfo(PyObject *self, PyObject *args)
2414{
2415 PyObject *sa = (PyObject *)NULL;
2416 int flags;
2417 char *hostp;
2418 int n, port, flowinfo, scope_id;
2419 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2420 struct addrinfo hints, *res = NULL;
2421 int error;
2422 PyObject *ret = (PyObject *)NULL;
2423
2424 flags = flowinfo = scope_id = 0;
2425 if (PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags) == 0)
2426 return NULL;
2427 n = PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, scope_id);
2428 if (n == 0)
2429 goto fail;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002430 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002431 memset(&hints, 0, sizeof(hints));
2432 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002433 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002434 error = getaddrinfo(hostp, pbuf, &hints, &res);
2435 if (error) {
2436 PyGAI_Err(error);
2437 goto fail;
2438 }
2439 if (res->ai_next) {
2440 PyErr_SetString(PySocket_Error,
2441 "sockaddr resolved to multiple addresses");
2442 goto fail;
2443 }
2444 switch (res->ai_family) {
2445 case AF_INET:
2446 {
2447 char *t1;
2448 int t2;
2449 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2450 PyErr_SetString(PySocket_Error,
2451 "IPv4 sockaddr must be 2 tuple");
2452 goto fail;
2453 }
2454 break;
2455 }
2456#ifdef INET6
2457 case AF_INET6:
2458 {
2459 struct sockaddr_in6 *sin6;
2460 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2461 sin6->sin6_flowinfo = flowinfo;
2462 sin6->sin6_scope_id = scope_id;
2463 break;
2464 }
2465#endif
2466 }
2467 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2468 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2469 if (error) {
2470 PyGAI_Err(error);
2471 goto fail;
2472 }
2473 ret = Py_BuildValue("ss", hbuf, pbuf);
2474
2475fail:
2476 if (res)
2477 freeaddrinfo(res);
2478 Py_XDECREF(sa);
2479 return ret;
2480}
2481
2482static char getnameinfo_doc[] =
2483"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2484\n\
2485Get host and port for a sockaddr.";
2486
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002487/* XXX It might be helpful to augment the error message generated
2488 below with the name of the SSL function that generated the error.
2489 I expect it's obvious most of the time.
2490*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002491
2492#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002493static PyObject *
2494PySSL_SetError(SSL *ssl, int ret)
2495{
2496 PyObject *v, *n, *s;
2497 char *errstr;
2498 int err;
2499
2500 assert(ret <= 0);
2501
2502 err = SSL_get_error(ssl, ret);
2503 n = PyInt_FromLong(err);
2504 if (n == NULL)
2505 return NULL;
2506 v = PyTuple_New(2);
2507 if (v == NULL) {
2508 Py_DECREF(n);
2509 return NULL;
2510 }
2511
2512 switch (SSL_get_error(ssl, ret)) {
2513 case SSL_ERROR_ZERO_RETURN:
2514 errstr = "TLS/SSL connection has been closed";
2515 break;
2516 case SSL_ERROR_WANT_READ:
2517 errstr = "The operation did not complete (read)";
2518 break;
2519 case SSL_ERROR_WANT_WRITE:
2520 errstr = "The operation did not complete (write)";
2521 break;
2522 case SSL_ERROR_WANT_X509_LOOKUP:
2523 errstr = "The operation did not complete (X509 lookup)";
2524 break;
2525 case SSL_ERROR_SYSCALL:
2526 case SSL_ERROR_SSL:
2527 {
2528 unsigned long e = ERR_get_error();
2529 if (e == 0) {
2530 /* an EOF was observed that violates the protocol */
2531 errstr = "EOF occurred in violation of protocol";
2532 } else if (e == -1) {
2533 /* the underlying BIO reported an I/O error */
2534 Py_DECREF(v);
2535 Py_DECREF(n);
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +00002536 return PySocket_Err();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002537 } else {
2538 /* XXX Protected by global interpreter lock */
2539 errstr = ERR_error_string(e, NULL);
2540 }
2541 break;
2542 }
2543 default:
2544 errstr = "Invalid error code";
2545 }
2546 s = PyString_FromString(errstr);
2547 if (s == NULL) {
2548 Py_DECREF(v);
2549 Py_DECREF(n);
2550 }
2551 PyTuple_SET_ITEM(v, 0, n);
2552 PyTuple_SET_ITEM(v, 1, s);
2553 PyErr_SetObject(PySSLErrorObject, v);
2554 return NULL;
2555}
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002556
2557/* This is a C function to be called for new object initialization */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002558static PySSLObject *
2559newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002560{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002561 PySSLObject *self;
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002562 char *errstr = NULL;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002563 int ret;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002564
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002565 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002566 if (self == NULL){
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002567 errstr = "newPySSLObject error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002568 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002569 }
Jeremy Hyltonba699362001-10-11 17:23:34 +00002570 memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
2571 memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002572 self->server_cert = NULL;
2573 self->ssl = NULL;
2574 self->ctx = NULL;
2575 self->Socket = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002576
Jeremy Hylton22738b92001-10-10 22:37:48 +00002577 if ((key_file && !cert_file) || (!key_file && cert_file)) {
2578 errstr = "Both the key & certificate files must be specified";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002579 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002580 }
2581
Jeremy Hylton22738b92001-10-10 22:37:48 +00002582 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2583 if (self->ctx == NULL) {
2584 errstr = "SSL_CTX_new error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002585 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002586 }
2587
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002588 if (key_file) {
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002589 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002590 SSL_FILETYPE_PEM) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002591 errstr = "SSL_CTX_use_PrivateKey_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002592 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002593 }
2594
2595 if (SSL_CTX_use_certificate_chain_file(self->ctx,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002596 cert_file) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002597 errstr = "SSL_CTX_use_certificate_chain_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002598 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002599 }
2600 }
2601
2602 SSL_CTX_set_verify(self->ctx,
2603 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2604 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2605 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2606 SSL_set_connect_state(self->ssl);
2607
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002608 /* Actually negotiate SSL connection */
2609 /* XXX If SSL_connect() returns 0, it's also a failure. */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002610 ret = SSL_connect(self->ssl);
2611 if (ret <= 0) {
2612 PySSL_SetError(self->ssl, ret);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002613 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002614 }
2615 self->ssl->debug = 1;
2616
2617 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2618 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002619 self->server, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002620 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002621 self->issuer, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002622 }
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002623 self->Socket = Sock;
2624 Py_INCREF(self->Socket);
2625 return self;
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002626 fail:
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002627 if (errstr)
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002628 PyErr_SetString(PySSLErrorObject, errstr);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002629 Py_DECREF(self);
2630 return NULL;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002631}
2632
2633/* This is the Python function called for new object initialization */
2634static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002635PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002636{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002637 PySSLObject *rv;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002638 PySocketSockObject *Sock;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002639 char *key_file = NULL;
2640 char *cert_file = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002641
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002642 if (!PyArg_ParseTuple(args, "O!|zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002643 &PySocketSock_Type, (PyObject*)&Sock,
Jeremy Hyltonab006452001-10-10 03:33:24 +00002644 &key_file, &cert_file))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002645 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002646
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002647 rv = newPySSLObject(Sock, key_file, cert_file);
Jeremy Hyltonab006452001-10-10 03:33:24 +00002648 if (rv == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002649 return NULL;
2650 return (PyObject *)rv;
2651}
2652
2653static char ssl_doc[] =
Jeremy Hyltonba699362001-10-11 17:23:34 +00002654"ssl(socket, [keyfile, certfile]) -> sslobject";
2655
2656/* SSL object methods */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002657
2658static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002659PySSL_server(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002660{
2661 return PyString_FromString(self->server);
2662}
2663
2664static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002665PySSL_issuer(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002666{
2667 return PyString_FromString(self->issuer);
2668}
2669
2670
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002671static void PySSL_dealloc(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002672{
2673 if (self->server_cert) /* Possible not to have one? */
2674 X509_free (self->server_cert);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002675 if (self->ssl)
2676 SSL_free(self->ssl);
2677 if (self->ctx)
2678 SSL_CTX_free(self->ctx);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002679 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002680 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002681}
2682
Jeremy Hyltonba699362001-10-11 17:23:34 +00002683static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
2684{
2685 char *data;
2686 int len;
2687
2688 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
2689 return NULL;
2690
2691 len = SSL_write(self->ssl, data, len);
2692 if (len > 0)
2693 return PyInt_FromLong(len);
2694 else
2695 return PySSL_SetError(self->ssl, len);
2696}
2697
2698static char PySSL_SSLwrite_doc[] =
2699"write(s) -> len\n\
2700\n\
2701Writes the string s into the SSL object. Returns the number\n\
2702of bytes written.";
2703
2704static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
2705{
2706 PyObject *buf;
2707 int count = 0;
2708 int len = 1024;
2709
2710 if (!PyArg_ParseTuple(args, "|i:read", &len))
2711 return NULL;
2712
2713 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2714 return NULL;
2715
2716 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2717 if (count <= 0) {
2718 Py_DECREF(buf);
2719 return PySSL_SetError(self->ssl, count);
2720 }
2721 if (count != len && _PyString_Resize(&buf, count) < 0)
2722 return NULL;
2723 return buf;
2724}
2725
2726static char PySSL_SSLread_doc[] =
2727"read([len]) -> string\n\
2728\n\
2729Read up to len bytes from the SSL socket.";
2730
2731static PyMethodDef PySSLMethods[] = {
2732 {"write", (PyCFunction)PySSL_SSLwrite, 1,
2733 PySSL_SSLwrite_doc},
2734 {"read", (PyCFunction)PySSL_SSLread, 1,
2735 PySSL_SSLread_doc},
2736 {"server", (PyNoArgsFunction)PySSL_server, METH_NOARGS},
2737 {"issuer", (PyNoArgsFunction)PySSL_issuer, METH_NOARGS},
2738 {NULL, NULL}
2739};
2740
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002741static PyObject *PySSL_getattr(PySSLObject *self, char *name)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002742{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002743 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002744}
2745
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002746staticforward PyTypeObject PySSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002747 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002748 0, /*ob_size*/
2749 "SSL", /*tp_name*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002750 sizeof(PySSLObject), /*tp_basicsize*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002751 0, /*tp_itemsize*/
2752 /* methods */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002753 (destructor)PySSL_dealloc, /*tp_dealloc*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002754 0, /*tp_print*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002755 (getattrfunc)PySSL_getattr, /*tp_getattr*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002756 0, /*tp_setattr*/
2757 0, /*tp_compare*/
2758 0, /*tp_repr*/
2759 0, /*tp_as_number*/
2760 0, /*tp_as_sequence*/
2761 0, /*tp_as_mapping*/
2762 0, /*tp_hash*/
2763};
2764
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002765#endif /* USE_SSL */
2766
2767
Guido van Rossum30a685f1991-06-27 15:51:29 +00002768/* List of functions exported by this module. */
2769
Guido van Rossum73624e91994-10-10 17:59:00 +00002770static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002771 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002772 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002773 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002774 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002775 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002776 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002777 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002778 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002779 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002780 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002781 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002782 METH_VARARGS,getprotobyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002783 {"socket", PySocket_socket,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002784 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002785#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002786 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002787 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002788#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002789 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002790 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002791 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002792 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002793 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002794 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002795 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002796 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002797 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002798 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002799 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002800 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002801 {"getaddrinfo", PySocket_getaddrinfo,
2802 METH_VARARGS, getaddrinfo_doc},
2803 {"getnameinfo", PySocket_getnameinfo,
2804 METH_VARARGS, getnameinfo_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002805#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002806 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002807 METH_VARARGS, ssl_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002808#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002809 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002810};
2811
Guido van Rossum30a685f1991-06-27 15:51:29 +00002812
2813/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002814 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002815 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002816 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002817static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002818insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002819{
Guido van Rossum73624e91994-10-10 17:59:00 +00002820 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002821 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002822 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002823
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002824 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002825}
2826
Guido van Rossum30a685f1991-06-27 15:51:29 +00002827
Guido van Rossum8d665e61996-06-26 18:22:49 +00002828#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002829
2830/* Additional initialization and cleanup for NT/Windows */
2831
2832static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002833NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002834{
2835 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002836}
2837
2838static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002839NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002840{
2841 WSADATA WSAData;
2842 int ret;
2843 char buf[100];
2844 ret = WSAStartup(0x0101, &WSAData);
2845 switch (ret) {
2846 case 0: /* no error */
2847 atexit(NTcleanup);
2848 return 1;
2849 case WSASYSNOTREADY:
2850 PyErr_SetString(PyExc_ImportError,
2851 "WSAStartup failed: network not ready");
2852 break;
2853 case WSAVERNOTSUPPORTED:
2854 case WSAEINVAL:
2855 PyErr_SetString(PyExc_ImportError,
2856 "WSAStartup failed: requested version not supported");
2857 break;
2858 default:
2859 sprintf(buf, "WSAStartup failed: error code %d", ret);
2860 PyErr_SetString(PyExc_ImportError, buf);
2861 break;
2862 }
2863 return 0;
2864}
2865
Guido van Rossum8d665e61996-06-26 18:22:49 +00002866#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002867
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002868#if defined(PYOS_OS2)
2869
2870/* Additional initialization and cleanup for OS/2 */
2871
2872static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002873OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002874{
2875 /* No cleanup is necessary for OS/2 Sockets */
2876}
2877
2878static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002879OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002880{
2881 char reason[64];
2882 int rc = sock_init();
2883
2884 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002885 atexit(OS2cleanup);
2886 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002887 }
2888
2889 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2890 PyErr_SetString(PyExc_ImportError, reason);
2891
Guido van Rossum32c575d1997-12-02 20:37:32 +00002892 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002893}
2894
2895#endif /* PYOS_OS2 */
2896
Guido van Rossum30a685f1991-06-27 15:51:29 +00002897/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002898 * This is called when the first 'import socket' is done,
2899 * via a table in config.c, if config.c is compiled with USE_SOCKET
2900 * defined.
2901 *
2902 * For MS_WINDOWS (which means any Windows variant), this module
2903 * is actually called "_socket", and there's a wrapper "socket.py"
2904 * which implements some missing functionality (such as makefile(),
2905 * dup() and fromfd()). The import of "_socket" may fail with an
2906 * ImportError exception if initialization of WINSOCK fails. When
2907 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2908 * scheduled to be made at exit time.
2909 *
2910 * For OS/2, this module is also called "_socket" and uses a wrapper
2911 * "socket.py" which implements that functionality that is missing
2912 * when PC operating systems don't put socket descriptors in the
2913 * operating system's filesystem layer.
2914 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002915
Guido van Rossum82a5c661998-07-07 20:45:43 +00002916static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002917"Implementation module for socket operations. See the socket module\n\
2918for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002919
2920static char sockettype_doc[] =
2921"A socket represents one endpoint of a network connection.\n\
2922\n\
2923Methods:\n\
2924\n\
2925accept() -- accept a connection, returning new socket and client address\n\
2926bind() -- bind the socket to a local address\n\
2927close() -- close the socket\n\
2928connect() -- connect the socket to a remote address\n\
2929connect_ex() -- connect, return an error code instead of an exception \n\
2930dup() -- return a new socket object identical to the current one (*)\n\
2931fileno() -- return underlying file descriptor\n\
2932getpeername() -- return remote address (*)\n\
2933getsockname() -- return local address\n\
2934getsockopt() -- get socket options\n\
2935listen() -- start listening for incoming connections\n\
2936makefile() -- return a file object corresponding tot the socket (*)\n\
2937recv() -- receive data\n\
2938recvfrom() -- receive data and sender's address\n\
2939send() -- send data\n\
2940sendto() -- send data to a given address\n\
2941setblocking() -- set or clear the blocking I/O flag\n\
2942setsockopt() -- set socket options\n\
2943shutdown() -- shut down traffic in one or both directions\n\
2944\n\
2945(*) not available on all platforms!)";
2946
Guido van Rossum3886bb61998-12-04 18:50:17 +00002947DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002948init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002949{
Guido van Rossum73624e91994-10-10 17:59:00 +00002950 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002951#ifdef RISCOS
2952 _kernel_swi_regs r;
2953 r.r[0]=0;
2954 _kernel_swi(0x43380, &r, &r);
2955 taskwindow = r.r[0];
2956#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002957#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002958 if (!NTinit())
2959 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002960#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002961#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002962 if (!OS2init())
2963 return;
Fred Drakea136d492000-08-16 14:18:30 +00002964#endif /* __TOS_OS2__ */
2965#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002966#endif /* RISCOS */
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002967#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002968 PySSL_Type.ob_type = &PyType_Type;
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002969#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002970 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00002971 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002972 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2973 if (PySocket_Error == NULL)
2974 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002975 PyDict_SetItemString(d, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002976 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
2977 if (PyH_Error == NULL)
2978 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002979 PyDict_SetItemString(d, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002980 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
2981 NULL);
2982 if (PyGAI_Error == NULL)
2983 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002984 PyDict_SetItemString(d, "gaierror", PyGAI_Error);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002985#ifdef USE_SSL
2986 SSL_load_error_strings();
2987 SSLeay_add_ssl_algorithms();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002988 PySSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2989 if (PySSLErrorObject == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002990 return;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002991 PyDict_SetItemString(d, "sslerror", PySSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002992 if (PyDict_SetItemString(d, "SSLType",
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002993 (PyObject *)&PySSL_Type) != 0)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002994 return;
Jeremy Hylton57ca8732001-10-11 00:00:17 +00002995 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
2996 SSL_ERROR_ZERO_RETURN);
2997 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
2998 SSL_ERROR_WANT_READ);
2999 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
3000 SSL_ERROR_WANT_WRITE);
3001 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
3002 SSL_ERROR_WANT_X509_LOOKUP);
3003 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
3004 SSL_ERROR_SYSCALL);
3005 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
3006 SSL_ERROR_SSL);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003007#endif /* USE_SSL */
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00003008 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00003009 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum91ba64d1997-06-02 22:18:09 +00003010 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00003011 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003012 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003013
3014 /* Address families (we only support AF_INET and AF_UNIX) */
3015#ifdef AF_UNSPEC
3016 insint(d, "AF_UNSPEC", AF_UNSPEC);
3017#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003018 insint(d, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003019#ifdef AF_INET6
3020 insint(d, "AF_INET6", AF_INET6);
3021#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003022#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003023 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003024#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003025#ifdef AF_AX25
3026 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
3027#endif
3028#ifdef AF_IPX
3029 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
3030#endif
3031#ifdef AF_APPLETALK
3032 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
3033#endif
3034#ifdef AF_NETROM
3035 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
3036#endif
3037#ifdef AF_BRIDGE
3038 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
3039#endif
3040#ifdef AF_AAL5
3041 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
3042#endif
3043#ifdef AF_X25
3044 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
3045#endif
3046#ifdef AF_INET6
3047 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
3048#endif
3049#ifdef AF_ROSE
3050 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
3051#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003052#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00003053 insint(d, "AF_PACKET", AF_PACKET);
3054 insint(d, "PF_PACKET", PF_PACKET);
3055 insint(d, "PACKET_HOST", PACKET_HOST);
3056 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
3057 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
3058 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3059 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
3060 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3061 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003062#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003063
3064 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003065 insint(d, "SOCK_STREAM", SOCK_STREAM);
3066 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003067#ifndef __BEOS__
3068/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003069 insint(d, "SOCK_RAW", SOCK_RAW);
3070 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3071 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003072#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003073
3074#ifdef SO_DEBUG
3075 insint(d, "SO_DEBUG", SO_DEBUG);
3076#endif
3077#ifdef SO_ACCEPTCONN
3078 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
3079#endif
3080#ifdef SO_REUSEADDR
3081 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
3082#endif
3083#ifdef SO_KEEPALIVE
3084 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
3085#endif
3086#ifdef SO_DONTROUTE
3087 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
3088#endif
3089#ifdef SO_BROADCAST
3090 insint(d, "SO_BROADCAST", SO_BROADCAST);
3091#endif
3092#ifdef SO_USELOOPBACK
3093 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
3094#endif
3095#ifdef SO_LINGER
3096 insint(d, "SO_LINGER", SO_LINGER);
3097#endif
3098#ifdef SO_OOBINLINE
3099 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
3100#endif
3101#ifdef SO_REUSEPORT
3102 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
3103#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003104#ifdef SO_SNDBUF
3105 insint(d, "SO_SNDBUF", SO_SNDBUF);
3106#endif
3107#ifdef SO_RCVBUF
3108 insint(d, "SO_RCVBUF", SO_RCVBUF);
3109#endif
3110#ifdef SO_SNDLOWAT
3111 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
3112#endif
3113#ifdef SO_RCVLOWAT
3114 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
3115#endif
3116#ifdef SO_SNDTIMEO
3117 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
3118#endif
3119#ifdef SO_RCVTIMEO
3120 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
3121#endif
3122#ifdef SO_ERROR
3123 insint(d, "SO_ERROR", SO_ERROR);
3124#endif
3125#ifdef SO_TYPE
3126 insint(d, "SO_TYPE", SO_TYPE);
3127#endif
3128
3129 /* Maximum number of connections for "listen" */
3130#ifdef SOMAXCONN
3131 insint(d, "SOMAXCONN", SOMAXCONN);
3132#else
3133 insint(d, "SOMAXCONN", 5); /* Common value */
3134#endif
3135
3136 /* Flags for send, recv */
3137#ifdef MSG_OOB
3138 insint(d, "MSG_OOB", MSG_OOB);
3139#endif
3140#ifdef MSG_PEEK
3141 insint(d, "MSG_PEEK", MSG_PEEK);
3142#endif
3143#ifdef MSG_DONTROUTE
3144 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
3145#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003146#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00003147 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003148#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003149#ifdef MSG_EOR
3150 insint(d, "MSG_EOR", MSG_EOR);
3151#endif
3152#ifdef MSG_TRUNC
3153 insint(d, "MSG_TRUNC", MSG_TRUNC);
3154#endif
3155#ifdef MSG_CTRUNC
3156 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
3157#endif
3158#ifdef MSG_WAITALL
3159 insint(d, "MSG_WAITALL", MSG_WAITALL);
3160#endif
3161#ifdef MSG_BTAG
3162 insint(d, "MSG_BTAG", MSG_BTAG);
3163#endif
3164#ifdef MSG_ETAG
3165 insint(d, "MSG_ETAG", MSG_ETAG);
3166#endif
3167
3168 /* Protocol level and numbers, usable for [gs]etsockopt */
3169#ifdef SOL_SOCKET
3170 insint(d, "SOL_SOCKET", SOL_SOCKET);
3171#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003172#ifdef SOL_IP
3173 insint(d, "SOL_IP", SOL_IP);
3174#else
3175 insint(d, "SOL_IP", 0);
3176#endif
3177#ifdef SOL_IPX
3178 insint(d, "SOL_IPX", SOL_IPX);
3179#endif
3180#ifdef SOL_AX25
3181 insint(d, "SOL_AX25", SOL_AX25);
3182#endif
3183#ifdef SOL_ATALK
3184 insint(d, "SOL_ATALK", SOL_ATALK);
3185#endif
3186#ifdef SOL_NETROM
3187 insint(d, "SOL_NETROM", SOL_NETROM);
3188#endif
3189#ifdef SOL_ROSE
3190 insint(d, "SOL_ROSE", SOL_ROSE);
3191#endif
3192#ifdef SOL_TCP
3193 insint(d, "SOL_TCP", SOL_TCP);
3194#else
3195 insint(d, "SOL_TCP", 6);
3196#endif
3197#ifdef SOL_UDP
3198 insint(d, "SOL_UDP", SOL_UDP);
3199#else
3200 insint(d, "SOL_UDP", 17);
3201#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003202#ifdef IPPROTO_IP
3203 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003204#else
3205 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003206#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003207#ifdef IPPROTO_HOPOPTS
3208 insint(d, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
3209#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003210#ifdef IPPROTO_ICMP
3211 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003212#else
3213 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003214#endif
3215#ifdef IPPROTO_IGMP
3216 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
3217#endif
3218#ifdef IPPROTO_GGP
3219 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
3220#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003221#ifdef IPPROTO_IPV4
3222 insint(d, "IPPROTO_IPV4", IPPROTO_IPV4);
3223#endif
3224#ifdef IPPROTO_IPIP
3225 insint(d, "IPPROTO_IPIP", IPPROTO_IPIP);
3226#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003227#ifdef IPPROTO_TCP
3228 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003229#else
3230 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003231#endif
3232#ifdef IPPROTO_EGP
3233 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
3234#endif
3235#ifdef IPPROTO_PUP
3236 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
3237#endif
3238#ifdef IPPROTO_UDP
3239 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003240#else
3241 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003242#endif
3243#ifdef IPPROTO_IDP
3244 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
3245#endif
3246#ifdef IPPROTO_HELLO
3247 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
3248#endif
3249#ifdef IPPROTO_ND
3250 insint(d, "IPPROTO_ND", IPPROTO_ND);
3251#endif
3252#ifdef IPPROTO_TP
3253 insint(d, "IPPROTO_TP", IPPROTO_TP);
3254#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003255#ifdef IPPROTO_IPV6
3256 insint(d, "IPPROTO_IPV6", IPPROTO_IPV6);
3257#endif
3258#ifdef IPPROTO_ROUTING
3259 insint(d, "IPPROTO_ROUTING", IPPROTO_ROUTING);
3260#endif
3261#ifdef IPPROTO_FRAGMENT
3262 insint(d, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
3263#endif
3264#ifdef IPPROTO_RSVP
3265 insint(d, "IPPROTO_RSVP", IPPROTO_RSVP);
3266#endif
3267#ifdef IPPROTO_GRE
3268 insint(d, "IPPROTO_GRE", IPPROTO_GRE);
3269#endif
3270#ifdef IPPROTO_ESP
3271 insint(d, "IPPROTO_ESP", IPPROTO_ESP);
3272#endif
3273#ifdef IPPROTO_AH
3274 insint(d, "IPPROTO_AH", IPPROTO_AH);
3275#endif
3276#ifdef IPPROTO_MOBILE
3277 insint(d, "IPPROTO_MOBILE", IPPROTO_MOBILE);
3278#endif
3279#ifdef IPPROTO_ICMPV6
3280 insint(d, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
3281#endif
3282#ifdef IPPROTO_NONE
3283 insint(d, "IPPROTO_NONE", IPPROTO_NONE);
3284#endif
3285#ifdef IPPROTO_DSTOPTS
3286 insint(d, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
3287#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003288#ifdef IPPROTO_XTP
3289 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
3290#endif
3291#ifdef IPPROTO_EON
3292 insint(d, "IPPROTO_EON", IPPROTO_EON);
3293#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003294#ifdef IPPROTO_PIM
3295 insint(d, "IPPROTO_PIM", IPPROTO_PIM);
3296#endif
3297#ifdef IPPROTO_IPCOMP
3298 insint(d, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
3299#endif
3300#ifdef IPPROTO_VRRP
3301 insint(d, "IPPROTO_VRRP", IPPROTO_VRRP);
3302#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003303#ifdef IPPROTO_BIP
3304 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
3305#endif
3306/**/
3307#ifdef IPPROTO_RAW
3308 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003309#else
3310 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003311#endif
3312#ifdef IPPROTO_MAX
3313 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
3314#endif
3315
3316 /* Some port configuration */
3317#ifdef IPPORT_RESERVED
3318 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
3319#else
3320 insint(d, "IPPORT_RESERVED", 1024);
3321#endif
3322#ifdef IPPORT_USERRESERVED
3323 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
3324#else
3325 insint(d, "IPPORT_USERRESERVED", 5000);
3326#endif
3327
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003328 /* Some reserved IP v.4 addresses */
3329#ifdef INADDR_ANY
3330 insint(d, "INADDR_ANY", INADDR_ANY);
3331#else
3332 insint(d, "INADDR_ANY", 0x00000000);
3333#endif
3334#ifdef INADDR_BROADCAST
3335 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
3336#else
3337 insint(d, "INADDR_BROADCAST", 0xffffffff);
3338#endif
3339#ifdef INADDR_LOOPBACK
3340 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
3341#else
3342 insint(d, "INADDR_LOOPBACK", 0x7F000001);
3343#endif
3344#ifdef INADDR_UNSPEC_GROUP
3345 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
3346#else
3347 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
3348#endif
3349#ifdef INADDR_ALLHOSTS_GROUP
3350 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
3351#else
3352 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
3353#endif
3354#ifdef INADDR_MAX_LOCAL_GROUP
3355 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
3356#else
3357 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
3358#endif
3359#ifdef INADDR_NONE
3360 insint(d, "INADDR_NONE", INADDR_NONE);
3361#else
3362 insint(d, "INADDR_NONE", 0xffffffff);
3363#endif
3364
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003365 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003366#ifdef IP_OPTIONS
3367 insint(d, "IP_OPTIONS", IP_OPTIONS);
3368#endif
3369#ifdef IP_HDRINCL
3370 insint(d, "IP_HDRINCL", IP_HDRINCL);
3371#endif
3372#ifdef IP_TOS
3373 insint(d, "IP_TOS", IP_TOS);
3374#endif
3375#ifdef IP_TTL
3376 insint(d, "IP_TTL", IP_TTL);
3377#endif
3378#ifdef IP_RECVOPTS
3379 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
3380#endif
3381#ifdef IP_RECVRETOPTS
3382 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
3383#endif
3384#ifdef IP_RECVDSTADDR
3385 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
3386#endif
3387#ifdef IP_RETOPTS
3388 insint(d, "IP_RETOPTS", IP_RETOPTS);
3389#endif
3390#ifdef IP_MULTICAST_IF
3391 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
3392#endif
3393#ifdef IP_MULTICAST_TTL
3394 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
3395#endif
3396#ifdef IP_MULTICAST_LOOP
3397 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
3398#endif
3399#ifdef IP_ADD_MEMBERSHIP
3400 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
3401#endif
3402#ifdef IP_DROP_MEMBERSHIP
3403 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
3404#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003405#ifdef IP_DEFAULT_MULTICAST_TTL
3406 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
3407#endif
3408#ifdef IP_DEFAULT_MULTICAST_LOOP
3409 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
3410#endif
3411#ifdef IP_MAX_MEMBERSHIPS
3412 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
3413#endif
3414
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003415 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3416#ifdef IPV6_JOIN_GROUP
3417 insint(d, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
3418#endif
3419#ifdef IPV6_LEAVE_GROUP
3420 insint(d, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
3421#endif
3422#ifdef IPV6_MULTICAST_HOPS
3423 insint(d, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
3424#endif
3425#ifdef IPV6_MULTICAST_IF
3426 insint(d, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
3427#endif
3428#ifdef IPV6_MULTICAST_LOOP
3429 insint(d, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
3430#endif
3431#ifdef IPV6_UNICAST_HOPS
3432 insint(d, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
3433#endif
3434
Guido van Rossum09be4091999-08-09 14:40:40 +00003435 /* TCP options */
3436#ifdef TCP_NODELAY
3437 insint(d, "TCP_NODELAY", TCP_NODELAY);
3438#endif
3439#ifdef TCP_MAXSEG
3440 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
3441#endif
3442
3443 /* IPX options */
3444#ifdef IPX_TYPE
3445 insint(d, "IPX_TYPE", IPX_TYPE);
3446#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003447
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003448 /* get{addr,name}info parameters */
3449#ifdef EAI_ADDRFAMILY
3450 insint(d, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
3451#endif
3452#ifdef EAI_AGAIN
3453 insint(d, "EAI_AGAIN", EAI_AGAIN);
3454#endif
3455#ifdef EAI_BADFLAGS
3456 insint(d, "EAI_BADFLAGS", EAI_BADFLAGS);
3457#endif
3458#ifdef EAI_FAIL
3459 insint(d, "EAI_FAIL", EAI_FAIL);
3460#endif
3461#ifdef EAI_FAMILY
3462 insint(d, "EAI_FAMILY", EAI_FAMILY);
3463#endif
3464#ifdef EAI_MEMORY
3465 insint(d, "EAI_MEMORY", EAI_MEMORY);
3466#endif
3467#ifdef EAI_NODATA
3468 insint(d, "EAI_NODATA", EAI_NODATA);
3469#endif
3470#ifdef EAI_NONAME
3471 insint(d, "EAI_NONAME", EAI_NONAME);
3472#endif
3473#ifdef EAI_SERVICE
3474 insint(d, "EAI_SERVICE", EAI_SERVICE);
3475#endif
3476#ifdef EAI_SOCKTYPE
3477 insint(d, "EAI_SOCKTYPE", EAI_SOCKTYPE);
3478#endif
3479#ifdef EAI_SYSTEM
3480 insint(d, "EAI_SYSTEM", EAI_SYSTEM);
3481#endif
3482#ifdef EAI_BADHINTS
3483 insint(d, "EAI_BADHINTS", EAI_BADHINTS);
3484#endif
3485#ifdef EAI_PROTOCOL
3486 insint(d, "EAI_PROTOCOL", EAI_PROTOCOL);
3487#endif
3488#ifdef EAI_MAX
3489 insint(d, "EAI_MAX", EAI_MAX);
3490#endif
3491#ifdef AI_PASSIVE
3492 insint(d, "AI_PASSIVE", AI_PASSIVE);
3493#endif
3494#ifdef AI_CANONNAME
3495 insint(d, "AI_CANONNAME", AI_CANONNAME);
3496#endif
3497#ifdef AI_NUMERICHOST
3498 insint(d, "AI_NUMERICHOST", AI_NUMERICHOST);
3499#endif
3500#ifdef AI_MASK
3501 insint(d, "AI_MASK", AI_MASK);
3502#endif
3503#ifdef AI_ALL
3504 insint(d, "AI_ALL", AI_ALL);
3505#endif
3506#ifdef AI_V4MAPPED_CFG
3507 insint(d, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
3508#endif
3509#ifdef AI_ADDRCONFIG
3510 insint(d, "AI_ADDRCONFIG", AI_ADDRCONFIG);
3511#endif
3512#ifdef AI_V4MAPPED
3513 insint(d, "AI_V4MAPPED", AI_V4MAPPED);
3514#endif
3515#ifdef AI_DEFAULT
3516 insint(d, "AI_DEFAULT", AI_DEFAULT);
3517#endif
3518#ifdef NI_MAXHOST
3519 insint(d, "NI_MAXHOST", NI_MAXHOST);
3520#endif
3521#ifdef NI_MAXSERV
3522 insint(d, "NI_MAXSERV", NI_MAXSERV);
3523#endif
3524#ifdef NI_NOFQDN
3525 insint(d, "NI_NOFQDN", NI_NOFQDN);
3526#endif
3527#ifdef NI_NUMERICHOST
3528 insint(d, "NI_NUMERICHOST", NI_NUMERICHOST);
3529#endif
3530#ifdef NI_NAMEREQD
3531 insint(d, "NI_NAMEREQD", NI_NAMEREQD);
3532#endif
3533#ifdef NI_NUMERICSERV
3534 insint(d, "NI_NUMERICSERV", NI_NUMERICSERV);
3535#endif
3536#ifdef NI_DGRAM
3537 insint(d, "NI_DGRAM", NI_DGRAM);
3538#endif
3539
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003540 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003541#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003542 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003543#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003544}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003545
3546/* Simplistic emulation code for inet_pton that only works for IPv4 */
3547#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003548int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003549inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003550{
3551 if(af == AF_INET){
3552 long packed_addr;
3553#ifdef USE_GUSI1
3554 packed_addr = (long)inet_addr(src).s_addr;
3555#else
3556 packed_addr = inet_addr(src);
3557#endif
3558 if (packed_addr == INADDR_NONE)
3559 return 0;
3560 memcpy(dst, &packed_addr, 4);
3561 return 1;
3562 }
3563 /* Should set errno to EAFNOSUPPORT */
3564 return -1;
3565}
3566
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003567const char *
3568inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003569{
3570 if (af == AF_INET) {
3571 struct in_addr packed_addr;
3572 if (size < 16)
3573 /* Should set errno to ENOSPC. */
3574 return NULL;
3575 memcpy(&packed_addr, src, sizeof(packed_addr));
3576 return strncpy(dst, inet_ntoa(packed_addr), size);
3577 }
3578 /* Should set errno to EAFNOSUPPORT */
3579 return NULL;
3580}
3581#endif