blob: 7d1bb118837f698b2912f0ce6d959eb3456ba558 [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
285static PyObject *SSLErrorObject;
286#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
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000491typedef struct {
492 PyObject_HEAD
493 PySocketSockObject *Socket; /* Socket on which we're layered */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000494 SSL_CTX* ctx;
495 SSL* ssl;
496 X509* server_cert;
497 BIO* sbio;
498 char server[256];
499 char issuer[256];
500
501} SSLObject;
502
503staticforward PyTypeObject SSL_Type;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000504staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
505staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
506
507#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
508
509#endif /* USE_SSL */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000510
Guido van Rossum30a685f1991-06-27 15:51:29 +0000511/* A forward reference to the Socktype type object.
512 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000513 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000514 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000515
Guido van Rossum73624e91994-10-10 17:59:00 +0000516staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000517
Guido van Rossum30a685f1991-06-27 15:51:29 +0000518
519/* Create a new socket object.
520 This just creates the object and initializes it.
521 If the creation fails, return NULL and set an exception (implicit
522 in NEWOBJ()). */
523
Guido van Rossum73624e91994-10-10 17:59:00 +0000524static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000525PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000526{
Guido van Rossum48a680c2001-03-02 06:34:14 +0000527#ifdef RISCOS
528 int block = 1;
529#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000530 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000531 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000532 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000533 if (s != NULL) {
534 s->sock_fd = fd;
535 s->sock_family = family;
536 s->sock_type = type;
537 s->sock_proto = proto;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000538#ifdef RISCOS
539 if(taskwindow) {
540 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
541 }
542#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000543 }
544 return s;
545}
546
Guido van Rossum30a685f1991-06-27 15:51:29 +0000547
Guido van Rossum48a680c2001-03-02 06:34:14 +0000548/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000549 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000550#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000551PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000552#endif
553
554
Guido van Rossum30a685f1991-06-27 15:51:29 +0000555/* Convert a string specifying a host name or one of a few symbolic
556 names to a numeric IP address. This usually calls gethostbyname()
557 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000558 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000559 an error occurred; then an exception is raised. */
560
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000561static int
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000562setipaddr(char* name, struct sockaddr * addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000563{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000564 struct addrinfo hints, *res;
565 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000566
Guido van Rossuma376cc51996-12-05 23:43:35 +0000567 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000568 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000569 int siz;
570 memset(&hints, 0, sizeof(hints));
571 hints.ai_family = af;
572 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
573 hints.ai_flags = AI_PASSIVE;
574 error = getaddrinfo(NULL, "0", &hints, &res);
575 if (error) {
576 PyGAI_Err(error);
577 return -1;
578 }
579 switch (res->ai_family) {
580 case AF_INET:
581 siz = 4;
582 break;
583#ifdef INET6
584 case AF_INET6:
585 siz = 16;
586 break;
587#endif
588 default:
589 freeaddrinfo(res);
590 PyErr_SetString(PySocket_Error,
591 "unsupported address family");
592 return -1;
593 }
594 if (res->ai_next) {
595 PyErr_SetString(PySocket_Error,
596 "wildcard resolved to multiple address");
597 return -1;
598 }
599 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
600 freeaddrinfo(res);
601 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000602 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000603 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000604 struct sockaddr_in *sin;
605 if (af != PF_INET && af != PF_UNSPEC) {
606 PyErr_SetString(PySocket_Error,
607 "address family mismatched");
608 return -1;
609 }
610 sin = (struct sockaddr_in *)addr_ret;
611 memset((void *) sin, '\0', sizeof(*sin));
612 sin->sin_family = AF_INET;
613#ifdef HAVE_SOCKADDR_SA_LEN
614 sin->sin_len = sizeof(*sin);
615#endif
616 sin->sin_addr.s_addr = INADDR_BROADCAST;
617 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000618 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000619 memset(&hints, 0, sizeof(hints));
620 hints.ai_family = af;
621 error = getaddrinfo(name, NULL, &hints, &res);
622 if (error) {
623 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000624 return -1;
625 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000626 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
627 freeaddrinfo(res);
628 switch (addr_ret->sa_family) {
629 case AF_INET:
630 return 4;
631#ifdef INET6
632 case AF_INET6:
633 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000634#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000635 default:
636 PyErr_SetString(PySocket_Error, "unknown address family");
637 return -1;
638 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000639}
640
Guido van Rossum30a685f1991-06-27 15:51:29 +0000641
Guido van Rossum30a685f1991-06-27 15:51:29 +0000642/* Create a string object representing an IP address.
643 This is always a string of the form 'dd.dd.dd.dd' (with variable
644 size numbers). */
645
Guido van Rossum73624e91994-10-10 17:59:00 +0000646static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000647makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000648{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000649 char buf[NI_MAXHOST];
650 int error;
651
652 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
653 NI_NUMERICHOST);
654 if (error) {
655 PyGAI_Err(error);
656 return NULL;
657 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000658 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000659}
660
661
662/* Create an object representing the given socket address,
663 suitable for passing it back to bind(), connect() etc.
664 The family field of the sockaddr structure is inspected
665 to determine what kind of address it really is. */
666
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000667/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000668static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000669makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000670{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000671 if (addrlen == 0) {
672 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000673 Py_INCREF(Py_None);
674 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000675 }
676
Guido van Rossumbcc20741998-08-04 22:53:56 +0000677#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000678 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000679 addr->sa_family = AF_INET;
680#endif
681
Guido van Rossum30a685f1991-06-27 15:51:29 +0000682 switch (addr->sa_family) {
683
684 case AF_INET:
685 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000686 struct sockaddr_in *a;
687 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000688 PyObject *ret = NULL;
689 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000690 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000691 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
692 Py_DECREF(addrobj);
693 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000694 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000695 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000696
Guido van Rossumb6775db1994-08-01 11:34:53 +0000697#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000698 case AF_UNIX:
699 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000700 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000701 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000702 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000703#endif /* AF_UNIX */
704
705#ifdef INET6
706 case AF_INET6:
707 {
708 struct sockaddr_in6 *a;
709 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
710 PyObject *ret = NULL;
711 if (addrobj) {
712 a = (struct sockaddr_in6 *)addr;
713 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
714 a->sin6_flowinfo, a->sin6_scope_id);
715 Py_DECREF(addrobj);
716 }
717 return ret;
718 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000719#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000720
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000721#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000722 case AF_PACKET:
723 {
724 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
725 char *ifname = "";
726 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000727 /* need to look up interface name give index */
728 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000729 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000730 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000731 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000732 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000733 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000734 a->sll_pkttype, a->sll_hatype,
735 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000736 }
737#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000738
Guido van Rossum30a685f1991-06-27 15:51:29 +0000739 /* More cases here... */
740
741 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000742 /* If we don't know the address family, don't raise an
743 exception -- return it as a tuple. */
744 return Py_BuildValue("is#",
745 addr->sa_family,
746 addr->sa_data,
747 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000748
Guido van Rossum30a685f1991-06-27 15:51:29 +0000749 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000750}
751
Guido van Rossum30a685f1991-06-27 15:51:29 +0000752
753/* Parse a socket address argument according to the socket object's
754 address family. Return 1 if the address was in the proper format,
755 0 of not. The address is returned through addr_ret, its length
756 through len_ret. */
757
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000758static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000759getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000760 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000761{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000762 switch (s->sock_family) {
763
Guido van Rossumb6775db1994-08-01 11:34:53 +0000764#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000765 case AF_UNIX:
766 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000767 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000768 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000769 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000770 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000771 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000772 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000773 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000774 PyErr_SetString(PySocket_Error,
775 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000776 return 0;
777 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000778 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000779 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000780 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000781 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000782 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000783 return 1;
784 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000785#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000786
Guido van Rossum30a685f1991-06-27 15:51:29 +0000787 case AF_INET:
788 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000789 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000790 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000791 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000792 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000793 if (!PyTuple_Check(args)) {
794 PyErr_Format(PyExc_TypeError,
795 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
796 args->ob_type->tp_name);
797 return 0;
798 }
799 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000800 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000801 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000802 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000803 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000804 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000805 *addr_ret = (struct sockaddr *) addr;
806 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000807 return 1;
808 }
809
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000810#ifdef INET6
811 case AF_INET6:
812 {
813 struct sockaddr_in6* addr;
814 char *host;
815 int port, flowinfo, scope_id;
816 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
817 flowinfo = scope_id = 0;
818 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
819 &scope_id)) {
820 return 0;
821 }
822 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
823 return 0;
824 addr->sin6_family = s->sock_family;
825 addr->sin6_port = htons((short)port);
826 addr->sin6_flowinfo = flowinfo;
827 addr->sin6_scope_id = scope_id;
828 *addr_ret = (struct sockaddr *) addr;
829 *len_ret = sizeof *addr;
830 return 1;
831 }
832#endif
833
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000834#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000835 case AF_PACKET:
836 {
837 struct sockaddr_ll* addr;
838 struct ifreq ifr;
839 char *interfaceName;
840 int protoNumber;
841 int hatype = 0;
842 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000843 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000844
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000845 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
846 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000847 return 0;
848 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
849 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000850 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
851 PyErr_SetFromErrno(PySocket_Error);
Jeremy Hylton22308652001-02-02 03:23:09 +0000852 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000853 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000854 addr = &(s->sock_addr.ll);
855 addr->sll_family = AF_PACKET;
856 addr->sll_protocol = htons((short)protoNumber);
857 addr->sll_ifindex = ifr.ifr_ifindex;
858 addr->sll_pkttype = pkttype;
859 addr->sll_hatype = hatype;
860 *addr_ret = (struct sockaddr *) addr;
861 *len_ret = sizeof *addr;
862 return 1;
863 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000864#endif
865
Guido van Rossum30a685f1991-06-27 15:51:29 +0000866 /* More cases here... */
867
868 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000869 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000870 return 0;
871
872 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000873}
874
Guido van Rossum30a685f1991-06-27 15:51:29 +0000875
Guido van Rossum48a680c2001-03-02 06:34:14 +0000876/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000877 Return 1 if the family is known, 0 otherwise. The length is returned
878 through len_ret. */
879
880static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000881getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000882{
883 switch (s->sock_family) {
884
Guido van Rossumb6775db1994-08-01 11:34:53 +0000885#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000886 case AF_UNIX:
887 {
888 *len_ret = sizeof (struct sockaddr_un);
889 return 1;
890 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000891#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000892
893 case AF_INET:
894 {
895 *len_ret = sizeof (struct sockaddr_in);
896 return 1;
897 }
898
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000899#ifdef INET6
900 case AF_INET6:
901 {
902 *len_ret = sizeof (struct sockaddr_in6);
903 return 1;
904 }
905#endif
906
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000907#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000908 case AF_PACKET:
909 {
910 *len_ret = sizeof (struct sockaddr_ll);
911 return 1;
912 }
913#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000914
Guido van Rossum710e1df1992-06-12 10:39:36 +0000915 /* More cases here... */
916
917 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000918 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000919 return 0;
920
921 }
922}
923
924
Guido van Rossum30a685f1991-06-27 15:51:29 +0000925/* s.accept() method */
926
Guido van Rossum73624e91994-10-10 17:59:00 +0000927static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000928PySocketSock_accept(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000929{
930 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000931 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000932 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000933 PyObject *sock = NULL;
934 PyObject *addr = NULL;
935 PyObject *res = NULL;
936
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000937 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000938 return NULL;
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 *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000986PySocketSock_setblocking(PySocketSockObject *s, PyObject *args)
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
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000994 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000995 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000996 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000997#ifdef __BEOS__
998 block = !block;
999 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
1000 (void *)(&block), sizeof( int ) );
1001#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001002#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001003#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001004#ifdef PYOS_OS2
1005 block = !block;
1006 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
1007#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +00001008 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
1009 if (block)
1010 delay_flag &= (~O_NDELAY);
1011 else
1012 delay_flag |= O_NDELAY;
1013 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001014#endif /* !PYOS_OS2 */
1015#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001016 block = !block;
1017 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001018#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +00001019#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001020#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001021 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +00001022
Guido van Rossum73624e91994-10-10 17:59:00 +00001023 Py_INCREF(Py_None);
1024 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001025}
Guido van Rossume4485b01994-09-07 14:32:49 +00001026
Guido van Rossum82a5c661998-07-07 20:45:43 +00001027static char setblocking_doc[] =
1028"setblocking(flag)\n\
1029\n\
1030Set the socket to blocking (flag is true) or non-blocking (false).\n\
1031This uses the FIONBIO ioctl with the O_NDELAY flag.";
1032
Guido van Rossume4485b01994-09-07 14:32:49 +00001033
Guido van Rossum48a680c2001-03-02 06:34:14 +00001034#ifdef RISCOS
1035/* s.sleeptaskw(1 | 0) method */
1036
1037static PyObject *
1038PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
1039{
1040 int block;
1041 int delay_flag;
1042 if (!PyArg_GetInt(args, &block))
1043 return NULL;
1044 Py_BEGIN_ALLOW_THREADS
1045 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1046 Py_END_ALLOW_THREADS
1047
1048 Py_INCREF(Py_None);
1049 return Py_None;
1050}
1051static char sleeptaskw_doc[] =
1052"sleeptaskw(flag)\n\
1053\n\
1054Allow sleeps in taskwindows.";
1055#endif
1056
1057
Guido van Rossumaee08791992-09-08 09:05:33 +00001058/* s.setsockopt() method.
1059 With an integer third argument, sets an integer option.
1060 With a string third argument, sets an option from a buffer;
1061 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001062
Guido van Rossum73624e91994-10-10 17:59:00 +00001063static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001064PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001065{
1066 int level;
1067 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001068 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001069 char *buf;
1070 int buflen;
1071 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001072
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001073 if (PyArg_ParseTuple(args, "iii:setsockopt",
1074 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001075 buf = (char *) &flag;
1076 buflen = sizeof flag;
1077 }
1078 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001079 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001080 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1081 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001082 return NULL;
1083 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001084 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001085 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001086 return PySocket_Err();
1087 Py_INCREF(Py_None);
1088 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001089}
1090
Guido van Rossum82a5c661998-07-07 20:45:43 +00001091static char setsockopt_doc[] =
1092"setsockopt(level, option, value)\n\
1093\n\
1094Set a socket option. See the Unix manual for level and option.\n\
1095The value argument can either be an integer or a string.";
1096
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001097
Guido van Rossumaee08791992-09-08 09:05:33 +00001098/* s.getsockopt() method.
1099 With two arguments, retrieves an integer option.
1100 With a third integer argument, retrieves a string buffer of that size;
1101 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001102
Guido van Rossum73624e91994-10-10 17:59:00 +00001103static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001104PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001105{
1106 int level;
1107 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001108 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001109 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001110 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001111
Guido van Rossumbcc20741998-08-04 22:53:56 +00001112#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001113 /* We have incomplete socket support. */
1114 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001115 return NULL;
1116#else
1117
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001118 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1119 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001120 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001121
Guido van Rossumbe32c891996-06-20 16:25:29 +00001122 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001123 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001124 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001125 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001126 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001127 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001128 return PySocket_Err();
1129 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001130 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001131 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001132 PyErr_SetString(PySocket_Error,
1133 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001134 return NULL;
1135 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001136 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001137 if (buf == NULL)
1138 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001139 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001140 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001141 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001142 Py_DECREF(buf);
1143 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +00001144 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001145 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001146 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001147#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001148}
1149
Guido van Rossum82a5c661998-07-07 20:45:43 +00001150static char getsockopt_doc[] =
1151"getsockopt(level, option[, buffersize]) -> value\n\
1152\n\
1153Get a socket option. See the Unix manual for level and option.\n\
1154If a nonzero buffersize argument is given, the return value is a\n\
1155string of that length; otherwise it is an integer.";
1156
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001157
Fred Drake728819a2000-07-01 03:40:12 +00001158/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001159
Guido van Rossum73624e91994-10-10 17:59:00 +00001160static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001161PySocketSock_bind(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001162{
1163 struct sockaddr *addr;
1164 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001165 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001166 PyObject *addro;
1167 if (!PyArg_ParseTuple(args, "O:bind", &addro))
1168 return NULL;
1169 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001170 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001171 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001172 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001173 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001174 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001175 return PySocket_Err();
1176 Py_INCREF(Py_None);
1177 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001178}
1179
Guido van Rossum82a5c661998-07-07 20:45:43 +00001180static char bind_doc[] =
1181"bind(address)\n\
1182\n\
1183Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001184pair (host, port); the host must refer to the local host. For raw packet\n\
1185sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001186
Guido van Rossum30a685f1991-06-27 15:51:29 +00001187
1188/* s.close() method.
1189 Set the file descriptor to -1 so operations tried subsequently
1190 will surely fail. */
1191
Guido van Rossum73624e91994-10-10 17:59:00 +00001192static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001193PySocketSock_close(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001194{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001195 SOCKET_T fd;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001196 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001197 return NULL;
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001198 if ((fd = s->sock_fd) != -1) {
1199 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001200 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001201 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001202 Py_END_ALLOW_THREADS
1203 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001204 Py_INCREF(Py_None);
1205 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001206}
1207
Guido van Rossum82a5c661998-07-07 20:45:43 +00001208static char close_doc[] =
1209"close()\n\
1210\n\
1211Close the socket. It cannot be used after this call.";
1212
Guido van Rossum30a685f1991-06-27 15:51:29 +00001213
Fred Drake728819a2000-07-01 03:40:12 +00001214/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001215
Guido van Rossum73624e91994-10-10 17:59:00 +00001216static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001217PySocketSock_connect(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001218{
1219 struct sockaddr *addr;
1220 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001221 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001222 PyObject *addro;
1223 if (!PyArg_ParseTuple(args, "O:connect", &addro))
1224 return NULL;
1225 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001226 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001227 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001228 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001229 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001230 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001231 return PySocket_Err();
1232 Py_INCREF(Py_None);
1233 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001234}
1235
Guido van Rossum82a5c661998-07-07 20:45:43 +00001236static char connect_doc[] =
1237"connect(address)\n\
1238\n\
1239Connect the socket to a remote address. For IP sockets, the address\n\
1240is a pair (host, port).";
1241
Guido van Rossum30a685f1991-06-27 15:51:29 +00001242
Fred Drake728819a2000-07-01 03:40:12 +00001243/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001244
1245static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001246PySocketSock_connect_ex(PySocketSockObject *s, PyObject *args)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001247{
1248 struct sockaddr *addr;
1249 int addrlen;
1250 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001251 PyObject *addro;
1252 if (!PyArg_ParseTuple(args, "O:connect_ex", &addro))
1253 return NULL;
1254 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001255 return NULL;
1256 Py_BEGIN_ALLOW_THREADS
1257 res = connect(s->sock_fd, addr, addrlen);
1258 Py_END_ALLOW_THREADS
1259 if (res != 0)
1260 res = errno;
1261 return PyInt_FromLong((long) res);
1262}
1263
Guido van Rossum82a5c661998-07-07 20:45:43 +00001264static char connect_ex_doc[] =
1265"connect_ex(address)\n\
1266\n\
1267This is like connect(address), but returns an error code (the errno value)\n\
1268instead of raising an exception when an error occurs.";
1269
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001270
Guido van Rossumed233a51992-06-23 09:07:03 +00001271/* s.fileno() method */
1272
Guido van Rossum73624e91994-10-10 17:59:00 +00001273static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001274PySocketSock_fileno(PySocketSockObject *s, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +00001275{
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001276 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +00001277 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +00001278#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001279 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001280#else
1281 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1282#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001283}
1284
Guido van Rossum82a5c661998-07-07 20:45:43 +00001285static char fileno_doc[] =
1286"fileno() -> integer\n\
1287\n\
1288Return the integer file descriptor of the socket.";
1289
Guido van Rossumed233a51992-06-23 09:07:03 +00001290
Guido van Rossumbe32c891996-06-20 16:25:29 +00001291#ifndef NO_DUP
1292/* s.dup() method */
1293
1294static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001295PySocketSock_dup(PySocketSockObject *s, PyObject *args)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001296{
Fred Drakea04eaad2000-06-30 02:46:07 +00001297 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001298 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001299 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001300 return NULL;
1301 newfd = dup(s->sock_fd);
1302 if (newfd < 0)
1303 return PySocket_Err();
1304 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001305 s->sock_family,
1306 s->sock_type,
1307 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001308 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001309 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001310 return sock;
1311}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001312
1313static char dup_doc[] =
1314"dup() -> socket object\n\
1315\n\
1316Return a new socket object connected to the same system resource.";
1317
Guido van Rossumbe32c891996-06-20 16:25:29 +00001318#endif
1319
1320
Guido van Rossumc89705d1992-11-26 08:54:07 +00001321/* s.getsockname() method */
1322
Guido van Rossum73624e91994-10-10 17:59:00 +00001323static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001324PySocketSock_getsockname(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001325{
1326 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001327 int res;
1328 socklen_t addrlen;
1329
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001330 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001331 return NULL;
1332 if (!getsockaddrlen(s, &addrlen))
1333 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001334 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001335 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001336 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001337 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001338 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001339 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001340 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001341}
1342
Guido van Rossum82a5c661998-07-07 20:45:43 +00001343static char getsockname_doc[] =
1344"getsockname() -> address info\n\
1345\n\
1346Return the address of the local endpoint. For IP sockets, the address\n\
1347info is a pair (hostaddr, port).";
1348
Guido van Rossumc89705d1992-11-26 08:54:07 +00001349
Guido van Rossumb6775db1994-08-01 11:34:53 +00001350#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001351/* s.getpeername() method */
1352
Guido van Rossum73624e91994-10-10 17:59:00 +00001353static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001354PySocketSock_getpeername(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001355{
1356 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001357 int res;
1358 socklen_t addrlen;
1359
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001360 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001361 return NULL;
1362 if (!getsockaddrlen(s, &addrlen))
1363 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001364 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001365 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001366 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001367 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001368 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001369 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001370 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001371}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001372
1373static char getpeername_doc[] =
1374"getpeername() -> address info\n\
1375\n\
1376Return the address of the remote endpoint. For IP sockets, the address\n\
1377info is a pair (hostaddr, port).";
1378
Guido van Rossumb6775db1994-08-01 11:34:53 +00001379#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001380
1381
Guido van Rossum30a685f1991-06-27 15:51:29 +00001382/* s.listen(n) method */
1383
Guido van Rossum73624e91994-10-10 17:59:00 +00001384static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001385PySocketSock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001386{
1387 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001388 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001389 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001390 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001391 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001392 if (backlog < 1)
1393 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001394 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001395 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001396 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001397 return PySocket_Err();
1398 Py_INCREF(Py_None);
1399 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001400}
1401
Guido van Rossum82a5c661998-07-07 20:45:43 +00001402static char listen_doc[] =
1403"listen(backlog)\n\
1404\n\
1405Enable a server to accept connections. The backlog argument must be at\n\
1406least 1; it specifies the number of unaccepted connection that the system\n\
1407will allow before refusing new connections.";
1408
1409
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001410#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001411/* s.makefile(mode) method.
1412 Create a new open file object referring to a dupped version of
1413 the socket's file descriptor. (The dup() call is necessary so
1414 that the open file and socket objects may be closed independent
1415 of each other.)
1416 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1417
Guido van Rossum73624e91994-10-10 17:59:00 +00001418static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001419PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001420{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001421 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001422 char *mode = "r";
1423 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001424#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001425 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001426#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001427 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001428#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001429 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001430 PyObject *f;
1431
Guido van Rossum43713e52000-02-29 13:59:29 +00001432 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001433 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001434#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001435 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1436 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001437#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001438 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001439#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001440 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001441 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001442 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001443 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001444 }
1445 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1446 if (f != NULL)
1447 PyFile_SetBufSize(f, bufsize);
1448 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001449}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001450
1451static char makefile_doc[] =
1452"makefile([mode[, buffersize]]) -> file object\n\
1453\n\
1454Return a regular file object corresponding to the socket.\n\
1455The mode and buffersize arguments are as for the built-in open() function.";
1456
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001457#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001458
Guido van Rossum48a680c2001-03-02 06:34:14 +00001459
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001460/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001461
Guido van Rossum73624e91994-10-10 17:59:00 +00001462static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001463PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001464{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001465 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001466 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001467 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001468 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001469 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001470 if (buf == NULL)
1471 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001472 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001473 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001474 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001475 if (n < 0) {
1476 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001477 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001478 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001479 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001480 return NULL;
1481 return buf;
1482}
1483
Guido van Rossum82a5c661998-07-07 20:45:43 +00001484static char recv_doc[] =
1485"recv(buffersize[, flags]) -> data\n\
1486\n\
1487Receive up to buffersize bytes from the socket. For the optional flags\n\
1488argument, see the Unix manual. When no data is available, block until\n\
1489at least one byte is available or until the remote end is closed. When\n\
1490the remote end is closed and all data is read, return the empty string.";
1491
Guido van Rossum30a685f1991-06-27 15:51:29 +00001492
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001493/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001494
Guido van Rossum73624e91994-10-10 17:59:00 +00001495static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001496PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001497{
1498 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001499 PyObject *buf = NULL;
1500 PyObject *addr = NULL;
1501 PyObject *ret = NULL;
1502
Guido van Rossumff3ab422000-04-24 15:16:03 +00001503 int len, n, flags = 0;
1504 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001505 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001506 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001507 if (!getsockaddrlen(s, &addrlen))
1508 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001509 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001510 if (buf == NULL)
1511 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001512 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001513 memset(addrbuf, 0, addrlen);
1514 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001515#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001516#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001517 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001518#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001519 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001520#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001521#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001522 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001523#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001524 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001525 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001526 if (n < 0) {
1527 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001528 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001529 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001530 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001531 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001532
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001533 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001534 goto finally;
1535
Guido van Rossum73624e91994-10-10 17:59:00 +00001536 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001537 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001538 Py_XDECREF(addr);
1539 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001540 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001541}
1542
Guido van Rossum82a5c661998-07-07 20:45:43 +00001543static char recvfrom_doc[] =
1544"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1545\n\
1546Like recv(buffersize, flags) but also return the sender's address info.";
1547
Guido van Rossum30a685f1991-06-27 15:51:29 +00001548
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001549/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001550
Guido van Rossum73624e91994-10-10 17:59:00 +00001551static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001552PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001553{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001554 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001555 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001556 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001557 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001558 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001559 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001560 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001561 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001562 return PySocket_Err();
1563 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001564}
1565
Guido van Rossum82a5c661998-07-07 20:45:43 +00001566static char send_doc[] =
1567"send(data[, flags])\n\
1568\n\
1569Send a data string to the socket. For the optional flags\n\
1570argument, see the Unix manual.";
1571
Guido van Rossum30a685f1991-06-27 15:51:29 +00001572
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001573/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001574
Guido van Rossum73624e91994-10-10 17:59:00 +00001575static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001576PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001577{
Guido van Rossum73624e91994-10-10 17:59:00 +00001578 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001579 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001580 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001581 int addrlen, len, n, flags;
1582 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001583 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001584 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001585 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1586 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001587 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001588 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001589 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001590 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001591 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001592 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001593 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001594 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001595 return PySocket_Err();
1596 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001597}
1598
Guido van Rossum82a5c661998-07-07 20:45:43 +00001599static char sendto_doc[] =
1600"sendto(data[, flags], address)\n\
1601\n\
1602Like send(data, flags) but allows specifying the destination address.\n\
1603For IP sockets, the address is a pair (hostaddr, port).";
1604
Guido van Rossum30a685f1991-06-27 15:51:29 +00001605
1606/* s.shutdown(how) method */
1607
Guido van Rossum73624e91994-10-10 17:59:00 +00001608static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001609PySocketSock_shutdown(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001610{
1611 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001612 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001613 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001614 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001615 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001616 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001617 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001618 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001619 return PySocket_Err();
1620 Py_INCREF(Py_None);
1621 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001622}
1623
Guido van Rossum82a5c661998-07-07 20:45:43 +00001624static char shutdown_doc[] =
1625"shutdown(flag)\n\
1626\n\
1627Shut down the reading side of the socket (flag == 0), the writing side\n\
1628of the socket (flag == 1), or both ends (flag == 2).";
1629
Guido van Rossum30a685f1991-06-27 15:51:29 +00001630
1631/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001632
Guido van Rossum73624e91994-10-10 17:59:00 +00001633static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001634 {"accept", (PyCFunction)PySocketSock_accept, METH_VARARGS,
1635 accept_doc},
1636 {"bind", (PyCFunction)PySocketSock_bind, METH_VARARGS,
1637 bind_doc},
1638 {"close", (PyCFunction)PySocketSock_close, METH_VARARGS,
1639 close_doc},
1640 {"connect", (PyCFunction)PySocketSock_connect, METH_VARARGS,
1641 connect_doc},
1642 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_VARARGS,
1643 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001644#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001645 {"dup", (PyCFunction)PySocketSock_dup, METH_VARARGS,
1646 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001647#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001648 {"fileno", (PyCFunction)PySocketSock_fileno, METH_VARARGS,
1649 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001650#ifdef HAVE_GETPEERNAME
Guido van Rossum48a680c2001-03-02 06:34:14 +00001651 {"getpeername", (PyCFunction)PySocketSock_getpeername, METH_VARARGS,
1652 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001653#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001654 {"getsockname", (PyCFunction)PySocketSock_getsockname, METH_VARARGS,
1655 getsockname_doc},
1656 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1657 getsockopt_doc},
1658 {"listen", (PyCFunction)PySocketSock_listen, METH_VARARGS,
1659 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001660#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001661 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1662 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001663#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001664 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1665 recv_doc},
1666 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1667 recvfrom_doc},
1668 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1669 send_doc},
1670 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1671 sendto_doc},
1672 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_VARARGS,
1673 setblocking_doc},
1674 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1675 setsockopt_doc},
1676 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_VARARGS,
1677 shutdown_doc},
1678#ifdef RISCOS
1679 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1680 sleeptaskw_doc},
1681#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001682 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001683};
1684
Guido van Rossum30a685f1991-06-27 15:51:29 +00001685
Guido van Rossum73624e91994-10-10 17:59:00 +00001686/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001687 First close the file description. */
1688
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001689static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001690PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001691{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001692 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001693 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001694 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001695}
1696
Guido van Rossum30a685f1991-06-27 15:51:29 +00001697
1698/* Return a socket object's named attribute. */
1699
Guido van Rossum73624e91994-10-10 17:59:00 +00001700static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001701PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001702{
Guido van Rossum73624e91994-10-10 17:59:00 +00001703 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001704}
1705
Guido van Rossum30a685f1991-06-27 15:51:29 +00001706
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001707static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001708PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001709{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001710 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001711#if SIZEOF_SOCKET_T > SIZEOF_LONG
1712 if (s->sock_fd > LONG_MAX) {
1713 /* this can occur on Win64, and actually there is a special
1714 ugly printf formatter for decimal pointer length integer
1715 printing, only bother if necessary*/
1716 PyErr_SetString(PyExc_OverflowError,
1717 "no printf formatter to display the socket descriptor in decimal");
1718 return NULL;
1719 }
1720#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001721 sprintf(buf,
1722 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001723 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001724 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001725}
1726
1727
Guido van Rossumb6775db1994-08-01 11:34:53 +00001728/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001729
Guido van Rossum73624e91994-10-10 17:59:00 +00001730static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001731 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001732 0,
1733 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001734 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001735 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001736 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001737 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001738 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001739 0, /*tp_setattr*/
1740 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001741 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001742 0, /*tp_as_number*/
1743 0, /*tp_as_sequence*/
1744 0, /*tp_as_mapping*/
1745};
1746
Guido van Rossum30a685f1991-06-27 15:51:29 +00001747
Guido van Rossum81194471991-07-27 21:42:02 +00001748/* Python interface to gethostname(). */
1749
1750/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001751static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001752PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001753{
1754 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001755 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001756 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001757 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001758 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001759 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001760 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001761 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001762 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001763 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001764 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001765}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001766
Guido van Rossum82a5c661998-07-07 20:45:43 +00001767static char gethostname_doc[] =
1768"gethostname() -> string\n\
1769\n\
1770Return the current host name.";
1771
Guido van Rossumff4949e1992-08-05 19:58:53 +00001772
Guido van Rossum30a685f1991-06-27 15:51:29 +00001773/* Python interface to gethostbyname(name). */
1774
1775/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001776static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001777PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001778{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001779 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001780 struct sockaddr_storage addrbuf;
1781
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001782 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001783 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001784 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001785 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001786 return makeipaddr((struct sockaddr *)&addrbuf,
1787 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001788}
1789
Guido van Rossum82a5c661998-07-07 20:45:43 +00001790static char gethostbyname_doc[] =
1791"gethostbyname(host) -> address\n\
1792\n\
1793Return the IP address (a string of the form '255.255.255.255') for a host.";
1794
1795
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001796/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1797
1798static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001799gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001800{
1801 char **pch;
1802 PyObject *rtn_tuple = (PyObject *)NULL;
1803 PyObject *name_list = (PyObject *)NULL;
1804 PyObject *addr_list = (PyObject *)NULL;
1805 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001806
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001807 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001808 /* Let's get real error message to return */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001809 PyH_Err(h_errno);
1810 return NULL;
1811 }
1812 if (h->h_addrtype != af) {
1813#ifdef HAVE_STRERROR
1814 /* Let's get real error message to return */
1815 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001816#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001817 PyErr_SetString(PySocket_Error,
1818 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001819#endif
1820 return NULL;
1821 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001822 switch (af) {
1823 case AF_INET:
1824 if (alen < sizeof(struct sockaddr_in))
1825 return NULL;
1826 break;
1827#ifdef INET6
1828 case AF_INET6:
1829 if (alen < sizeof(struct sockaddr_in6))
1830 return NULL;
1831 break;
1832#endif
1833 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001834 if ((name_list = PyList_New(0)) == NULL)
1835 goto err;
1836 if ((addr_list = PyList_New(0)) == NULL)
1837 goto err;
1838 for (pch = h->h_aliases; *pch != NULL; pch++) {
1839 int status;
1840 tmp = PyString_FromString(*pch);
1841 if (tmp == NULL)
1842 goto err;
1843 status = PyList_Append(name_list, tmp);
1844 Py_DECREF(tmp);
1845 if (status)
1846 goto err;
1847 }
1848 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1849 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001850 switch (af) {
1851 case AF_INET:
1852 {
1853 struct sockaddr_in sin;
1854 memset(&sin, 0, sizeof(sin));
1855 sin.sin_family = af;
1856#ifdef HAVE_SOCKADDR_SA_LEN
1857 sin.sin_len = sizeof(sin);
1858#endif
1859 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
1860 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
1861 if (pch == h->h_addr_list && alen >= sizeof(sin))
1862 memcpy((char *) addr, &sin, sizeof(sin));
1863 break;
1864 }
1865#ifdef INET6
1866 case AF_INET6:
1867 {
1868 struct sockaddr_in6 sin6;
1869 memset(&sin6, 0, sizeof(sin6));
1870 sin6.sin6_family = af;
1871#ifdef HAVE_SOCKADDR_SA_LEN
1872 sin6.sin6_len = sizeof(sin6);
1873#endif
1874 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
1875 tmp = makeipaddr((struct sockaddr *)&sin6,
1876 sizeof(sin6));
1877 if (pch == h->h_addr_list && alen >= sizeof(sin6))
1878 memcpy((char *) addr, &sin6, sizeof(sin6));
1879 break;
1880 }
1881#endif
1882 default: /* can't happen */
1883 PyErr_SetString(PySocket_Error,
1884 "unsupported address family");
1885 return NULL;
1886 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001887 if (tmp == NULL)
1888 goto err;
1889 status = PyList_Append(addr_list, tmp);
1890 Py_DECREF(tmp);
1891 if (status)
1892 goto err;
1893 }
1894 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1895 err:
1896 Py_XDECREF(name_list);
1897 Py_XDECREF(addr_list);
1898 return rtn_tuple;
1899}
1900
1901
1902/* Python interface to gethostbyname_ex(name). */
1903
1904/*ARGSUSED*/
1905static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001906PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001907{
1908 char *name;
1909 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001910 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001911 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00001912 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001913#ifdef HAVE_GETHOSTBYNAME_R
1914 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001915#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1916 struct hostent_data data;
1917#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001918 char buf[16384];
1919 int buf_len = (sizeof buf) - 1;
1920 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001921#endif
1922#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001923 int result;
1924#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001925#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001926
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001927 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001928 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001929 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001930 return NULL;
1931 Py_BEGIN_ALLOW_THREADS
1932#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001933#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001934 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001935#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001936 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001937#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001938 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001939 result = gethostbyname_r(name, &hp_allocated, &data);
1940 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001941#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001942#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001943#ifdef USE_GETHOSTBYNAME_LOCK
1944 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001945#endif
1946 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001947#endif /* HAVE_GETHOSTBYNAME_R */
1948 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001949 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
1950 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
1951 sa = (struct sockaddr*)&addr;
1952 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00001953#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001954 PyThread_release_lock(gethostbyname_lock);
1955#endif
1956 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001957}
1958
1959static char ghbn_ex_doc[] =
1960"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1961\n\
1962Return the true host name, a list of aliases, and a list of IP addresses,\n\
1963for a host. The host argument is a string giving a host name or IP number.";
1964
1965
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001966/* Python interface to gethostbyaddr(IP). */
1967
1968/*ARGSUSED*/
1969static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001970PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001971{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001972#ifdef INET6
1973 struct sockaddr_storage addr;
1974#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001975 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001976#endif
1977 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001978 char *ip_num;
1979 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001980 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001981#ifdef HAVE_GETHOSTBYNAME_R
1982 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001983#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1984 struct hostent_data data;
1985#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001986 char buf[16384];
1987 int buf_len = (sizeof buf) - 1;
1988 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001989#endif
1990#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001991 int result;
1992#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001993#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001994 char *ap;
1995 int al;
1996 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001997
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001998 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001999 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002000 af = PF_UNSPEC;
2001 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002002 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002003 af = sa->sa_family;
2004 ap = NULL;
2005 al = 0;
2006 switch (af) {
2007 case AF_INET:
2008 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2009 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2010 break;
2011#ifdef INET6
2012 case AF_INET6:
2013 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2014 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2015 break;
2016#endif
2017 default:
2018 PyErr_SetString(PySocket_Error, "unsupported address family");
2019 return NULL;
2020 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002021 Py_BEGIN_ALLOW_THREADS
2022#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002023#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002024 result = gethostbyaddr_r(ap, al, af,
2025 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002026 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002027#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002028 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002029 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002030#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002031 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002032 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002033 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002034#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002035#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002036#ifdef USE_GETHOSTBYNAME_LOCK
2037 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002038#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002039 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002040#endif /* HAVE_GETHOSTBYNAME_R */
2041 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002042 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002043#ifdef USE_GETHOSTBYNAME_LOCK
2044 PyThread_release_lock(gethostbyname_lock);
2045#endif
2046 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002047}
2048
Guido van Rossum82a5c661998-07-07 20:45:43 +00002049static char gethostbyaddr_doc[] =
2050"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2051\n\
2052Return the true host name, a list of aliases, and a list of IP addresses,\n\
2053for a host. The host argument is a string giving a host name or IP number.";
2054
Guido van Rossum30a685f1991-06-27 15:51:29 +00002055
2056/* Python interface to getservbyname(name).
2057 This only returns the port number, since the other info is already
2058 known or not useful (like the list of aliases). */
2059
2060/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002061static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002062PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002063{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002064 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002065 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002066 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002067 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002068 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002069 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002070 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002071 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002072 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002073 return NULL;
2074 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002075 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002076}
2077
Guido van Rossum82a5c661998-07-07 20:45:43 +00002078static char getservbyname_doc[] =
2079"getservbyname(servicename, protocolname) -> integer\n\
2080\n\
2081Return a port number from a service name and protocol name.\n\
2082The protocol name should be 'tcp' or 'udp'.";
2083
Guido van Rossum30a685f1991-06-27 15:51:29 +00002084
Guido van Rossum3901d851996-12-19 16:35:04 +00002085/* Python interface to getprotobyname(name).
2086 This only returns the protocol number, since the other info is
2087 already known or not useful (like the list of aliases). */
2088
2089/*ARGSUSED*/
2090static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002091PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002092{
2093 char *name;
2094 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002095#ifdef __BEOS__
2096/* Not available in BeOS yet. - [cjh] */
2097 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2098 return NULL;
2099#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002100 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002101 return NULL;
2102 Py_BEGIN_ALLOW_THREADS
2103 sp = getprotobyname(name);
2104 Py_END_ALLOW_THREADS
2105 if (sp == NULL) {
2106 PyErr_SetString(PySocket_Error, "protocol not found");
2107 return NULL;
2108 }
2109 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002110#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002111}
2112
Guido van Rossum82a5c661998-07-07 20:45:43 +00002113static char getprotobyname_doc[] =
2114"getprotobyname(name) -> integer\n\
2115\n\
2116Return the protocol number for the named protocol. (Rarely used.)";
2117
Guido van Rossum3901d851996-12-19 16:35:04 +00002118
Guido van Rossum30a685f1991-06-27 15:51:29 +00002119/* Python interface to socket(family, type, proto).
2120 The third (protocol) argument is optional.
2121 Return a new socket object. */
2122
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002123/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002124static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002125PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002126{
Guido van Rossum73624e91994-10-10 17:59:00 +00002127 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002128 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002129 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00002130 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002131 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002132 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002133 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002134 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00002135#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002136 if (fd == INVALID_SOCKET)
2137#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002138 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002139#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002140 return PySocket_Err();
2141 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002142 /* If the object can't be created, don't forget to close the
2143 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002144 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002145 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00002146 /* From now on, ignore SIGPIPE and let the error checking
2147 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002148#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00002149 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002150#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002151 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002152}
2153
Guido van Rossum82a5c661998-07-07 20:45:43 +00002154static char socket_doc[] =
2155"socket(family, type[, proto]) -> socket object\n\
2156\n\
2157Open a socket of the given type. The family argument specifies the\n\
2158address family; it is normally AF_INET, sometimes AF_UNIX.\n\
2159The type argument specifies whether this is a stream (SOCK_STREAM)\n\
2160or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
2161specifying the default protocol.";
2162
2163
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002164#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002165/* Create a socket object from a numeric file description.
2166 Useful e.g. if stdin is a socket.
2167 Additional arguments as for socket(). */
2168
2169/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002170static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002171PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002172{
Guido van Rossum73624e91994-10-10 17:59:00 +00002173 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002174 SOCKET_T fd;
2175 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002176 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2177 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002178 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002179 /* Dup the fd so it and the socket can be closed independently */
2180 fd = dup(fd);
2181 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002182 return PySocket_Err();
2183 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002184 /* From now on, ignore SIGPIPE and let the error checking
2185 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002186#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002187 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002188#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002189 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002190}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002191
2192static char fromfd_doc[] =
2193"fromfd(fd, family, type[, proto]) -> socket object\n\
2194\n\
2195Create a socket object from the given file descriptor.\n\
2196The remaining arguments are the same as for socket().";
2197
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002198#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002199
Guido van Rossum82a5c661998-07-07 20:45:43 +00002200
Guido van Rossum006bf911996-06-12 04:04:55 +00002201static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002202PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002203{
2204 int x1, x2;
2205
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002206 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002207 return NULL;
2208 }
2209 x2 = (int)ntohs((short)x1);
2210 return PyInt_FromLong(x2);
2211}
2212
Guido van Rossum82a5c661998-07-07 20:45:43 +00002213static char ntohs_doc[] =
2214"ntohs(integer) -> integer\n\
2215\n\
2216Convert a 16-bit integer from network to host byte order.";
2217
2218
Guido van Rossum006bf911996-06-12 04:04:55 +00002219static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002220PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002221{
2222 int x1, x2;
2223
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002224 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002225 return NULL;
2226 }
2227 x2 = ntohl(x1);
2228 return PyInt_FromLong(x2);
2229}
2230
Guido van Rossum82a5c661998-07-07 20:45:43 +00002231static char ntohl_doc[] =
2232"ntohl(integer) -> integer\n\
2233\n\
2234Convert a 32-bit integer from network to host byte order.";
2235
2236
Guido van Rossum006bf911996-06-12 04:04:55 +00002237static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002238PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002239{
2240 int x1, x2;
2241
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002242 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002243 return NULL;
2244 }
2245 x2 = (int)htons((short)x1);
2246 return PyInt_FromLong(x2);
2247}
2248
Guido van Rossum82a5c661998-07-07 20:45:43 +00002249static char htons_doc[] =
2250"htons(integer) -> integer\n\
2251\n\
2252Convert a 16-bit integer from host to network byte order.";
2253
2254
Guido van Rossum006bf911996-06-12 04:04:55 +00002255static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002256PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002257{
2258 int x1, x2;
2259
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002260 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002261 return NULL;
2262 }
2263 x2 = htonl(x1);
2264 return PyInt_FromLong(x2);
2265}
2266
Guido van Rossum82a5c661998-07-07 20:45:43 +00002267static char htonl_doc[] =
2268"htonl(integer) -> integer\n\
2269\n\
2270Convert a 32-bit integer from host to network byte order.";
2271
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002272/*
2273 * socket.inet_aton() and socket.inet_ntoa() functions
2274 *
2275 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2276 *
2277 */
2278
Guido van Rossum48a680c2001-03-02 06:34:14 +00002279static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002280"inet_aton(string) -> packed 32-bit IP representation\n\
2281\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002282Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002283binary format used in low-level network functions.";
2284
2285static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002286PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002287{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002288#ifndef INADDR_NONE
2289#define INADDR_NONE (-1)
2290#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002291
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002292 /* Have to use inet_addr() instead */
2293 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002294 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002295
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002296 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002297 return NULL;
2298 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002299#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002300 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002301#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002302 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002303#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002304
2305 if (packed_addr == INADDR_NONE) { /* invalid address */
2306 PyErr_SetString(PySocket_Error,
2307 "illegal IP address string passed to inet_aton");
2308 return NULL;
2309 }
2310
2311 return PyString_FromStringAndSize((char *) &packed_addr,
2312 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002313}
2314
Guido van Rossum48a680c2001-03-02 06:34:14 +00002315static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002316"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002317\n\
2318Convert an IP address from 32-bit packed binary format to string format";
2319
2320static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002321PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002322{
2323 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002324 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002325 struct in_addr packed_addr;
2326
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002327 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002328 return NULL;
2329 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002330
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002331 if (addr_len != sizeof(packed_addr)) {
2332 PyErr_SetString(PySocket_Error,
2333 "packed IP wrong length for inet_ntoa");
2334 return NULL;
2335 }
2336
2337 memcpy(&packed_addr, packed_str, addr_len);
2338
2339 return PyString_FromString(inet_ntoa(packed_addr));
2340}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002341
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002342/* Python interface to getaddrinfo(host, port). */
2343
2344/*ARGSUSED*/
2345static PyObject *
2346PySocket_getaddrinfo(PyObject *self, PyObject *args)
2347{
2348 struct addrinfo hints, *res0, *res;
2349 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002350 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002351 char *hptr, *pptr;
2352 int family, socktype, protocol, flags;
2353 int error;
2354 PyObject *all = (PyObject *)NULL;
2355 PyObject *single = (PyObject *)NULL;
2356
2357 family = socktype = protocol = flags = 0;
2358 family = PF_UNSPEC;
2359 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2360 &hptr, &pobj, &family, &socktype,
2361 &protocol, &flags)) {
2362 return NULL;
2363 }
2364 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002365 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002366 pptr = pbuf;
2367 } else if (PyString_Check(pobj)) {
2368 pptr = PyString_AsString(pobj);
2369 } else if (pobj == Py_None) {
2370 pptr = (char *)NULL;
2371 } else {
2372 PyErr_SetString(PySocket_Error, "Int or String expected");
2373 return NULL;
2374 }
2375 memset(&hints, 0, sizeof(hints));
2376 hints.ai_family = family;
2377 hints.ai_socktype = socktype;
2378 hints.ai_protocol = protocol;
2379 hints.ai_flags = flags;
2380 error = getaddrinfo(hptr, pptr, &hints, &res0);
2381 if (error) {
2382 PyGAI_Err(error);
2383 return NULL;
2384 }
2385
2386 if ((all = PyList_New(0)) == NULL)
2387 goto err;
2388 for (res = res0; res; res = res->ai_next) {
2389 single = Py_BuildValue("iiisO", res->ai_family,
2390 res->ai_socktype, res->ai_protocol,
2391 res->ai_canonname ? res->ai_canonname : "",
2392 makesockaddr(-1, res->ai_addr, res->ai_addrlen));
2393 if (single == NULL)
2394 goto err;
2395
2396 if (PyList_Append(all, single))
2397 goto err;
2398 Py_XDECREF(single);
2399 }
2400 Py_XDECREF(pobj);
2401 return all;
2402 err:
2403 Py_XDECREF(single);
2404 Py_XDECREF(all);
2405 Py_XDECREF(pobj);
2406 return (PyObject *)NULL;
2407}
2408
2409static char getaddrinfo_doc[] =
2410"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2411 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2412\n\
2413Resolve host and port into addrinfo struct.";
2414
2415/* Python interface to getnameinfo(sa, flags). */
2416
2417/*ARGSUSED*/
2418static PyObject *
2419PySocket_getnameinfo(PyObject *self, PyObject *args)
2420{
2421 PyObject *sa = (PyObject *)NULL;
2422 int flags;
2423 char *hostp;
2424 int n, port, flowinfo, scope_id;
2425 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2426 struct addrinfo hints, *res = NULL;
2427 int error;
2428 PyObject *ret = (PyObject *)NULL;
2429
2430 flags = flowinfo = scope_id = 0;
2431 if (PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags) == 0)
2432 return NULL;
2433 n = PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, scope_id);
2434 if (n == 0)
2435 goto fail;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002436 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002437 memset(&hints, 0, sizeof(hints));
2438 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002439 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002440 error = getaddrinfo(hostp, pbuf, &hints, &res);
2441 if (error) {
2442 PyGAI_Err(error);
2443 goto fail;
2444 }
2445 if (res->ai_next) {
2446 PyErr_SetString(PySocket_Error,
2447 "sockaddr resolved to multiple addresses");
2448 goto fail;
2449 }
2450 switch (res->ai_family) {
2451 case AF_INET:
2452 {
2453 char *t1;
2454 int t2;
2455 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2456 PyErr_SetString(PySocket_Error,
2457 "IPv4 sockaddr must be 2 tuple");
2458 goto fail;
2459 }
2460 break;
2461 }
2462#ifdef INET6
2463 case AF_INET6:
2464 {
2465 struct sockaddr_in6 *sin6;
2466 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2467 sin6->sin6_flowinfo = flowinfo;
2468 sin6->sin6_scope_id = scope_id;
2469 break;
2470 }
2471#endif
2472 }
2473 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2474 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2475 if (error) {
2476 PyGAI_Err(error);
2477 goto fail;
2478 }
2479 ret = Py_BuildValue("ss", hbuf, pbuf);
2480
2481fail:
2482 if (res)
2483 freeaddrinfo(res);
2484 Py_XDECREF(sa);
2485 return ret;
2486}
2487
2488static char getnameinfo_doc[] =
2489"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2490\n\
2491Get host and port for a sockaddr.";
2492
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002493
2494#ifdef USE_SSL
2495
2496/* This is a C function to be called for new object initialization */
2497static SSLObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002498newSSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002499{
2500 SSLObject *self;
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002501 char *errstr = NULL;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002502
Guido van Rossumb18618d2000-05-03 23:44:39 +00002503 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002504 if (self == NULL){
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002505 errstr = "newSSLObject error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002506 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002507 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002508 memset(self->server, '\0', sizeof(char) * 256);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002509 memset(self->issuer, '\0', sizeof(char) * 256);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002510 self->server_cert = NULL;
2511 self->ssl = NULL;
2512 self->ctx = NULL;
2513 self->Socket = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002514
Jeremy Hylton22738b92001-10-10 22:37:48 +00002515 if ((key_file && !cert_file) || (!key_file && cert_file)) {
2516 errstr = "Both the key & certificate files must be specified";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002517 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002518 }
2519
Jeremy Hylton22738b92001-10-10 22:37:48 +00002520 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2521 if (self->ctx == NULL) {
2522 errstr = "SSL_CTX_new error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002523 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002524 }
2525
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002526 if (key_file && cert_file) {
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002527 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002528 SSL_FILETYPE_PEM) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002529 errstr = "SSL_CTX_use_PrivateKey_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002530 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002531 }
2532
2533 if (SSL_CTX_use_certificate_chain_file(self->ctx,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002534 cert_file) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002535 errstr = "SSL_CTX_use_certificate_chain_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002536 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002537 }
2538 }
2539
2540 SSL_CTX_set_verify(self->ctx,
2541 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2542 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2543 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2544 SSL_set_connect_state(self->ssl);
2545
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002546 /* Actually negotiate SSL connection */
2547 /* XXX If SSL_connect() returns 0, it's also a failure. */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002548 if ((SSL_connect(self->ssl)) == -1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002549 errstr = "SSL_connect error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002550 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002551 }
2552 self->ssl->debug = 1;
2553
2554 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2555 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2556 self->server, 256);
2557 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2558 self->issuer, 256);
2559 }
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002560 self->Socket = Sock;
2561 Py_INCREF(self->Socket);
2562 return self;
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002563 fail:
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002564 if (errstr)
2565 PyErr_SetString(SSLErrorObject, errstr);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002566 Py_DECREF(self);
2567 return NULL;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002568}
2569
2570/* This is the Python function called for new object initialization */
2571static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002572PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002573{
2574 SSLObject *rv;
2575 PySocketSockObject *Sock;
2576 char *key_file;
2577 char *cert_file;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002578
Guido van Rossum43713e52000-02-29 13:59:29 +00002579 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002580 &PySocketSock_Type, (PyObject*)&Sock,
Jeremy Hyltonab006452001-10-10 03:33:24 +00002581 &key_file, &cert_file))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002582 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002583
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002584 rv = newSSLObject(Sock, key_file, cert_file);
Jeremy Hyltonab006452001-10-10 03:33:24 +00002585 if (rv == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002586 return NULL;
2587 return (PyObject *)rv;
2588}
2589
2590static char ssl_doc[] =
2591"ssl(socket, keyfile, certfile) -> sslobject";
2592
2593static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002594SSL_server(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002595{
2596 return PyString_FromString(self->server);
2597}
2598
2599static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002600SSL_issuer(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002601{
2602 return PyString_FromString(self->issuer);
2603}
2604
2605
2606/* SSL object methods */
2607
2608static PyMethodDef SSLMethods[] = {
Jeremy Hyltonab006452001-10-10 03:33:24 +00002609 {"write", (PyCFunction)SSL_SSLwrite, 1},
2610 {"read", (PyCFunction)SSL_SSLread, 1},
2611 {"server", (PyCFunction)SSL_server, 1},
2612 {"issuer", (PyCFunction)SSL_issuer, 1},
2613 {NULL, NULL}
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002614};
2615
2616static void SSL_dealloc(SSLObject *self)
2617{
2618 if (self->server_cert) /* Possible not to have one? */
2619 X509_free (self->server_cert);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002620 if (self->ssl)
2621 SSL_free(self->ssl);
2622 if (self->ctx)
2623 SSL_CTX_free(self->ctx);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002624 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002625 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002626}
2627
2628static PyObject *SSL_getattr(SSLObject *self, char *name)
2629{
2630 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2631}
2632
2633staticforward PyTypeObject SSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002634 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002635 0, /*ob_size*/
2636 "SSL", /*tp_name*/
2637 sizeof(SSLObject), /*tp_basicsize*/
2638 0, /*tp_itemsize*/
2639 /* methods */
2640 (destructor)SSL_dealloc, /*tp_dealloc*/
2641 0, /*tp_print*/
2642 (getattrfunc)SSL_getattr, /*tp_getattr*/
2643 0, /*tp_setattr*/
2644 0, /*tp_compare*/
2645 0, /*tp_repr*/
2646 0, /*tp_as_number*/
2647 0, /*tp_as_sequence*/
2648 0, /*tp_as_mapping*/
2649 0, /*tp_hash*/
2650};
2651
2652
2653
2654static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2655{
2656 char *data;
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002657 size_t len;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002658
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002659 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002660 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002661
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002662 len = SSL_write(self->ssl, data, len);
2663 return PyInt_FromLong((long)len);
2664}
2665
2666static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2667{
2668 PyObject *buf;
2669 int count = 0;
2670 int len = 1024;
2671 int res;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002672
Guido van Rossum43713e52000-02-29 13:59:29 +00002673 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002674
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002675 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2676 return NULL; /* Error object should already be set */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002677
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002678 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2679 res = SSL_get_error(self->ssl, count);
2680
2681 switch (res) {
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002682 case SSL_ERROR_NONE:
2683 assert(count > 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002684 break;
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002685 case SSL_ERROR_ZERO_RETURN: /* normal EOF */
2686 assert(count == 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002687 break;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002688 default:
2689 return PyErr_SetFromErrno(SSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002690 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002691
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002692 fflush(stderr);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002693
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002694 if (count < 0) {
2695 Py_DECREF(buf);
2696 return PyErr_SetFromErrno(SSLErrorObject);
2697 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002698
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002699 if (count != len && _PyString_Resize(&buf, count) < 0)
2700 return NULL;
2701 return buf;
2702}
2703
2704#endif /* USE_SSL */
2705
2706
Guido van Rossum30a685f1991-06-27 15:51:29 +00002707/* List of functions exported by this module. */
2708
Guido van Rossum73624e91994-10-10 17:59:00 +00002709static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002710 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002711 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002712 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002713 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002714 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002715 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002716 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002717 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002718 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002719 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002720 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002721 METH_VARARGS,getprotobyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002722 {"socket", PySocket_socket,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002723 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002724#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002725 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002726 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002727#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002728 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002729 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002730 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002731 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002732 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002733 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002734 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002735 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002736 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002737 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002738 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002739 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002740 {"getaddrinfo", PySocket_getaddrinfo,
2741 METH_VARARGS, getaddrinfo_doc},
2742 {"getnameinfo", PySocket_getnameinfo,
2743 METH_VARARGS, getnameinfo_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002744#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002745 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002746 METH_VARARGS, ssl_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002747#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002748 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002749};
2750
Guido van Rossum30a685f1991-06-27 15:51:29 +00002751
2752/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002753 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002754 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002755 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002756static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002757insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002758{
Guido van Rossum73624e91994-10-10 17:59:00 +00002759 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002760 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002761 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002762
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002763 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002764}
2765
Guido van Rossum30a685f1991-06-27 15:51:29 +00002766
Guido van Rossum8d665e61996-06-26 18:22:49 +00002767#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002768
2769/* Additional initialization and cleanup for NT/Windows */
2770
2771static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002772NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002773{
2774 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002775}
2776
2777static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002778NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002779{
2780 WSADATA WSAData;
2781 int ret;
2782 char buf[100];
2783 ret = WSAStartup(0x0101, &WSAData);
2784 switch (ret) {
2785 case 0: /* no error */
2786 atexit(NTcleanup);
2787 return 1;
2788 case WSASYSNOTREADY:
2789 PyErr_SetString(PyExc_ImportError,
2790 "WSAStartup failed: network not ready");
2791 break;
2792 case WSAVERNOTSUPPORTED:
2793 case WSAEINVAL:
2794 PyErr_SetString(PyExc_ImportError,
2795 "WSAStartup failed: requested version not supported");
2796 break;
2797 default:
2798 sprintf(buf, "WSAStartup failed: error code %d", ret);
2799 PyErr_SetString(PyExc_ImportError, buf);
2800 break;
2801 }
2802 return 0;
2803}
2804
Guido van Rossum8d665e61996-06-26 18:22:49 +00002805#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002806
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002807#if defined(PYOS_OS2)
2808
2809/* Additional initialization and cleanup for OS/2 */
2810
2811static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002812OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002813{
2814 /* No cleanup is necessary for OS/2 Sockets */
2815}
2816
2817static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002818OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002819{
2820 char reason[64];
2821 int rc = sock_init();
2822
2823 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002824 atexit(OS2cleanup);
2825 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002826 }
2827
2828 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2829 PyErr_SetString(PyExc_ImportError, reason);
2830
Guido van Rossum32c575d1997-12-02 20:37:32 +00002831 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002832}
2833
2834#endif /* PYOS_OS2 */
2835
Guido van Rossum30a685f1991-06-27 15:51:29 +00002836/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002837 * This is called when the first 'import socket' is done,
2838 * via a table in config.c, if config.c is compiled with USE_SOCKET
2839 * defined.
2840 *
2841 * For MS_WINDOWS (which means any Windows variant), this module
2842 * is actually called "_socket", and there's a wrapper "socket.py"
2843 * which implements some missing functionality (such as makefile(),
2844 * dup() and fromfd()). The import of "_socket" may fail with an
2845 * ImportError exception if initialization of WINSOCK fails. When
2846 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2847 * scheduled to be made at exit time.
2848 *
2849 * For OS/2, this module is also called "_socket" and uses a wrapper
2850 * "socket.py" which implements that functionality that is missing
2851 * when PC operating systems don't put socket descriptors in the
2852 * operating system's filesystem layer.
2853 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002854
Guido van Rossum82a5c661998-07-07 20:45:43 +00002855static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002856"Implementation module for socket operations. See the socket module\n\
2857for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002858
2859static char sockettype_doc[] =
2860"A socket represents one endpoint of a network connection.\n\
2861\n\
2862Methods:\n\
2863\n\
2864accept() -- accept a connection, returning new socket and client address\n\
2865bind() -- bind the socket to a local address\n\
2866close() -- close the socket\n\
2867connect() -- connect the socket to a remote address\n\
2868connect_ex() -- connect, return an error code instead of an exception \n\
2869dup() -- return a new socket object identical to the current one (*)\n\
2870fileno() -- return underlying file descriptor\n\
2871getpeername() -- return remote address (*)\n\
2872getsockname() -- return local address\n\
2873getsockopt() -- get socket options\n\
2874listen() -- start listening for incoming connections\n\
2875makefile() -- return a file object corresponding tot the socket (*)\n\
2876recv() -- receive data\n\
2877recvfrom() -- receive data and sender's address\n\
2878send() -- send data\n\
2879sendto() -- send data to a given address\n\
2880setblocking() -- set or clear the blocking I/O flag\n\
2881setsockopt() -- set socket options\n\
2882shutdown() -- shut down traffic in one or both directions\n\
2883\n\
2884(*) not available on all platforms!)";
2885
Guido van Rossum3886bb61998-12-04 18:50:17 +00002886DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002887init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002888{
Guido van Rossum73624e91994-10-10 17:59:00 +00002889 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002890#ifdef RISCOS
2891 _kernel_swi_regs r;
2892 r.r[0]=0;
2893 _kernel_swi(0x43380, &r, &r);
2894 taskwindow = r.r[0];
2895#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002896#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002897 if (!NTinit())
2898 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002899#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002900#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002901 if (!OS2init())
2902 return;
Fred Drakea136d492000-08-16 14:18:30 +00002903#endif /* __TOS_OS2__ */
2904#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002905#endif /* RISCOS */
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002906#ifdef USE_SSL
2907 SSL_Type.ob_type = &PyType_Type;
2908#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002909 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00002910 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002911 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2912 if (PySocket_Error == NULL)
2913 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002914 PyDict_SetItemString(d, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002915 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
2916 if (PyH_Error == NULL)
2917 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002918 PyDict_SetItemString(d, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002919 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
2920 NULL);
2921 if (PyGAI_Error == NULL)
2922 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002923 PyDict_SetItemString(d, "gaierror", PyGAI_Error);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002924#ifdef USE_SSL
2925 SSL_load_error_strings();
2926 SSLeay_add_ssl_algorithms();
2927 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2928 if (SSLErrorObject == NULL)
2929 return;
2930 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2931 Py_INCREF(&SSL_Type);
2932 if (PyDict_SetItemString(d, "SSLType",
2933 (PyObject *)&SSL_Type) != 0)
2934 return;
2935#endif /* USE_SSL */
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002936 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002937 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002938 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002939 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002940 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002941 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002942
2943 /* Address families (we only support AF_INET and AF_UNIX) */
2944#ifdef AF_UNSPEC
2945 insint(d, "AF_UNSPEC", AF_UNSPEC);
2946#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002947 insint(d, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002948#ifdef AF_INET6
2949 insint(d, "AF_INET6", AF_INET6);
2950#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002951#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002952 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002953#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002954#ifdef AF_AX25
2955 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2956#endif
2957#ifdef AF_IPX
2958 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2959#endif
2960#ifdef AF_APPLETALK
2961 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2962#endif
2963#ifdef AF_NETROM
2964 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2965#endif
2966#ifdef AF_BRIDGE
2967 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2968#endif
2969#ifdef AF_AAL5
2970 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2971#endif
2972#ifdef AF_X25
2973 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2974#endif
2975#ifdef AF_INET6
2976 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2977#endif
2978#ifdef AF_ROSE
2979 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2980#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002981#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00002982 insint(d, "AF_PACKET", AF_PACKET);
2983 insint(d, "PF_PACKET", PF_PACKET);
2984 insint(d, "PACKET_HOST", PACKET_HOST);
2985 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
2986 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
2987 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
2988 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
2989 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
2990 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002991#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002992
2993 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002994 insint(d, "SOCK_STREAM", SOCK_STREAM);
2995 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002996#ifndef __BEOS__
2997/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002998 insint(d, "SOCK_RAW", SOCK_RAW);
2999 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3000 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003001#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003002
3003#ifdef SO_DEBUG
3004 insint(d, "SO_DEBUG", SO_DEBUG);
3005#endif
3006#ifdef SO_ACCEPTCONN
3007 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
3008#endif
3009#ifdef SO_REUSEADDR
3010 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
3011#endif
3012#ifdef SO_KEEPALIVE
3013 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
3014#endif
3015#ifdef SO_DONTROUTE
3016 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
3017#endif
3018#ifdef SO_BROADCAST
3019 insint(d, "SO_BROADCAST", SO_BROADCAST);
3020#endif
3021#ifdef SO_USELOOPBACK
3022 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
3023#endif
3024#ifdef SO_LINGER
3025 insint(d, "SO_LINGER", SO_LINGER);
3026#endif
3027#ifdef SO_OOBINLINE
3028 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
3029#endif
3030#ifdef SO_REUSEPORT
3031 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
3032#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003033#ifdef SO_SNDBUF
3034 insint(d, "SO_SNDBUF", SO_SNDBUF);
3035#endif
3036#ifdef SO_RCVBUF
3037 insint(d, "SO_RCVBUF", SO_RCVBUF);
3038#endif
3039#ifdef SO_SNDLOWAT
3040 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
3041#endif
3042#ifdef SO_RCVLOWAT
3043 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
3044#endif
3045#ifdef SO_SNDTIMEO
3046 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
3047#endif
3048#ifdef SO_RCVTIMEO
3049 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
3050#endif
3051#ifdef SO_ERROR
3052 insint(d, "SO_ERROR", SO_ERROR);
3053#endif
3054#ifdef SO_TYPE
3055 insint(d, "SO_TYPE", SO_TYPE);
3056#endif
3057
3058 /* Maximum number of connections for "listen" */
3059#ifdef SOMAXCONN
3060 insint(d, "SOMAXCONN", SOMAXCONN);
3061#else
3062 insint(d, "SOMAXCONN", 5); /* Common value */
3063#endif
3064
3065 /* Flags for send, recv */
3066#ifdef MSG_OOB
3067 insint(d, "MSG_OOB", MSG_OOB);
3068#endif
3069#ifdef MSG_PEEK
3070 insint(d, "MSG_PEEK", MSG_PEEK);
3071#endif
3072#ifdef MSG_DONTROUTE
3073 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
3074#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003075#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00003076 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003077#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003078#ifdef MSG_EOR
3079 insint(d, "MSG_EOR", MSG_EOR);
3080#endif
3081#ifdef MSG_TRUNC
3082 insint(d, "MSG_TRUNC", MSG_TRUNC);
3083#endif
3084#ifdef MSG_CTRUNC
3085 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
3086#endif
3087#ifdef MSG_WAITALL
3088 insint(d, "MSG_WAITALL", MSG_WAITALL);
3089#endif
3090#ifdef MSG_BTAG
3091 insint(d, "MSG_BTAG", MSG_BTAG);
3092#endif
3093#ifdef MSG_ETAG
3094 insint(d, "MSG_ETAG", MSG_ETAG);
3095#endif
3096
3097 /* Protocol level and numbers, usable for [gs]etsockopt */
3098#ifdef SOL_SOCKET
3099 insint(d, "SOL_SOCKET", SOL_SOCKET);
3100#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003101#ifdef SOL_IP
3102 insint(d, "SOL_IP", SOL_IP);
3103#else
3104 insint(d, "SOL_IP", 0);
3105#endif
3106#ifdef SOL_IPX
3107 insint(d, "SOL_IPX", SOL_IPX);
3108#endif
3109#ifdef SOL_AX25
3110 insint(d, "SOL_AX25", SOL_AX25);
3111#endif
3112#ifdef SOL_ATALK
3113 insint(d, "SOL_ATALK", SOL_ATALK);
3114#endif
3115#ifdef SOL_NETROM
3116 insint(d, "SOL_NETROM", SOL_NETROM);
3117#endif
3118#ifdef SOL_ROSE
3119 insint(d, "SOL_ROSE", SOL_ROSE);
3120#endif
3121#ifdef SOL_TCP
3122 insint(d, "SOL_TCP", SOL_TCP);
3123#else
3124 insint(d, "SOL_TCP", 6);
3125#endif
3126#ifdef SOL_UDP
3127 insint(d, "SOL_UDP", SOL_UDP);
3128#else
3129 insint(d, "SOL_UDP", 17);
3130#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003131#ifdef IPPROTO_IP
3132 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003133#else
3134 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003135#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003136#ifdef IPPROTO_HOPOPTS
3137 insint(d, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
3138#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003139#ifdef IPPROTO_ICMP
3140 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003141#else
3142 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003143#endif
3144#ifdef IPPROTO_IGMP
3145 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
3146#endif
3147#ifdef IPPROTO_GGP
3148 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
3149#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003150#ifdef IPPROTO_IPV4
3151 insint(d, "IPPROTO_IPV4", IPPROTO_IPV4);
3152#endif
3153#ifdef IPPROTO_IPIP
3154 insint(d, "IPPROTO_IPIP", IPPROTO_IPIP);
3155#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003156#ifdef IPPROTO_TCP
3157 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003158#else
3159 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003160#endif
3161#ifdef IPPROTO_EGP
3162 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
3163#endif
3164#ifdef IPPROTO_PUP
3165 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
3166#endif
3167#ifdef IPPROTO_UDP
3168 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003169#else
3170 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003171#endif
3172#ifdef IPPROTO_IDP
3173 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
3174#endif
3175#ifdef IPPROTO_HELLO
3176 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
3177#endif
3178#ifdef IPPROTO_ND
3179 insint(d, "IPPROTO_ND", IPPROTO_ND);
3180#endif
3181#ifdef IPPROTO_TP
3182 insint(d, "IPPROTO_TP", IPPROTO_TP);
3183#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003184#ifdef IPPROTO_IPV6
3185 insint(d, "IPPROTO_IPV6", IPPROTO_IPV6);
3186#endif
3187#ifdef IPPROTO_ROUTING
3188 insint(d, "IPPROTO_ROUTING", IPPROTO_ROUTING);
3189#endif
3190#ifdef IPPROTO_FRAGMENT
3191 insint(d, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
3192#endif
3193#ifdef IPPROTO_RSVP
3194 insint(d, "IPPROTO_RSVP", IPPROTO_RSVP);
3195#endif
3196#ifdef IPPROTO_GRE
3197 insint(d, "IPPROTO_GRE", IPPROTO_GRE);
3198#endif
3199#ifdef IPPROTO_ESP
3200 insint(d, "IPPROTO_ESP", IPPROTO_ESP);
3201#endif
3202#ifdef IPPROTO_AH
3203 insint(d, "IPPROTO_AH", IPPROTO_AH);
3204#endif
3205#ifdef IPPROTO_MOBILE
3206 insint(d, "IPPROTO_MOBILE", IPPROTO_MOBILE);
3207#endif
3208#ifdef IPPROTO_ICMPV6
3209 insint(d, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
3210#endif
3211#ifdef IPPROTO_NONE
3212 insint(d, "IPPROTO_NONE", IPPROTO_NONE);
3213#endif
3214#ifdef IPPROTO_DSTOPTS
3215 insint(d, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
3216#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003217#ifdef IPPROTO_XTP
3218 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
3219#endif
3220#ifdef IPPROTO_EON
3221 insint(d, "IPPROTO_EON", IPPROTO_EON);
3222#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003223#ifdef IPPROTO_PIM
3224 insint(d, "IPPROTO_PIM", IPPROTO_PIM);
3225#endif
3226#ifdef IPPROTO_IPCOMP
3227 insint(d, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
3228#endif
3229#ifdef IPPROTO_VRRP
3230 insint(d, "IPPROTO_VRRP", IPPROTO_VRRP);
3231#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003232#ifdef IPPROTO_BIP
3233 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
3234#endif
3235/**/
3236#ifdef IPPROTO_RAW
3237 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003238#else
3239 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003240#endif
3241#ifdef IPPROTO_MAX
3242 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
3243#endif
3244
3245 /* Some port configuration */
3246#ifdef IPPORT_RESERVED
3247 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
3248#else
3249 insint(d, "IPPORT_RESERVED", 1024);
3250#endif
3251#ifdef IPPORT_USERRESERVED
3252 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
3253#else
3254 insint(d, "IPPORT_USERRESERVED", 5000);
3255#endif
3256
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003257 /* Some reserved IP v.4 addresses */
3258#ifdef INADDR_ANY
3259 insint(d, "INADDR_ANY", INADDR_ANY);
3260#else
3261 insint(d, "INADDR_ANY", 0x00000000);
3262#endif
3263#ifdef INADDR_BROADCAST
3264 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
3265#else
3266 insint(d, "INADDR_BROADCAST", 0xffffffff);
3267#endif
3268#ifdef INADDR_LOOPBACK
3269 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
3270#else
3271 insint(d, "INADDR_LOOPBACK", 0x7F000001);
3272#endif
3273#ifdef INADDR_UNSPEC_GROUP
3274 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
3275#else
3276 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
3277#endif
3278#ifdef INADDR_ALLHOSTS_GROUP
3279 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
3280#else
3281 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
3282#endif
3283#ifdef INADDR_MAX_LOCAL_GROUP
3284 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
3285#else
3286 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
3287#endif
3288#ifdef INADDR_NONE
3289 insint(d, "INADDR_NONE", INADDR_NONE);
3290#else
3291 insint(d, "INADDR_NONE", 0xffffffff);
3292#endif
3293
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003294 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003295#ifdef IP_OPTIONS
3296 insint(d, "IP_OPTIONS", IP_OPTIONS);
3297#endif
3298#ifdef IP_HDRINCL
3299 insint(d, "IP_HDRINCL", IP_HDRINCL);
3300#endif
3301#ifdef IP_TOS
3302 insint(d, "IP_TOS", IP_TOS);
3303#endif
3304#ifdef IP_TTL
3305 insint(d, "IP_TTL", IP_TTL);
3306#endif
3307#ifdef IP_RECVOPTS
3308 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
3309#endif
3310#ifdef IP_RECVRETOPTS
3311 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
3312#endif
3313#ifdef IP_RECVDSTADDR
3314 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
3315#endif
3316#ifdef IP_RETOPTS
3317 insint(d, "IP_RETOPTS", IP_RETOPTS);
3318#endif
3319#ifdef IP_MULTICAST_IF
3320 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
3321#endif
3322#ifdef IP_MULTICAST_TTL
3323 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
3324#endif
3325#ifdef IP_MULTICAST_LOOP
3326 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
3327#endif
3328#ifdef IP_ADD_MEMBERSHIP
3329 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
3330#endif
3331#ifdef IP_DROP_MEMBERSHIP
3332 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
3333#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003334#ifdef IP_DEFAULT_MULTICAST_TTL
3335 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
3336#endif
3337#ifdef IP_DEFAULT_MULTICAST_LOOP
3338 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
3339#endif
3340#ifdef IP_MAX_MEMBERSHIPS
3341 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
3342#endif
3343
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003344 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3345#ifdef IPV6_JOIN_GROUP
3346 insint(d, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
3347#endif
3348#ifdef IPV6_LEAVE_GROUP
3349 insint(d, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
3350#endif
3351#ifdef IPV6_MULTICAST_HOPS
3352 insint(d, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
3353#endif
3354#ifdef IPV6_MULTICAST_IF
3355 insint(d, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
3356#endif
3357#ifdef IPV6_MULTICAST_LOOP
3358 insint(d, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
3359#endif
3360#ifdef IPV6_UNICAST_HOPS
3361 insint(d, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
3362#endif
3363
Guido van Rossum09be4091999-08-09 14:40:40 +00003364 /* TCP options */
3365#ifdef TCP_NODELAY
3366 insint(d, "TCP_NODELAY", TCP_NODELAY);
3367#endif
3368#ifdef TCP_MAXSEG
3369 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
3370#endif
3371
3372 /* IPX options */
3373#ifdef IPX_TYPE
3374 insint(d, "IPX_TYPE", IPX_TYPE);
3375#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003376
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003377 /* get{addr,name}info parameters */
3378#ifdef EAI_ADDRFAMILY
3379 insint(d, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
3380#endif
3381#ifdef EAI_AGAIN
3382 insint(d, "EAI_AGAIN", EAI_AGAIN);
3383#endif
3384#ifdef EAI_BADFLAGS
3385 insint(d, "EAI_BADFLAGS", EAI_BADFLAGS);
3386#endif
3387#ifdef EAI_FAIL
3388 insint(d, "EAI_FAIL", EAI_FAIL);
3389#endif
3390#ifdef EAI_FAMILY
3391 insint(d, "EAI_FAMILY", EAI_FAMILY);
3392#endif
3393#ifdef EAI_MEMORY
3394 insint(d, "EAI_MEMORY", EAI_MEMORY);
3395#endif
3396#ifdef EAI_NODATA
3397 insint(d, "EAI_NODATA", EAI_NODATA);
3398#endif
3399#ifdef EAI_NONAME
3400 insint(d, "EAI_NONAME", EAI_NONAME);
3401#endif
3402#ifdef EAI_SERVICE
3403 insint(d, "EAI_SERVICE", EAI_SERVICE);
3404#endif
3405#ifdef EAI_SOCKTYPE
3406 insint(d, "EAI_SOCKTYPE", EAI_SOCKTYPE);
3407#endif
3408#ifdef EAI_SYSTEM
3409 insint(d, "EAI_SYSTEM", EAI_SYSTEM);
3410#endif
3411#ifdef EAI_BADHINTS
3412 insint(d, "EAI_BADHINTS", EAI_BADHINTS);
3413#endif
3414#ifdef EAI_PROTOCOL
3415 insint(d, "EAI_PROTOCOL", EAI_PROTOCOL);
3416#endif
3417#ifdef EAI_MAX
3418 insint(d, "EAI_MAX", EAI_MAX);
3419#endif
3420#ifdef AI_PASSIVE
3421 insint(d, "AI_PASSIVE", AI_PASSIVE);
3422#endif
3423#ifdef AI_CANONNAME
3424 insint(d, "AI_CANONNAME", AI_CANONNAME);
3425#endif
3426#ifdef AI_NUMERICHOST
3427 insint(d, "AI_NUMERICHOST", AI_NUMERICHOST);
3428#endif
3429#ifdef AI_MASK
3430 insint(d, "AI_MASK", AI_MASK);
3431#endif
3432#ifdef AI_ALL
3433 insint(d, "AI_ALL", AI_ALL);
3434#endif
3435#ifdef AI_V4MAPPED_CFG
3436 insint(d, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
3437#endif
3438#ifdef AI_ADDRCONFIG
3439 insint(d, "AI_ADDRCONFIG", AI_ADDRCONFIG);
3440#endif
3441#ifdef AI_V4MAPPED
3442 insint(d, "AI_V4MAPPED", AI_V4MAPPED);
3443#endif
3444#ifdef AI_DEFAULT
3445 insint(d, "AI_DEFAULT", AI_DEFAULT);
3446#endif
3447#ifdef NI_MAXHOST
3448 insint(d, "NI_MAXHOST", NI_MAXHOST);
3449#endif
3450#ifdef NI_MAXSERV
3451 insint(d, "NI_MAXSERV", NI_MAXSERV);
3452#endif
3453#ifdef NI_NOFQDN
3454 insint(d, "NI_NOFQDN", NI_NOFQDN);
3455#endif
3456#ifdef NI_NUMERICHOST
3457 insint(d, "NI_NUMERICHOST", NI_NUMERICHOST);
3458#endif
3459#ifdef NI_NAMEREQD
3460 insint(d, "NI_NAMEREQD", NI_NAMEREQD);
3461#endif
3462#ifdef NI_NUMERICSERV
3463 insint(d, "NI_NUMERICSERV", NI_NUMERICSERV);
3464#endif
3465#ifdef NI_DGRAM
3466 insint(d, "NI_DGRAM", NI_DGRAM);
3467#endif
3468
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003469 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003470#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003471 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003472#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003473}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003474
3475/* Simplistic emulation code for inet_pton that only works for IPv4 */
3476#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003477int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003478inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003479{
3480 if(af == AF_INET){
3481 long packed_addr;
3482#ifdef USE_GUSI1
3483 packed_addr = (long)inet_addr(src).s_addr;
3484#else
3485 packed_addr = inet_addr(src);
3486#endif
3487 if (packed_addr == INADDR_NONE)
3488 return 0;
3489 memcpy(dst, &packed_addr, 4);
3490 return 1;
3491 }
3492 /* Should set errno to EAFNOSUPPORT */
3493 return -1;
3494}
3495
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003496const char *
3497inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003498{
3499 if (af == AF_INET) {
3500 struct in_addr packed_addr;
3501 if (size < 16)
3502 /* Should set errno to ENOSPC. */
3503 return NULL;
3504 memcpy(&packed_addr, src, sizeof(packed_addr));
3505 return strncpy(dst, inet_ntoa(packed_addr), size);
3506 }
3507 /* Should set errno to EAFNOSUPPORT */
3508 return NULL;
3509}
3510#endif