blob: 706ca78bcd7f81c992700dcee6f7b1512d3e8e99 [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
Jeremy Hylton22308652001-02-02 03:23:09 +0000182#if defined(linux) && defined(AF_PACKET)
183#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öwis01dfdb32001-06-23 16:30:13 +0000221/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwis0b8de982001-07-30 16:52:55 +0000222/* XXX Temporarily work around bug #445928:
223 getaddrinfo on Darwin seems to return an empty result list, with
224 no error, even if host lookup ought to work fine. So use the
225 emulation code for now. */
226#if !defined(HAVE_GETADDRINFO) || defined(__APPLE__)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000227#include "getaddrinfo.c"
228#endif
Martin v. Löwis0b8de982001-07-30 16:52:55 +0000229#if !defined(HAVE_GETNAMEINFO) || defined(__APPLE__)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000230#include "getnameinfo.c"
231#endif
232
Guido van Rossumbcc20741998-08-04 22:53:56 +0000233#if defined(MS_WINDOWS) || defined(__BEOS__)
234/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000235/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000236#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000237#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000238#endif
239
Fred Drakea04eaad2000-06-30 02:46:07 +0000240/* abstract the socket file descriptor type */
241#ifdef MS_WINDOWS
242typedef SOCKET SOCKET_T;
243# ifdef MS_WIN64
244# define SIZEOF_SOCKET_T 8
245# else
246# define SIZEOF_SOCKET_T 4
247# endif
248#else
249typedef int SOCKET_T;
250# define SIZEOF_SOCKET_T SIZEOF_INT
251#endif
252
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000253#ifdef MS_WIN32
254# define EAFNOSUPPORT WSAEAFNOSUPPORT
255# define snprintf _snprintf
256#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000257
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000258#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000259#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000260#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000261#endif
262
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000263#ifndef SOCKETCLOSE
264#define SOCKETCLOSE close
265#endif
266
Guido van Rossum30a685f1991-06-27 15:51:29 +0000267/* Global variable holding the exception type for errors detected
268 by this module (but not argument type or memory errors, etc.). */
269
Guido van Rossum73624e91994-10-10 17:59:00 +0000270static PyObject *PySocket_Error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000271static PyObject *PyH_Error;
272static PyObject *PyGAI_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000273
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000274#ifdef USE_SSL
275static PyObject *SSLErrorObject;
276#endif /* USE_SSL */
277
Guido van Rossum30a685f1991-06-27 15:51:29 +0000278
Guido van Rossum48a680c2001-03-02 06:34:14 +0000279#ifdef RISCOS
280/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
281static int taskwindow;
282#endif
283
284
Guido van Rossum30a685f1991-06-27 15:51:29 +0000285/* Convenience function to raise an error according to errno
286 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000287
Guido van Rossum73624e91994-10-10 17:59:00 +0000288static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000289PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000290{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000291#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000292 int err_no = WSAGetLastError();
293 if (err_no) {
294 static struct { int no; const char *msg; } *msgp, msgs[] = {
295 { WSAEINTR, "Interrupted system call" },
296 { WSAEBADF, "Bad file descriptor" },
297 { WSAEACCES, "Permission denied" },
298 { WSAEFAULT, "Bad address" },
299 { WSAEINVAL, "Invalid argument" },
300 { WSAEMFILE, "Too many open files" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000301 { WSAEWOULDBLOCK,
Mark Hammond46a733d2000-07-24 01:45:11 +0000302 "The socket operation could not complete "
303 "without blocking" },
304 { WSAEINPROGRESS, "Operation now in progress" },
305 { WSAEALREADY, "Operation already in progress" },
306 { WSAENOTSOCK, "Socket operation on non-socket" },
307 { WSAEDESTADDRREQ, "Destination address required" },
308 { WSAEMSGSIZE, "Message too long" },
309 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
310 { WSAENOPROTOOPT, "Protocol not available" },
311 { WSAEPROTONOSUPPORT, "Protocol not supported" },
312 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
313 { WSAEOPNOTSUPP, "Operation not supported" },
314 { WSAEPFNOSUPPORT, "Protocol family not supported" },
315 { WSAEAFNOSUPPORT, "Address family not supported" },
316 { WSAEADDRINUSE, "Address already in use" },
317 { WSAEADDRNOTAVAIL,
318 "Can't assign requested address" },
319 { WSAENETDOWN, "Network is down" },
320 { WSAENETUNREACH, "Network is unreachable" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000321 { WSAENETRESET,
Mark Hammond46a733d2000-07-24 01:45:11 +0000322 "Network dropped connection on reset" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000323 { WSAECONNABORTED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000324 "Software caused connection abort" },
325 { WSAECONNRESET, "Connection reset by peer" },
326 { WSAENOBUFS, "No buffer space available" },
327 { WSAEISCONN, "Socket is already connected" },
328 { WSAENOTCONN, "Socket is not connected" },
329 { WSAESHUTDOWN, "Can't send after socket shutdown" },
330 { WSAETOOMANYREFS,
331 "Too many references: can't splice" },
332 { WSAETIMEDOUT, "Operation timed out" },
333 { WSAECONNREFUSED, "Connection refused" },
334 { WSAELOOP, "Too many levels of symbolic links" },
335 { WSAENAMETOOLONG, "File name too long" },
336 { WSAEHOSTDOWN, "Host is down" },
337 { WSAEHOSTUNREACH, "No route to host" },
338 { WSAENOTEMPTY, "Directory not empty" },
339 { WSAEPROCLIM, "Too many processes" },
340 { WSAEUSERS, "Too many users" },
341 { WSAEDQUOT, "Disc quota exceeded" },
342 { WSAESTALE, "Stale NFS file handle" },
343 { WSAEREMOTE, "Too many levels of remote in path" },
344 { WSASYSNOTREADY,
345 "Network subsystem is unvailable" },
346 { WSAVERNOTSUPPORTED,
347 "WinSock version is not supported" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000348 { WSANOTINITIALISED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000349 "Successful WSAStartup() not yet performed" },
350 { WSAEDISCON, "Graceful shutdown in progress" },
351 /* Resolver errors */
352 { WSAHOST_NOT_FOUND, "No such host is known" },
353 { WSATRY_AGAIN, "Host not found, or server failed" },
354 { WSANO_RECOVERY,
355 "Unexpected server error encountered" },
356 { WSANO_DATA, "Valid name without requested data" },
357 { WSANO_ADDRESS, "No address, look for MX record" },
358 { 0, NULL }
359 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000360 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000361 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000362
Mark Hammond46a733d2000-07-24 01:45:11 +0000363 for (msgp = msgs; msgp->msg; msgp++) {
364 if (err_no == msgp->no) {
365 msg = msgp->msg;
366 break;
367 }
368 }
369
370 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000371 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000372 PyErr_SetObject(PySocket_Error, v);
373 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000374 }
375 return NULL;
376 }
377 else
378#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000379
380#if defined(PYOS_OS2)
381 if (sock_errno() != NO_ERROR) {
382 APIRET rc;
383 ULONG msglen;
384 char outbuf[100];
385 int myerrorcode = sock_errno();
386
387 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
388 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
389 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
390 if (rc == NO_ERROR) {
391 PyObject *v;
392
393 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
394 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
395 char *lastc = &outbuf[ strlen(outbuf)-1 ];
396 while (lastc > outbuf && isspace(*lastc))
397 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
398 }
399 v = Py_BuildValue("(is)", myerrorcode, outbuf);
400 if (v != NULL) {
401 PyErr_SetObject(PySocket_Error, v);
402 Py_DECREF(v);
403 }
404 return NULL;
405 }
406 }
407#endif
408
Guido van Rossum73624e91994-10-10 17:59:00 +0000409 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000410}
411
Guido van Rossum30a685f1991-06-27 15:51:29 +0000412
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000413static PyObject *
414PyH_Err(int h_error)
415{
416 PyObject *v;
417
418#ifdef HAVE_HSTRERROR
419 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
420#else
421 v = Py_BuildValue("(is)", h_error, "host not found");
422#endif
423 if (v != NULL) {
424 PyErr_SetObject(PyGAI_Error, v);
425 Py_DECREF(v);
426 }
427
428 return NULL;
429}
430
431
432static PyObject *
433PyGAI_Err(int error)
434{
435 PyObject *v;
436
437 if (error == EAI_SYSTEM)
438 return PySocket_Err();
439
440 v = Py_BuildValue("(is)", error, gai_strerror(error));
441 if (v != NULL) {
442 PyErr_SetObject(PyGAI_Error, v);
443 Py_DECREF(v);
444 }
445
446 return NULL;
447}
448
449
Guido van Rossum30a685f1991-06-27 15:51:29 +0000450/* The object holding a socket. It holds some extra information,
451 like the address family, which is used to decode socket address
452 arguments properly. */
453
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000454typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000455 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000456 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000457 int sock_family; /* Address family, e.g., AF_INET */
458 int sock_type; /* Socket type, e.g., SOCK_STREAM */
459 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000460 union sock_addr {
461 struct sockaddr_in in;
462#ifdef AF_UNIX
463 struct sockaddr_un un;
464#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000465#ifdef INET6
466 struct sockaddr_in6 in6;
467 struct sockaddr_storage storage;
468#endif
Jeremy Hylton22308652001-02-02 03:23:09 +0000469#if defined(linux) && defined(AF_PACKET)
470 struct sockaddr_ll ll;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000471#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000472 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000473} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000474
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000475#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000476
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000477typedef struct {
478 PyObject_HEAD
479 PySocketSockObject *Socket; /* Socket on which we're layered */
480 PyObject *x_attr; /* Attributes dictionary */
481 SSL_CTX* ctx;
482 SSL* ssl;
483 X509* server_cert;
484 BIO* sbio;
485 char server[256];
486 char issuer[256];
487
488} SSLObject;
489
490staticforward PyTypeObject SSL_Type;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000491staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
492staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
493
494#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
495
496#endif /* USE_SSL */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000497
Guido van Rossum30a685f1991-06-27 15:51:29 +0000498/* A forward reference to the Socktype type object.
499 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000500 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000501 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000502
Guido van Rossum73624e91994-10-10 17:59:00 +0000503staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000504
Guido van Rossum30a685f1991-06-27 15:51:29 +0000505
506/* Create a new socket object.
507 This just creates the object and initializes it.
508 If the creation fails, return NULL and set an exception (implicit
509 in NEWOBJ()). */
510
Guido van Rossum73624e91994-10-10 17:59:00 +0000511static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000512PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000513{
Guido van Rossum48a680c2001-03-02 06:34:14 +0000514#ifdef RISCOS
515 int block = 1;
516#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000517 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000518 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000519 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000520 if (s != NULL) {
521 s->sock_fd = fd;
522 s->sock_family = family;
523 s->sock_type = type;
524 s->sock_proto = proto;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000525#ifdef RISCOS
526 if(taskwindow) {
527 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
528 }
529#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000530 }
531 return s;
532}
533
Guido van Rossum30a685f1991-06-27 15:51:29 +0000534
Guido van Rossum48a680c2001-03-02 06:34:14 +0000535/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000536 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000537#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000538PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000539#endif
540
541
Guido van Rossum30a685f1991-06-27 15:51:29 +0000542/* Convert a string specifying a host name or one of a few symbolic
543 names to a numeric IP address. This usually calls gethostbyname()
544 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000545 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000546 an error occurred; then an exception is raised. */
547
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000548static int
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000549setipaddr(char* name, struct sockaddr * addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000550{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000551 struct addrinfo hints, *res;
552 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000553
Guido van Rossuma376cc51996-12-05 23:43:35 +0000554 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000555 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000556 int siz;
557 memset(&hints, 0, sizeof(hints));
558 hints.ai_family = af;
559 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
560 hints.ai_flags = AI_PASSIVE;
561 error = getaddrinfo(NULL, "0", &hints, &res);
562 if (error) {
563 PyGAI_Err(error);
564 return -1;
565 }
566 switch (res->ai_family) {
567 case AF_INET:
568 siz = 4;
569 break;
570#ifdef INET6
571 case AF_INET6:
572 siz = 16;
573 break;
574#endif
575 default:
576 freeaddrinfo(res);
577 PyErr_SetString(PySocket_Error,
578 "unsupported address family");
579 return -1;
580 }
581 if (res->ai_next) {
582 PyErr_SetString(PySocket_Error,
583 "wildcard resolved to multiple address");
584 return -1;
585 }
586 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
587 freeaddrinfo(res);
588 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000589 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000590 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000591 struct sockaddr_in *sin;
592 if (af != PF_INET && af != PF_UNSPEC) {
593 PyErr_SetString(PySocket_Error,
594 "address family mismatched");
595 return -1;
596 }
597 sin = (struct sockaddr_in *)addr_ret;
598 memset((void *) sin, '\0', sizeof(*sin));
599 sin->sin_family = AF_INET;
600#ifdef HAVE_SOCKADDR_SA_LEN
601 sin->sin_len = sizeof(*sin);
602#endif
603 sin->sin_addr.s_addr = INADDR_BROADCAST;
604 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000605 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000606 memset(&hints, 0, sizeof(hints));
607 hints.ai_family = af;
608 error = getaddrinfo(name, NULL, &hints, &res);
609 if (error) {
610 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000611 return -1;
612 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000613 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
614 freeaddrinfo(res);
615 switch (addr_ret->sa_family) {
616 case AF_INET:
617 return 4;
618#ifdef INET6
619 case AF_INET6:
620 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000621#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000622 default:
623 PyErr_SetString(PySocket_Error, "unknown address family");
624 return -1;
625 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000626}
627
Guido van Rossum30a685f1991-06-27 15:51:29 +0000628
Guido van Rossum30a685f1991-06-27 15:51:29 +0000629/* Create a string object representing an IP address.
630 This is always a string of the form 'dd.dd.dd.dd' (with variable
631 size numbers). */
632
Guido van Rossum73624e91994-10-10 17:59:00 +0000633static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000634makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000635{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000636 char buf[NI_MAXHOST];
637 int error;
638
639 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
640 NI_NUMERICHOST);
641 if (error) {
642 PyGAI_Err(error);
643 return NULL;
644 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000645 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000646}
647
648
649/* Create an object representing the given socket address,
650 suitable for passing it back to bind(), connect() etc.
651 The family field of the sockaddr structure is inspected
652 to determine what kind of address it really is. */
653
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000654/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000655static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000656makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000657{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000658 if (addrlen == 0) {
659 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000660 Py_INCREF(Py_None);
661 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000662 }
663
Guido van Rossumbcc20741998-08-04 22:53:56 +0000664#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000665 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000666 addr->sa_family = AF_INET;
667#endif
668
Guido van Rossum30a685f1991-06-27 15:51:29 +0000669 switch (addr->sa_family) {
670
671 case AF_INET:
672 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000673 struct sockaddr_in *a;
674 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000675 PyObject *ret = NULL;
676 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000677 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000678 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
679 Py_DECREF(addrobj);
680 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000681 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000682 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000683
Guido van Rossumb6775db1994-08-01 11:34:53 +0000684#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000685 case AF_UNIX:
686 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000687 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000688 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000689 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000690#endif /* AF_UNIX */
691
692#ifdef INET6
693 case AF_INET6:
694 {
695 struct sockaddr_in6 *a;
696 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
697 PyObject *ret = NULL;
698 if (addrobj) {
699 a = (struct sockaddr_in6 *)addr;
700 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
701 a->sin6_flowinfo, a->sin6_scope_id);
702 Py_DECREF(addrobj);
703 }
704 return ret;
705 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000706#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000707
Jeremy Hylton22308652001-02-02 03:23:09 +0000708#if defined(linux) && defined(AF_PACKET)
709 case AF_PACKET:
710 {
711 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
712 char *ifname = "";
713 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000714 /* need to look up interface name give index */
715 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000716 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000717 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000718 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000719 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000720 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000721 a->sll_pkttype, a->sll_hatype,
722 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000723 }
724#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000725
Guido van Rossum30a685f1991-06-27 15:51:29 +0000726 /* More cases here... */
727
728 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000729 /* If we don't know the address family, don't raise an
730 exception -- return it as a tuple. */
731 return Py_BuildValue("is#",
732 addr->sa_family,
733 addr->sa_data,
734 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000735
Guido van Rossum30a685f1991-06-27 15:51:29 +0000736 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000737}
738
Guido van Rossum30a685f1991-06-27 15:51:29 +0000739
740/* Parse a socket address argument according to the socket object's
741 address family. Return 1 if the address was in the proper format,
742 0 of not. The address is returned through addr_ret, its length
743 through len_ret. */
744
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000745static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000746getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000747 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000748{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000749 switch (s->sock_family) {
750
Guido van Rossumb6775db1994-08-01 11:34:53 +0000751#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000752 case AF_UNIX:
753 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000754 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000755 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000756 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000757 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000758 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000759 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000760 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000761 PyErr_SetString(PySocket_Error,
762 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000763 return 0;
764 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000765 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000766 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000767 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000768 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000769 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000770 return 1;
771 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000772#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000773
Guido van Rossum30a685f1991-06-27 15:51:29 +0000774 case AF_INET:
775 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000776 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000777 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000778 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000779 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000780 if (!PyTuple_Check(args)) {
781 PyErr_Format(PyExc_TypeError,
782 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
783 args->ob_type->tp_name);
784 return 0;
785 }
786 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000787 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000788 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000789 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000790 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000791 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000792 *addr_ret = (struct sockaddr *) addr;
793 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000794 return 1;
795 }
796
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000797#ifdef INET6
798 case AF_INET6:
799 {
800 struct sockaddr_in6* addr;
801 char *host;
802 int port, flowinfo, scope_id;
803 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
804 flowinfo = scope_id = 0;
805 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
806 &scope_id)) {
807 return 0;
808 }
809 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
810 return 0;
811 addr->sin6_family = s->sock_family;
812 addr->sin6_port = htons((short)port);
813 addr->sin6_flowinfo = flowinfo;
814 addr->sin6_scope_id = scope_id;
815 *addr_ret = (struct sockaddr *) addr;
816 *len_ret = sizeof *addr;
817 return 1;
818 }
819#endif
820
Jeremy Hylton22308652001-02-02 03:23:09 +0000821#if defined(linux) && defined(AF_PACKET)
822 case AF_PACKET:
823 {
824 struct sockaddr_ll* addr;
825 struct ifreq ifr;
826 char *interfaceName;
827 int protoNumber;
828 int hatype = 0;
829 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000830 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000831
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000832 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
833 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000834 return 0;
835 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
836 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000837 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
838 PyErr_SetFromErrno(PySocket_Error);
Jeremy Hylton22308652001-02-02 03:23:09 +0000839 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000840 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000841 addr = &(s->sock_addr.ll);
842 addr->sll_family = AF_PACKET;
843 addr->sll_protocol = htons((short)protoNumber);
844 addr->sll_ifindex = ifr.ifr_ifindex;
845 addr->sll_pkttype = pkttype;
846 addr->sll_hatype = hatype;
847 *addr_ret = (struct sockaddr *) addr;
848 *len_ret = sizeof *addr;
849 return 1;
850 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000851#endif
852
Guido van Rossum30a685f1991-06-27 15:51:29 +0000853 /* More cases here... */
854
855 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000856 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000857 return 0;
858
859 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000860}
861
Guido van Rossum30a685f1991-06-27 15:51:29 +0000862
Guido van Rossum48a680c2001-03-02 06:34:14 +0000863/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000864 Return 1 if the family is known, 0 otherwise. The length is returned
865 through len_ret. */
866
867static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000868getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000869{
870 switch (s->sock_family) {
871
Guido van Rossumb6775db1994-08-01 11:34:53 +0000872#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000873 case AF_UNIX:
874 {
875 *len_ret = sizeof (struct sockaddr_un);
876 return 1;
877 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000878#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000879
880 case AF_INET:
881 {
882 *len_ret = sizeof (struct sockaddr_in);
883 return 1;
884 }
885
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000886#ifdef INET6
887 case AF_INET6:
888 {
889 *len_ret = sizeof (struct sockaddr_in6);
890 return 1;
891 }
892#endif
893
Jeremy Hylton22308652001-02-02 03:23:09 +0000894#if defined(linux) && defined(AF_PACKET)
895 case AF_PACKET:
896 {
897 *len_ret = sizeof (struct sockaddr_ll);
898 return 1;
899 }
900#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000901
Guido van Rossum710e1df1992-06-12 10:39:36 +0000902 /* More cases here... */
903
904 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000905 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000906 return 0;
907
908 }
909}
910
911
Guido van Rossum30a685f1991-06-27 15:51:29 +0000912/* s.accept() method */
913
Guido van Rossum73624e91994-10-10 17:59:00 +0000914static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000915PySocketSock_accept(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000916{
917 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000918 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000919 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000920 PyObject *sock = NULL;
921 PyObject *addr = NULL;
922 PyObject *res = NULL;
923
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000924 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000925 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000926 if (!getsockaddrlen(s, &addrlen))
927 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000928 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000929 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000930 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000931 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000932#ifdef MS_WINDOWS
933 if (newfd == INVALID_SOCKET)
934#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000935 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000936#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000937 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000938
Guido van Rossum30a685f1991-06-27 15:51:29 +0000939 /* Create the new object with unspecified family,
940 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000941 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000942 s->sock_family,
943 s->sock_type,
944 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000945 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000946 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000947 goto finally;
948 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000949 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000950 addrlen);
951 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000952 goto finally;
953
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000954 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000955
956 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000957 Py_XDECREF(sock);
958 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000959 return res;
960}
961
Guido van Rossum82a5c661998-07-07 20:45:43 +0000962static char accept_doc[] =
963"accept() -> (socket object, address info)\n\
964\n\
965Wait for an incoming connection. Return a new socket representing the\n\
966connection, and the address of the client. For IP sockets, the address\n\
967info is a pair (hostaddr, port).";
968
Guido van Rossum30a685f1991-06-27 15:51:29 +0000969
Guido van Rossume4485b01994-09-07 14:32:49 +0000970/* s.setblocking(1 | 0) method */
971
Guido van Rossum73624e91994-10-10 17:59:00 +0000972static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000973PySocketSock_setblocking(PySocketSockObject *s, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000974{
975 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000976#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000977#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000978 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000979#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000980#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000981 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000982 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000983 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000984#ifdef __BEOS__
985 block = !block;
986 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
987 (void *)(&block), sizeof( int ) );
988#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000989#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000990#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000991#ifdef PYOS_OS2
992 block = !block;
993 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
994#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000995 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
996 if (block)
997 delay_flag &= (~O_NDELAY);
998 else
999 delay_flag |= O_NDELAY;
1000 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001001#endif /* !PYOS_OS2 */
1002#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001003 block = !block;
1004 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001005#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +00001006#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001007#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001008 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +00001009
Guido van Rossum73624e91994-10-10 17:59:00 +00001010 Py_INCREF(Py_None);
1011 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001012}
Guido van Rossume4485b01994-09-07 14:32:49 +00001013
Guido van Rossum82a5c661998-07-07 20:45:43 +00001014static char setblocking_doc[] =
1015"setblocking(flag)\n\
1016\n\
1017Set the socket to blocking (flag is true) or non-blocking (false).\n\
1018This uses the FIONBIO ioctl with the O_NDELAY flag.";
1019
Guido van Rossume4485b01994-09-07 14:32:49 +00001020
Guido van Rossum48a680c2001-03-02 06:34:14 +00001021#ifdef RISCOS
1022/* s.sleeptaskw(1 | 0) method */
1023
1024static PyObject *
1025PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
1026{
1027 int block;
1028 int delay_flag;
1029 if (!PyArg_GetInt(args, &block))
1030 return NULL;
1031 Py_BEGIN_ALLOW_THREADS
1032 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1033 Py_END_ALLOW_THREADS
1034
1035 Py_INCREF(Py_None);
1036 return Py_None;
1037}
1038static char sleeptaskw_doc[] =
1039"sleeptaskw(flag)\n\
1040\n\
1041Allow sleeps in taskwindows.";
1042#endif
1043
1044
Guido van Rossumaee08791992-09-08 09:05:33 +00001045/* s.setsockopt() method.
1046 With an integer third argument, sets an integer option.
1047 With a string third argument, sets an option from a buffer;
1048 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001049
Guido van Rossum73624e91994-10-10 17:59:00 +00001050static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001051PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001052{
1053 int level;
1054 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001055 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001056 char *buf;
1057 int buflen;
1058 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001059
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001060 if (PyArg_ParseTuple(args, "iii:setsockopt",
1061 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001062 buf = (char *) &flag;
1063 buflen = sizeof flag;
1064 }
1065 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001066 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001067 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1068 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001069 return NULL;
1070 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001071 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001072 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001073 return PySocket_Err();
1074 Py_INCREF(Py_None);
1075 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001076}
1077
Guido van Rossum82a5c661998-07-07 20:45:43 +00001078static char setsockopt_doc[] =
1079"setsockopt(level, option, value)\n\
1080\n\
1081Set a socket option. See the Unix manual for level and option.\n\
1082The value argument can either be an integer or a string.";
1083
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001084
Guido van Rossumaee08791992-09-08 09:05:33 +00001085/* s.getsockopt() method.
1086 With two arguments, retrieves an integer option.
1087 With a third integer argument, retrieves a string buffer of that size;
1088 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001089
Guido van Rossum73624e91994-10-10 17:59:00 +00001090static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001091PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001092{
1093 int level;
1094 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001095 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001096 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001097 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001098
Guido van Rossumbcc20741998-08-04 22:53:56 +00001099#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001100 /* We have incomplete socket support. */
1101 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001102 return NULL;
1103#else
1104
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001105 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1106 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001107 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001108
Guido van Rossumbe32c891996-06-20 16:25:29 +00001109 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001110 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001111 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001112 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001113 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001114 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001115 return PySocket_Err();
1116 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001117 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001118 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001119 PyErr_SetString(PySocket_Error,
1120 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001121 return NULL;
1122 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001123 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001124 if (buf == NULL)
1125 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001126 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001127 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001128 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001129 Py_DECREF(buf);
1130 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +00001131 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001132 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001133 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001134#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001135}
1136
Guido van Rossum82a5c661998-07-07 20:45:43 +00001137static char getsockopt_doc[] =
1138"getsockopt(level, option[, buffersize]) -> value\n\
1139\n\
1140Get a socket option. See the Unix manual for level and option.\n\
1141If a nonzero buffersize argument is given, the return value is a\n\
1142string of that length; otherwise it is an integer.";
1143
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001144
Fred Drake728819a2000-07-01 03:40:12 +00001145/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001146
Guido van Rossum73624e91994-10-10 17:59:00 +00001147static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001148PySocketSock_bind(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001149{
1150 struct sockaddr *addr;
1151 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001152 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001153 PyObject *addro;
1154 if (!PyArg_ParseTuple(args, "O:bind", &addro))
1155 return NULL;
1156 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001157 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001158 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001159 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001160 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001161 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001162 return PySocket_Err();
1163 Py_INCREF(Py_None);
1164 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001165}
1166
Guido van Rossum82a5c661998-07-07 20:45:43 +00001167static char bind_doc[] =
1168"bind(address)\n\
1169\n\
1170Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001171pair (host, port); the host must refer to the local host. For raw packet\n\
1172sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001173
Guido van Rossum30a685f1991-06-27 15:51:29 +00001174
1175/* s.close() method.
1176 Set the file descriptor to -1 so operations tried subsequently
1177 will surely fail. */
1178
Guido van Rossum73624e91994-10-10 17:59:00 +00001179static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001180PySocketSock_close(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001181{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001182 SOCKET_T fd;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001183 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001184 return NULL;
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001185 if ((fd = s->sock_fd) != -1) {
1186 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001187 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001188 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001189 Py_END_ALLOW_THREADS
1190 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001191 Py_INCREF(Py_None);
1192 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001193}
1194
Guido van Rossum82a5c661998-07-07 20:45:43 +00001195static char close_doc[] =
1196"close()\n\
1197\n\
1198Close the socket. It cannot be used after this call.";
1199
Guido van Rossum30a685f1991-06-27 15:51:29 +00001200
Fred Drake728819a2000-07-01 03:40:12 +00001201/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001202
Guido van Rossum73624e91994-10-10 17:59:00 +00001203static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001204PySocketSock_connect(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001205{
1206 struct sockaddr *addr;
1207 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001208 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001209 PyObject *addro;
1210 if (!PyArg_ParseTuple(args, "O:connect", &addro))
1211 return NULL;
1212 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001213 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001214 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001215 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001216 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001217 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001218 return PySocket_Err();
1219 Py_INCREF(Py_None);
1220 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001221}
1222
Guido van Rossum82a5c661998-07-07 20:45:43 +00001223static char connect_doc[] =
1224"connect(address)\n\
1225\n\
1226Connect the socket to a remote address. For IP sockets, the address\n\
1227is a pair (host, port).";
1228
Guido van Rossum30a685f1991-06-27 15:51:29 +00001229
Fred Drake728819a2000-07-01 03:40:12 +00001230/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001231
1232static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001233PySocketSock_connect_ex(PySocketSockObject *s, PyObject *args)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001234{
1235 struct sockaddr *addr;
1236 int addrlen;
1237 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001238 PyObject *addro;
1239 if (!PyArg_ParseTuple(args, "O:connect_ex", &addro))
1240 return NULL;
1241 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001242 return NULL;
1243 Py_BEGIN_ALLOW_THREADS
1244 res = connect(s->sock_fd, addr, addrlen);
1245 Py_END_ALLOW_THREADS
1246 if (res != 0)
1247 res = errno;
1248 return PyInt_FromLong((long) res);
1249}
1250
Guido van Rossum82a5c661998-07-07 20:45:43 +00001251static char connect_ex_doc[] =
1252"connect_ex(address)\n\
1253\n\
1254This is like connect(address), but returns an error code (the errno value)\n\
1255instead of raising an exception when an error occurs.";
1256
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001257
Guido van Rossumed233a51992-06-23 09:07:03 +00001258/* s.fileno() method */
1259
Guido van Rossum73624e91994-10-10 17:59:00 +00001260static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001261PySocketSock_fileno(PySocketSockObject *s, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +00001262{
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001263 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +00001264 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +00001265#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001266 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001267#else
1268 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1269#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001270}
1271
Guido van Rossum82a5c661998-07-07 20:45:43 +00001272static char fileno_doc[] =
1273"fileno() -> integer\n\
1274\n\
1275Return the integer file descriptor of the socket.";
1276
Guido van Rossumed233a51992-06-23 09:07:03 +00001277
Guido van Rossumbe32c891996-06-20 16:25:29 +00001278#ifndef NO_DUP
1279/* s.dup() method */
1280
1281static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001282PySocketSock_dup(PySocketSockObject *s, PyObject *args)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001283{
Fred Drakea04eaad2000-06-30 02:46:07 +00001284 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001285 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001286 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001287 return NULL;
1288 newfd = dup(s->sock_fd);
1289 if (newfd < 0)
1290 return PySocket_Err();
1291 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001292 s->sock_family,
1293 s->sock_type,
1294 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001295 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001296 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001297 return sock;
1298}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001299
1300static char dup_doc[] =
1301"dup() -> socket object\n\
1302\n\
1303Return a new socket object connected to the same system resource.";
1304
Guido van Rossumbe32c891996-06-20 16:25:29 +00001305#endif
1306
1307
Guido van Rossumc89705d1992-11-26 08:54:07 +00001308/* s.getsockname() method */
1309
Guido van Rossum73624e91994-10-10 17:59:00 +00001310static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001311PySocketSock_getsockname(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001312{
1313 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001314 int res;
1315 socklen_t addrlen;
1316
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001317 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001318 return NULL;
1319 if (!getsockaddrlen(s, &addrlen))
1320 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001321 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001322 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001323 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001324 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001325 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001326 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001327 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001328}
1329
Guido van Rossum82a5c661998-07-07 20:45:43 +00001330static char getsockname_doc[] =
1331"getsockname() -> address info\n\
1332\n\
1333Return the address of the local endpoint. For IP sockets, the address\n\
1334info is a pair (hostaddr, port).";
1335
Guido van Rossumc89705d1992-11-26 08:54:07 +00001336
Guido van Rossumb6775db1994-08-01 11:34:53 +00001337#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001338/* s.getpeername() method */
1339
Guido van Rossum73624e91994-10-10 17:59:00 +00001340static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001341PySocketSock_getpeername(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001342{
1343 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001344 int res;
1345 socklen_t addrlen;
1346
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001347 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001348 return NULL;
1349 if (!getsockaddrlen(s, &addrlen))
1350 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001351 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001352 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001353 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001354 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001355 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001356 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001357 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001358}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001359
1360static char getpeername_doc[] =
1361"getpeername() -> address info\n\
1362\n\
1363Return the address of the remote endpoint. For IP sockets, the address\n\
1364info is a pair (hostaddr, port).";
1365
Guido van Rossumb6775db1994-08-01 11:34:53 +00001366#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001367
1368
Guido van Rossum30a685f1991-06-27 15:51:29 +00001369/* s.listen(n) method */
1370
Guido van Rossum73624e91994-10-10 17:59:00 +00001371static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001372PySocketSock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001373{
1374 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001375 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001376 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001377 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001378 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001379 if (backlog < 1)
1380 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001381 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001382 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001383 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001384 return PySocket_Err();
1385 Py_INCREF(Py_None);
1386 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001387}
1388
Guido van Rossum82a5c661998-07-07 20:45:43 +00001389static char listen_doc[] =
1390"listen(backlog)\n\
1391\n\
1392Enable a server to accept connections. The backlog argument must be at\n\
1393least 1; it specifies the number of unaccepted connection that the system\n\
1394will allow before refusing new connections.";
1395
1396
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001397#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001398/* s.makefile(mode) method.
1399 Create a new open file object referring to a dupped version of
1400 the socket's file descriptor. (The dup() call is necessary so
1401 that the open file and socket objects may be closed independent
1402 of each other.)
1403 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1404
Guido van Rossum73624e91994-10-10 17:59:00 +00001405static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001406PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001407{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001408 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001409 char *mode = "r";
1410 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001411#ifdef MS_WIN32
1412 intptr_t fd;
1413#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001414 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001415#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001416 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001417 PyObject *f;
1418
Guido van Rossum43713e52000-02-29 13:59:29 +00001419 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001420 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001421#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001422 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1423 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001424#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001425 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001426#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001427 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001428 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001429 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001430 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001431 }
1432 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1433 if (f != NULL)
1434 PyFile_SetBufSize(f, bufsize);
1435 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001436}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001437
1438static char makefile_doc[] =
1439"makefile([mode[, buffersize]]) -> file object\n\
1440\n\
1441Return a regular file object corresponding to the socket.\n\
1442The mode and buffersize arguments are as for the built-in open() function.";
1443
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001444#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001445
Guido van Rossum48a680c2001-03-02 06:34:14 +00001446
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001447/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001448
Guido van Rossum73624e91994-10-10 17:59:00 +00001449static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001450PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001451{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001452 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001453 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001454 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001455 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001456 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001457 if (buf == NULL)
1458 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001459 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001460 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001461 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001462 if (n < 0) {
1463 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001464 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001465 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001466 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001467 return NULL;
1468 return buf;
1469}
1470
Guido van Rossum82a5c661998-07-07 20:45:43 +00001471static char recv_doc[] =
1472"recv(buffersize[, flags]) -> data\n\
1473\n\
1474Receive up to buffersize bytes from the socket. For the optional flags\n\
1475argument, see the Unix manual. When no data is available, block until\n\
1476at least one byte is available or until the remote end is closed. When\n\
1477the remote end is closed and all data is read, return the empty string.";
1478
Guido van Rossum30a685f1991-06-27 15:51:29 +00001479
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001480/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001481
Guido van Rossum73624e91994-10-10 17:59:00 +00001482static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001483PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001484{
1485 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001486 PyObject *buf = NULL;
1487 PyObject *addr = NULL;
1488 PyObject *ret = NULL;
1489
Guido van Rossumff3ab422000-04-24 15:16:03 +00001490 int len, n, flags = 0;
1491 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001492 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001493 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001494 if (!getsockaddrlen(s, &addrlen))
1495 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001496 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001497 if (buf == NULL)
1498 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001499 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001500 memset(addrbuf, 0, addrlen);
1501 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001502#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001503#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001504 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001505#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001506 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001507#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001508#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001509 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001510#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001511 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001512 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001513 if (n < 0) {
1514 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001515 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001516 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001517 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001518 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001519
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001520 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001521 goto finally;
1522
Guido van Rossum73624e91994-10-10 17:59:00 +00001523 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001524 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001525 Py_XDECREF(addr);
1526 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001527 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001528}
1529
Guido van Rossum82a5c661998-07-07 20:45:43 +00001530static char recvfrom_doc[] =
1531"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1532\n\
1533Like recv(buffersize, flags) but also return the sender's address info.";
1534
Guido van Rossum30a685f1991-06-27 15:51:29 +00001535
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001536/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001537
Guido van Rossum73624e91994-10-10 17:59:00 +00001538static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001539PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001540{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001541 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001542 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001543 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001544 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001545 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001546 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001547 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001548 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001549 return PySocket_Err();
1550 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001551}
1552
Guido van Rossum82a5c661998-07-07 20:45:43 +00001553static char send_doc[] =
1554"send(data[, flags])\n\
1555\n\
1556Send a data string to the socket. For the optional flags\n\
1557argument, see the Unix manual.";
1558
Guido van Rossum30a685f1991-06-27 15:51:29 +00001559
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001560/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001561
Guido van Rossum73624e91994-10-10 17:59:00 +00001562static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001563PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001564{
Guido van Rossum73624e91994-10-10 17:59:00 +00001565 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001566 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001567 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001568 int addrlen, len, n, flags;
1569 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001570 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001571 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001572 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1573 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001574 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001575 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001576 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001577 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001578 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001579 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001580 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001581 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001582 return PySocket_Err();
1583 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001584}
1585
Guido van Rossum82a5c661998-07-07 20:45:43 +00001586static char sendto_doc[] =
1587"sendto(data[, flags], address)\n\
1588\n\
1589Like send(data, flags) but allows specifying the destination address.\n\
1590For IP sockets, the address is a pair (hostaddr, port).";
1591
Guido van Rossum30a685f1991-06-27 15:51:29 +00001592
1593/* s.shutdown(how) method */
1594
Guido van Rossum73624e91994-10-10 17:59:00 +00001595static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001596PySocketSock_shutdown(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001597{
1598 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001599 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001600 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001601 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001602 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001603 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001604 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001605 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001606 return PySocket_Err();
1607 Py_INCREF(Py_None);
1608 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001609}
1610
Guido van Rossum82a5c661998-07-07 20:45:43 +00001611static char shutdown_doc[] =
1612"shutdown(flag)\n\
1613\n\
1614Shut down the reading side of the socket (flag == 0), the writing side\n\
1615of the socket (flag == 1), or both ends (flag == 2).";
1616
Guido van Rossum30a685f1991-06-27 15:51:29 +00001617
1618/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001619
Guido van Rossum73624e91994-10-10 17:59:00 +00001620static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001621 {"accept", (PyCFunction)PySocketSock_accept, METH_VARARGS,
1622 accept_doc},
1623 {"bind", (PyCFunction)PySocketSock_bind, METH_VARARGS,
1624 bind_doc},
1625 {"close", (PyCFunction)PySocketSock_close, METH_VARARGS,
1626 close_doc},
1627 {"connect", (PyCFunction)PySocketSock_connect, METH_VARARGS,
1628 connect_doc},
1629 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_VARARGS,
1630 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001631#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001632 {"dup", (PyCFunction)PySocketSock_dup, METH_VARARGS,
1633 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001634#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001635 {"fileno", (PyCFunction)PySocketSock_fileno, METH_VARARGS,
1636 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001637#ifdef HAVE_GETPEERNAME
Guido van Rossum48a680c2001-03-02 06:34:14 +00001638 {"getpeername", (PyCFunction)PySocketSock_getpeername, METH_VARARGS,
1639 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001640#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001641 {"getsockname", (PyCFunction)PySocketSock_getsockname, METH_VARARGS,
1642 getsockname_doc},
1643 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1644 getsockopt_doc},
1645 {"listen", (PyCFunction)PySocketSock_listen, METH_VARARGS,
1646 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001647#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001648 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1649 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001650#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001651 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1652 recv_doc},
1653 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1654 recvfrom_doc},
1655 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1656 send_doc},
1657 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1658 sendto_doc},
1659 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_VARARGS,
1660 setblocking_doc},
1661 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1662 setsockopt_doc},
1663 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_VARARGS,
1664 shutdown_doc},
1665#ifdef RISCOS
1666 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1667 sleeptaskw_doc},
1668#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001669 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001670};
1671
Guido van Rossum30a685f1991-06-27 15:51:29 +00001672
Guido van Rossum73624e91994-10-10 17:59:00 +00001673/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001674 First close the file description. */
1675
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001676static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001677PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001678{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001679 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001680 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001681 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001682}
1683
Guido van Rossum30a685f1991-06-27 15:51:29 +00001684
1685/* Return a socket object's named attribute. */
1686
Guido van Rossum73624e91994-10-10 17:59:00 +00001687static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001688PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001689{
Guido van Rossum73624e91994-10-10 17:59:00 +00001690 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001691}
1692
Guido van Rossum30a685f1991-06-27 15:51:29 +00001693
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001694static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001695PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001696{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001697 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001698#if SIZEOF_SOCKET_T > SIZEOF_LONG
1699 if (s->sock_fd > LONG_MAX) {
1700 /* this can occur on Win64, and actually there is a special
1701 ugly printf formatter for decimal pointer length integer
1702 printing, only bother if necessary*/
1703 PyErr_SetString(PyExc_OverflowError,
1704 "no printf formatter to display the socket descriptor in decimal");
1705 return NULL;
1706 }
1707#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001708 sprintf(buf,
1709 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001710 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001711 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001712}
1713
1714
Guido van Rossumb6775db1994-08-01 11:34:53 +00001715/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001716
Guido van Rossum73624e91994-10-10 17:59:00 +00001717static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001718 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001719 0,
1720 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001721 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001722 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001723 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001724 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001725 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001726 0, /*tp_setattr*/
1727 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001728 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001729 0, /*tp_as_number*/
1730 0, /*tp_as_sequence*/
1731 0, /*tp_as_mapping*/
1732};
1733
Guido van Rossum30a685f1991-06-27 15:51:29 +00001734
Guido van Rossum81194471991-07-27 21:42:02 +00001735/* Python interface to gethostname(). */
1736
1737/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001738static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001739PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001740{
1741 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001742 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001743 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001744 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001745 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001746 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001747 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001748 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001749 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001750 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001751 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001752}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001753
Guido van Rossum82a5c661998-07-07 20:45:43 +00001754static char gethostname_doc[] =
1755"gethostname() -> string\n\
1756\n\
1757Return the current host name.";
1758
Guido van Rossumff4949e1992-08-05 19:58:53 +00001759
Guido van Rossum30a685f1991-06-27 15:51:29 +00001760/* Python interface to gethostbyname(name). */
1761
1762/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001763static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001764PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001765{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001766 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001767 struct sockaddr_storage addrbuf;
1768
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001769 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001770 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001771 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001772 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001773 return makeipaddr((struct sockaddr *)&addrbuf,
1774 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001775}
1776
Guido van Rossum82a5c661998-07-07 20:45:43 +00001777static char gethostbyname_doc[] =
1778"gethostbyname(host) -> address\n\
1779\n\
1780Return the IP address (a string of the form '255.255.255.255') for a host.";
1781
1782
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001783/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1784
1785static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001786gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001787{
1788 char **pch;
1789 PyObject *rtn_tuple = (PyObject *)NULL;
1790 PyObject *name_list = (PyObject *)NULL;
1791 PyObject *addr_list = (PyObject *)NULL;
1792 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001793
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001794 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001795 /* Let's get real error message to return */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001796 PyH_Err(h_errno);
1797 return NULL;
1798 }
1799 if (h->h_addrtype != af) {
1800#ifdef HAVE_STRERROR
1801 /* Let's get real error message to return */
1802 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001803#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001804 PyErr_SetString(PySocket_Error,
1805 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001806#endif
1807 return NULL;
1808 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001809 switch (af) {
1810 case AF_INET:
1811 if (alen < sizeof(struct sockaddr_in))
1812 return NULL;
1813 break;
1814#ifdef INET6
1815 case AF_INET6:
1816 if (alen < sizeof(struct sockaddr_in6))
1817 return NULL;
1818 break;
1819#endif
1820 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001821 if ((name_list = PyList_New(0)) == NULL)
1822 goto err;
1823 if ((addr_list = PyList_New(0)) == NULL)
1824 goto err;
1825 for (pch = h->h_aliases; *pch != NULL; pch++) {
1826 int status;
1827 tmp = PyString_FromString(*pch);
1828 if (tmp == NULL)
1829 goto err;
1830 status = PyList_Append(name_list, tmp);
1831 Py_DECREF(tmp);
1832 if (status)
1833 goto err;
1834 }
1835 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1836 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001837 switch (af) {
1838 case AF_INET:
1839 {
1840 struct sockaddr_in sin;
1841 memset(&sin, 0, sizeof(sin));
1842 sin.sin_family = af;
1843#ifdef HAVE_SOCKADDR_SA_LEN
1844 sin.sin_len = sizeof(sin);
1845#endif
1846 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
1847 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
1848 if (pch == h->h_addr_list && alen >= sizeof(sin))
1849 memcpy((char *) addr, &sin, sizeof(sin));
1850 break;
1851 }
1852#ifdef INET6
1853 case AF_INET6:
1854 {
1855 struct sockaddr_in6 sin6;
1856 memset(&sin6, 0, sizeof(sin6));
1857 sin6.sin6_family = af;
1858#ifdef HAVE_SOCKADDR_SA_LEN
1859 sin6.sin6_len = sizeof(sin6);
1860#endif
1861 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
1862 tmp = makeipaddr((struct sockaddr *)&sin6,
1863 sizeof(sin6));
1864 if (pch == h->h_addr_list && alen >= sizeof(sin6))
1865 memcpy((char *) addr, &sin6, sizeof(sin6));
1866 break;
1867 }
1868#endif
1869 default: /* can't happen */
1870 PyErr_SetString(PySocket_Error,
1871 "unsupported address family");
1872 return NULL;
1873 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001874 if (tmp == NULL)
1875 goto err;
1876 status = PyList_Append(addr_list, tmp);
1877 Py_DECREF(tmp);
1878 if (status)
1879 goto err;
1880 }
1881 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1882 err:
1883 Py_XDECREF(name_list);
1884 Py_XDECREF(addr_list);
1885 return rtn_tuple;
1886}
1887
1888
1889/* Python interface to gethostbyname_ex(name). */
1890
1891/*ARGSUSED*/
1892static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001893PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001894{
1895 char *name;
1896 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001897 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001898 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00001899 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001900#ifdef HAVE_GETHOSTBYNAME_R
1901 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001902#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1903 struct hostent_data data;
1904#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001905 char buf[16384];
1906 int buf_len = (sizeof buf) - 1;
1907 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001908#endif
1909#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001910 int result;
1911#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001912#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001913
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001914 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001915 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001916 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001917 return NULL;
1918 Py_BEGIN_ALLOW_THREADS
1919#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001920#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001921 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001922#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001923 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001924#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001925 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001926 result = gethostbyname_r(name, &hp_allocated, &data);
1927 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001928#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001929#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001930#ifdef USE_GETHOSTBYNAME_LOCK
1931 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001932#endif
1933 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001934#endif /* HAVE_GETHOSTBYNAME_R */
1935 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001936 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
1937 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
1938 sa = (struct sockaddr*)&addr;
1939 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00001940#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001941 PyThread_release_lock(gethostbyname_lock);
1942#endif
1943 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001944}
1945
1946static char ghbn_ex_doc[] =
1947"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1948\n\
1949Return the true host name, a list of aliases, and a list of IP addresses,\n\
1950for a host. The host argument is a string giving a host name or IP number.";
1951
1952
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001953/* Python interface to gethostbyaddr(IP). */
1954
1955/*ARGSUSED*/
1956static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001957PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001958{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001959#ifdef INET6
1960 struct sockaddr_storage addr;
1961#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001962 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001963#endif
1964 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001965 char *ip_num;
1966 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001967 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001968#ifdef HAVE_GETHOSTBYNAME_R
1969 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001970#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1971 struct hostent_data data;
1972#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001973 char buf[16384];
1974 int buf_len = (sizeof buf) - 1;
1975 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001976#endif
1977#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001978 int result;
1979#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001980#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001981 char *ap;
1982 int al;
1983 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001984
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001985 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001986 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001987 af = PF_UNSPEC;
1988 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001989 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001990 af = sa->sa_family;
1991 ap = NULL;
1992 al = 0;
1993 switch (af) {
1994 case AF_INET:
1995 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
1996 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
1997 break;
1998#ifdef INET6
1999 case AF_INET6:
2000 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2001 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2002 break;
2003#endif
2004 default:
2005 PyErr_SetString(PySocket_Error, "unsupported address family");
2006 return NULL;
2007 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002008 Py_BEGIN_ALLOW_THREADS
2009#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002010#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002011 result = gethostbyaddr_r(ap, al, af,
2012 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002013 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002014#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002015 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002016 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002017#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002018 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002019 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002020 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002021#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002022#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002023#ifdef USE_GETHOSTBYNAME_LOCK
2024 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002025#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002026 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002027#endif /* HAVE_GETHOSTBYNAME_R */
2028 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002029 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002030#ifdef USE_GETHOSTBYNAME_LOCK
2031 PyThread_release_lock(gethostbyname_lock);
2032#endif
2033 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002034}
2035
Guido van Rossum82a5c661998-07-07 20:45:43 +00002036static char gethostbyaddr_doc[] =
2037"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2038\n\
2039Return the true host name, a list of aliases, and a list of IP addresses,\n\
2040for a host. The host argument is a string giving a host name or IP number.";
2041
Guido van Rossum30a685f1991-06-27 15:51:29 +00002042
2043/* Python interface to getservbyname(name).
2044 This only returns the port number, since the other info is already
2045 known or not useful (like the list of aliases). */
2046
2047/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002048static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002049PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002050{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002051 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002052 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002053 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002054 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002055 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002056 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002057 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002058 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002059 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002060 return NULL;
2061 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002062 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002063}
2064
Guido van Rossum82a5c661998-07-07 20:45:43 +00002065static char getservbyname_doc[] =
2066"getservbyname(servicename, protocolname) -> integer\n\
2067\n\
2068Return a port number from a service name and protocol name.\n\
2069The protocol name should be 'tcp' or 'udp'.";
2070
Guido van Rossum30a685f1991-06-27 15:51:29 +00002071
Guido van Rossum3901d851996-12-19 16:35:04 +00002072/* Python interface to getprotobyname(name).
2073 This only returns the protocol number, since the other info is
2074 already known or not useful (like the list of aliases). */
2075
2076/*ARGSUSED*/
2077static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002078PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002079{
2080 char *name;
2081 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002082#ifdef __BEOS__
2083/* Not available in BeOS yet. - [cjh] */
2084 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2085 return NULL;
2086#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002087 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002088 return NULL;
2089 Py_BEGIN_ALLOW_THREADS
2090 sp = getprotobyname(name);
2091 Py_END_ALLOW_THREADS
2092 if (sp == NULL) {
2093 PyErr_SetString(PySocket_Error, "protocol not found");
2094 return NULL;
2095 }
2096 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002097#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002098}
2099
Guido van Rossum82a5c661998-07-07 20:45:43 +00002100static char getprotobyname_doc[] =
2101"getprotobyname(name) -> integer\n\
2102\n\
2103Return the protocol number for the named protocol. (Rarely used.)";
2104
Guido van Rossum3901d851996-12-19 16:35:04 +00002105
Guido van Rossum30a685f1991-06-27 15:51:29 +00002106/* Python interface to socket(family, type, proto).
2107 The third (protocol) argument is optional.
2108 Return a new socket object. */
2109
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002110/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002111static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002112PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002113{
Guido van Rossum73624e91994-10-10 17:59:00 +00002114 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002115 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002116 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00002117 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002118 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002119 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002120 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002121 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00002122#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002123 if (fd == INVALID_SOCKET)
2124#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002125 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002126#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002127 return PySocket_Err();
2128 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002129 /* If the object can't be created, don't forget to close the
2130 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002131 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002132 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00002133 /* From now on, ignore SIGPIPE and let the error checking
2134 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002135#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00002136 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002137#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002138 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002139}
2140
Guido van Rossum82a5c661998-07-07 20:45:43 +00002141static char socket_doc[] =
2142"socket(family, type[, proto]) -> socket object\n\
2143\n\
2144Open a socket of the given type. The family argument specifies the\n\
2145address family; it is normally AF_INET, sometimes AF_UNIX.\n\
2146The type argument specifies whether this is a stream (SOCK_STREAM)\n\
2147or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
2148specifying the default protocol.";
2149
2150
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002151#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002152/* Create a socket object from a numeric file description.
2153 Useful e.g. if stdin is a socket.
2154 Additional arguments as for socket(). */
2155
2156/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002157static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002158PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002159{
Guido van Rossum73624e91994-10-10 17:59:00 +00002160 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002161 SOCKET_T fd;
2162 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002163 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2164 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002165 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002166 /* Dup the fd so it and the socket can be closed independently */
2167 fd = dup(fd);
2168 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002169 return PySocket_Err();
2170 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002171 /* From now on, ignore SIGPIPE and let the error checking
2172 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002173#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002174 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002175#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002176 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002177}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002178
2179static char fromfd_doc[] =
2180"fromfd(fd, family, type[, proto]) -> socket object\n\
2181\n\
2182Create a socket object from the given file descriptor.\n\
2183The remaining arguments are the same as for socket().";
2184
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002185#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002186
Guido van Rossum82a5c661998-07-07 20:45:43 +00002187
Guido van Rossum006bf911996-06-12 04:04:55 +00002188static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002189PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002190{
2191 int x1, x2;
2192
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002193 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002194 return NULL;
2195 }
2196 x2 = (int)ntohs((short)x1);
2197 return PyInt_FromLong(x2);
2198}
2199
Guido van Rossum82a5c661998-07-07 20:45:43 +00002200static char ntohs_doc[] =
2201"ntohs(integer) -> integer\n\
2202\n\
2203Convert a 16-bit integer from network to host byte order.";
2204
2205
Guido van Rossum006bf911996-06-12 04:04:55 +00002206static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002207PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002208{
2209 int x1, x2;
2210
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002211 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002212 return NULL;
2213 }
2214 x2 = ntohl(x1);
2215 return PyInt_FromLong(x2);
2216}
2217
Guido van Rossum82a5c661998-07-07 20:45:43 +00002218static char ntohl_doc[] =
2219"ntohl(integer) -> integer\n\
2220\n\
2221Convert a 32-bit integer from network to host byte order.";
2222
2223
Guido van Rossum006bf911996-06-12 04:04:55 +00002224static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002225PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002226{
2227 int x1, x2;
2228
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002229 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002230 return NULL;
2231 }
2232 x2 = (int)htons((short)x1);
2233 return PyInt_FromLong(x2);
2234}
2235
Guido van Rossum82a5c661998-07-07 20:45:43 +00002236static char htons_doc[] =
2237"htons(integer) -> integer\n\
2238\n\
2239Convert a 16-bit integer from host to network byte order.";
2240
2241
Guido van Rossum006bf911996-06-12 04:04:55 +00002242static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002243PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002244{
2245 int x1, x2;
2246
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002247 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002248 return NULL;
2249 }
2250 x2 = htonl(x1);
2251 return PyInt_FromLong(x2);
2252}
2253
Guido van Rossum82a5c661998-07-07 20:45:43 +00002254static char htonl_doc[] =
2255"htonl(integer) -> integer\n\
2256\n\
2257Convert a 32-bit integer from host to network byte order.";
2258
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002259/*
2260 * socket.inet_aton() and socket.inet_ntoa() functions
2261 *
2262 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2263 *
2264 */
2265
Guido van Rossum48a680c2001-03-02 06:34:14 +00002266static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002267"inet_aton(string) -> packed 32-bit IP representation\n\
2268\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002269Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002270binary format used in low-level network functions.";
2271
2272static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002273PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002274{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002275#ifndef INADDR_NONE
2276#define INADDR_NONE (-1)
2277#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002278
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002279 /* Have to use inet_addr() instead */
2280 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002281 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002282
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002283 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002284 return NULL;
2285 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002286#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002287 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002288#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002289 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002290#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002291
2292 if (packed_addr == INADDR_NONE) { /* invalid address */
2293 PyErr_SetString(PySocket_Error,
2294 "illegal IP address string passed to inet_aton");
2295 return NULL;
2296 }
2297
2298 return PyString_FromStringAndSize((char *) &packed_addr,
2299 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002300}
2301
Guido van Rossum48a680c2001-03-02 06:34:14 +00002302static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002303"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002304\n\
2305Convert an IP address from 32-bit packed binary format to string format";
2306
2307static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002308PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002309{
2310 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002311 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002312 struct in_addr packed_addr;
2313
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002314 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002315 return NULL;
2316 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002317
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002318 if (addr_len != sizeof(packed_addr)) {
2319 PyErr_SetString(PySocket_Error,
2320 "packed IP wrong length for inet_ntoa");
2321 return NULL;
2322 }
2323
2324 memcpy(&packed_addr, packed_str, addr_len);
2325
2326 return PyString_FromString(inet_ntoa(packed_addr));
2327}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002328
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002329/* Python interface to getaddrinfo(host, port). */
2330
2331/*ARGSUSED*/
2332static PyObject *
2333PySocket_getaddrinfo(PyObject *self, PyObject *args)
2334{
2335 struct addrinfo hints, *res0, *res;
2336 PyObject *pobj = (PyObject *)NULL;
2337 char pbuf[10];
2338 char *hptr, *pptr;
2339 int family, socktype, protocol, flags;
2340 int error;
2341 PyObject *all = (PyObject *)NULL;
2342 PyObject *single = (PyObject *)NULL;
2343
2344 family = socktype = protocol = flags = 0;
2345 family = PF_UNSPEC;
2346 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2347 &hptr, &pobj, &family, &socktype,
2348 &protocol, &flags)) {
2349 return NULL;
2350 }
2351 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002352 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002353 pptr = pbuf;
2354 } else if (PyString_Check(pobj)) {
2355 pptr = PyString_AsString(pobj);
2356 } else if (pobj == Py_None) {
2357 pptr = (char *)NULL;
2358 } else {
2359 PyErr_SetString(PySocket_Error, "Int or String expected");
2360 return NULL;
2361 }
2362 memset(&hints, 0, sizeof(hints));
2363 hints.ai_family = family;
2364 hints.ai_socktype = socktype;
2365 hints.ai_protocol = protocol;
2366 hints.ai_flags = flags;
2367 error = getaddrinfo(hptr, pptr, &hints, &res0);
2368 if (error) {
2369 PyGAI_Err(error);
2370 return NULL;
2371 }
2372
2373 if ((all = PyList_New(0)) == NULL)
2374 goto err;
2375 for (res = res0; res; res = res->ai_next) {
2376 single = Py_BuildValue("iiisO", res->ai_family,
2377 res->ai_socktype, res->ai_protocol,
2378 res->ai_canonname ? res->ai_canonname : "",
2379 makesockaddr(-1, res->ai_addr, res->ai_addrlen));
2380 if (single == NULL)
2381 goto err;
2382
2383 if (PyList_Append(all, single))
2384 goto err;
2385 Py_XDECREF(single);
2386 }
2387 Py_XDECREF(pobj);
2388 return all;
2389 err:
2390 Py_XDECREF(single);
2391 Py_XDECREF(all);
2392 Py_XDECREF(pobj);
2393 return (PyObject *)NULL;
2394}
2395
2396static char getaddrinfo_doc[] =
2397"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2398 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2399\n\
2400Resolve host and port into addrinfo struct.";
2401
2402/* Python interface to getnameinfo(sa, flags). */
2403
2404/*ARGSUSED*/
2405static PyObject *
2406PySocket_getnameinfo(PyObject *self, PyObject *args)
2407{
2408 PyObject *sa = (PyObject *)NULL;
2409 int flags;
2410 char *hostp;
2411 int n, port, flowinfo, scope_id;
2412 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2413 struct addrinfo hints, *res = NULL;
2414 int error;
2415 PyObject *ret = (PyObject *)NULL;
2416
2417 flags = flowinfo = scope_id = 0;
2418 if (PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags) == 0)
2419 return NULL;
2420 n = PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, scope_id);
2421 if (n == 0)
2422 goto fail;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002423 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002424 memset(&hints, 0, sizeof(hints));
2425 hints.ai_family = PF_UNSPEC;
2426 error = getaddrinfo(hostp, pbuf, &hints, &res);
2427 if (error) {
2428 PyGAI_Err(error);
2429 goto fail;
2430 }
2431 if (res->ai_next) {
2432 PyErr_SetString(PySocket_Error,
2433 "sockaddr resolved to multiple addresses");
2434 goto fail;
2435 }
2436 switch (res->ai_family) {
2437 case AF_INET:
2438 {
2439 char *t1;
2440 int t2;
2441 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2442 PyErr_SetString(PySocket_Error,
2443 "IPv4 sockaddr must be 2 tuple");
2444 goto fail;
2445 }
2446 break;
2447 }
2448#ifdef INET6
2449 case AF_INET6:
2450 {
2451 struct sockaddr_in6 *sin6;
2452 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2453 sin6->sin6_flowinfo = flowinfo;
2454 sin6->sin6_scope_id = scope_id;
2455 break;
2456 }
2457#endif
2458 }
2459 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2460 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2461 if (error) {
2462 PyGAI_Err(error);
2463 goto fail;
2464 }
2465 ret = Py_BuildValue("ss", hbuf, pbuf);
2466
2467fail:
2468 if (res)
2469 freeaddrinfo(res);
2470 Py_XDECREF(sa);
2471 return ret;
2472}
2473
2474static char getnameinfo_doc[] =
2475"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2476\n\
2477Get host and port for a sockaddr.";
2478
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002479
2480#ifdef USE_SSL
2481
2482/* This is a C function to be called for new object initialization */
2483static SSLObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002484newSSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002485{
2486 SSLObject *self;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002487
Guido van Rossumb18618d2000-05-03 23:44:39 +00002488 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002489 if (self == NULL){
2490 PyErr_SetObject(SSLErrorObject,
2491 PyString_FromString("newSSLObject error"));
2492 return NULL;
2493 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002494 memset(self->server, '\0', sizeof(char) * 256);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002495 memset(self->issuer, '\0', sizeof(char) * 256);
2496
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002497 self->x_attr = PyDict_New();
2498 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2499 if (self->ctx == NULL) {
2500 PyErr_SetObject(SSLErrorObject,
2501 PyString_FromString("SSL_CTX_new error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002502 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002503 return NULL;
2504 }
2505
2506 if ( (key_file && !cert_file) || (!key_file && cert_file) )
2507 {
2508 PyErr_SetObject(SSLErrorObject,
2509 PyString_FromString(
2510 "Both the key & certificate files must be specified"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002511 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002512 return NULL;
2513 }
2514
2515 if (key_file && cert_file)
2516 {
2517 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
2518 SSL_FILETYPE_PEM) < 1)
2519 {
2520 PyErr_SetObject(SSLErrorObject,
2521 PyString_FromString(
2522 "SSL_CTX_use_PrivateKey_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002523 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002524 return NULL;
2525 }
2526
2527 if (SSL_CTX_use_certificate_chain_file(self->ctx,
2528 cert_file) < 1)
2529 {
2530 PyErr_SetObject(SSLErrorObject,
2531 PyString_FromString(
2532 "SSL_CTX_use_certificate_chain_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002533 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002534 return NULL;
2535 }
2536 }
2537
2538 SSL_CTX_set_verify(self->ctx,
2539 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2540 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2541 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2542 SSL_set_connect_state(self->ssl);
2543
2544 if ((SSL_connect(self->ssl)) == -1) {
2545 /* Actually negotiate SSL connection */
2546 PyErr_SetObject(SSLErrorObject,
2547 PyString_FromString("SSL_connect error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002548 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002549 return NULL;
2550 }
2551 self->ssl->debug = 1;
2552
2553 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2554 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2555 self->server, 256);
2556 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2557 self->issuer, 256);
2558 }
2559 self->x_attr = NULL;
2560 self->Socket = Sock;
2561 Py_INCREF(self->Socket);
2562 return self;
2563}
2564
2565/* This is the Python function called for new object initialization */
2566static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002567PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002568{
2569 SSLObject *rv;
2570 PySocketSockObject *Sock;
2571 char *key_file;
2572 char *cert_file;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002573
Guido van Rossum43713e52000-02-29 13:59:29 +00002574 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002575 &PySocketSock_Type, (PyObject*)&Sock,
2576 &key_file, &cert_file) )
2577 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002578
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002579 rv = newSSLObject(Sock, key_file, cert_file);
2580 if ( rv == NULL )
2581 return NULL;
2582 return (PyObject *)rv;
2583}
2584
2585static char ssl_doc[] =
2586"ssl(socket, keyfile, certfile) -> sslobject";
2587
2588static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002589SSL_server(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002590{
2591 return PyString_FromString(self->server);
2592}
2593
2594static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002595SSL_issuer(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002596{
2597 return PyString_FromString(self->issuer);
2598}
2599
2600
2601/* SSL object methods */
2602
2603static PyMethodDef SSLMethods[] = {
2604 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2605 { "read", (PyCFunction)SSL_SSLread, 1 },
2606 { "server", (PyCFunction)SSL_server, 1 },
2607 { "issuer", (PyCFunction)SSL_issuer, 1 },
2608 { NULL, NULL}
2609};
2610
2611static void SSL_dealloc(SSLObject *self)
2612{
2613 if (self->server_cert) /* Possible not to have one? */
2614 X509_free (self->server_cert);
2615 SSL_CTX_free(self->ctx);
2616 SSL_free(self->ssl);
2617 Py_XDECREF(self->x_attr);
2618 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002619 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002620}
2621
2622static PyObject *SSL_getattr(SSLObject *self, char *name)
2623{
2624 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2625}
2626
2627staticforward PyTypeObject SSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002628 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002629 0, /*ob_size*/
2630 "SSL", /*tp_name*/
2631 sizeof(SSLObject), /*tp_basicsize*/
2632 0, /*tp_itemsize*/
2633 /* methods */
2634 (destructor)SSL_dealloc, /*tp_dealloc*/
2635 0, /*tp_print*/
2636 (getattrfunc)SSL_getattr, /*tp_getattr*/
2637 0, /*tp_setattr*/
2638 0, /*tp_compare*/
2639 0, /*tp_repr*/
2640 0, /*tp_as_number*/
2641 0, /*tp_as_sequence*/
2642 0, /*tp_as_mapping*/
2643 0, /*tp_hash*/
2644};
2645
2646
2647
2648static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2649{
2650 char *data;
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002651 size_t len;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002652
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002653 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002654 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002655
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002656 len = SSL_write(self->ssl, data, len);
2657 return PyInt_FromLong((long)len);
2658}
2659
2660static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2661{
2662 PyObject *buf;
2663 int count = 0;
2664 int len = 1024;
2665 int res;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002666
Guido van Rossum43713e52000-02-29 13:59:29 +00002667 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002668
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002669 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2670 return NULL; /* Error object should already be set */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002671
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002672 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2673 res = SSL_get_error(self->ssl, count);
2674
2675 switch (res) {
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002676 case SSL_ERROR_NONE:
2677 assert(count > 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002678 break;
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002679 case SSL_ERROR_ZERO_RETURN: /* normal EOF */
2680 assert(count == 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002681 break;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002682 default:
2683 return PyErr_SetFromErrno(SSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002684 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002685
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002686 fflush(stderr);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002687
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002688 if (count < 0) {
2689 Py_DECREF(buf);
2690 return PyErr_SetFromErrno(SSLErrorObject);
2691 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002692
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002693 if (count != len && _PyString_Resize(&buf, count) < 0)
2694 return NULL;
2695 return buf;
2696}
2697
2698#endif /* USE_SSL */
2699
2700
Guido van Rossum30a685f1991-06-27 15:51:29 +00002701/* List of functions exported by this module. */
2702
Guido van Rossum73624e91994-10-10 17:59:00 +00002703static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002704 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002705 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002706 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002707 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002708 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002709 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002710 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002711 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002712 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002713 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002714 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002715 METH_VARARGS,getprotobyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002716 {"socket", PySocket_socket,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002717 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002718#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002719 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002720 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002721#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002722 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002723 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002724 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002725 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002726 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002727 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002728 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002729 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002730 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002731 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002732 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002733 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002734 {"getaddrinfo", PySocket_getaddrinfo,
2735 METH_VARARGS, getaddrinfo_doc},
2736 {"getnameinfo", PySocket_getnameinfo,
2737 METH_VARARGS, getnameinfo_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002738#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002739 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002740 METH_VARARGS, ssl_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002741#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002742 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002743};
2744
Guido van Rossum30a685f1991-06-27 15:51:29 +00002745
2746/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002747 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002748 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002749 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002750static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002751insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002752{
Guido van Rossum73624e91994-10-10 17:59:00 +00002753 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002754 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002755 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002756
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002757 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002758}
2759
Guido van Rossum30a685f1991-06-27 15:51:29 +00002760
Guido van Rossum8d665e61996-06-26 18:22:49 +00002761#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002762
2763/* Additional initialization and cleanup for NT/Windows */
2764
2765static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002766NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002767{
2768 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002769}
2770
2771static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002772NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002773{
2774 WSADATA WSAData;
2775 int ret;
2776 char buf[100];
2777 ret = WSAStartup(0x0101, &WSAData);
2778 switch (ret) {
2779 case 0: /* no error */
2780 atexit(NTcleanup);
2781 return 1;
2782 case WSASYSNOTREADY:
2783 PyErr_SetString(PyExc_ImportError,
2784 "WSAStartup failed: network not ready");
2785 break;
2786 case WSAVERNOTSUPPORTED:
2787 case WSAEINVAL:
2788 PyErr_SetString(PyExc_ImportError,
2789 "WSAStartup failed: requested version not supported");
2790 break;
2791 default:
2792 sprintf(buf, "WSAStartup failed: error code %d", ret);
2793 PyErr_SetString(PyExc_ImportError, buf);
2794 break;
2795 }
2796 return 0;
2797}
2798
Guido van Rossum8d665e61996-06-26 18:22:49 +00002799#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002800
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002801#if defined(PYOS_OS2)
2802
2803/* Additional initialization and cleanup for OS/2 */
2804
2805static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002806OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002807{
2808 /* No cleanup is necessary for OS/2 Sockets */
2809}
2810
2811static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002812OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002813{
2814 char reason[64];
2815 int rc = sock_init();
2816
2817 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002818 atexit(OS2cleanup);
2819 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002820 }
2821
2822 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2823 PyErr_SetString(PyExc_ImportError, reason);
2824
Guido van Rossum32c575d1997-12-02 20:37:32 +00002825 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002826}
2827
2828#endif /* PYOS_OS2 */
2829
Guido van Rossum30a685f1991-06-27 15:51:29 +00002830/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002831 * This is called when the first 'import socket' is done,
2832 * via a table in config.c, if config.c is compiled with USE_SOCKET
2833 * defined.
2834 *
2835 * For MS_WINDOWS (which means any Windows variant), this module
2836 * is actually called "_socket", and there's a wrapper "socket.py"
2837 * which implements some missing functionality (such as makefile(),
2838 * dup() and fromfd()). The import of "_socket" may fail with an
2839 * ImportError exception if initialization of WINSOCK fails. When
2840 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2841 * scheduled to be made at exit time.
2842 *
2843 * For OS/2, this module is also called "_socket" and uses a wrapper
2844 * "socket.py" which implements that functionality that is missing
2845 * when PC operating systems don't put socket descriptors in the
2846 * operating system's filesystem layer.
2847 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002848
Guido van Rossum82a5c661998-07-07 20:45:43 +00002849static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002850"Implementation module for socket operations. See the socket module\n\
2851for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002852
2853static char sockettype_doc[] =
2854"A socket represents one endpoint of a network connection.\n\
2855\n\
2856Methods:\n\
2857\n\
2858accept() -- accept a connection, returning new socket and client address\n\
2859bind() -- bind the socket to a local address\n\
2860close() -- close the socket\n\
2861connect() -- connect the socket to a remote address\n\
2862connect_ex() -- connect, return an error code instead of an exception \n\
2863dup() -- return a new socket object identical to the current one (*)\n\
2864fileno() -- return underlying file descriptor\n\
2865getpeername() -- return remote address (*)\n\
2866getsockname() -- return local address\n\
2867getsockopt() -- get socket options\n\
2868listen() -- start listening for incoming connections\n\
2869makefile() -- return a file object corresponding tot the socket (*)\n\
2870recv() -- receive data\n\
2871recvfrom() -- receive data and sender's address\n\
2872send() -- send data\n\
2873sendto() -- send data to a given address\n\
2874setblocking() -- set or clear the blocking I/O flag\n\
2875setsockopt() -- set socket options\n\
2876shutdown() -- shut down traffic in one or both directions\n\
2877\n\
2878(*) not available on all platforms!)";
2879
Guido van Rossum3886bb61998-12-04 18:50:17 +00002880DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002881init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002882{
Guido van Rossum73624e91994-10-10 17:59:00 +00002883 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002884#ifdef RISCOS
2885 _kernel_swi_regs r;
2886 r.r[0]=0;
2887 _kernel_swi(0x43380, &r, &r);
2888 taskwindow = r.r[0];
2889#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002890#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002891 if (!NTinit())
2892 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002893#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002894#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002895 if (!OS2init())
2896 return;
Fred Drakea136d492000-08-16 14:18:30 +00002897#endif /* __TOS_OS2__ */
2898#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002899#endif /* RISCOS */
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002900#ifdef USE_SSL
2901 SSL_Type.ob_type = &PyType_Type;
2902#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002903 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00002904 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002905 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2906 if (PySocket_Error == NULL)
2907 return;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002908 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
2909 if (PyH_Error == NULL)
2910 return;
2911 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
2912 NULL);
2913 if (PyGAI_Error == NULL)
2914 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002915#ifdef USE_SSL
2916 SSL_load_error_strings();
2917 SSLeay_add_ssl_algorithms();
2918 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2919 if (SSLErrorObject == NULL)
2920 return;
2921 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2922 Py_INCREF(&SSL_Type);
2923 if (PyDict_SetItemString(d, "SSLType",
2924 (PyObject *)&SSL_Type) != 0)
2925 return;
2926#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002927 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002928 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002929 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002930 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002931 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002932 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002933 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002934
2935 /* Address families (we only support AF_INET and AF_UNIX) */
2936#ifdef AF_UNSPEC
2937 insint(d, "AF_UNSPEC", AF_UNSPEC);
2938#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002939 insint(d, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002940#ifdef AF_INET6
2941 insint(d, "AF_INET6", AF_INET6);
2942#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002943#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002944 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002945#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002946#ifdef AF_AX25
2947 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2948#endif
2949#ifdef AF_IPX
2950 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2951#endif
2952#ifdef AF_APPLETALK
2953 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2954#endif
2955#ifdef AF_NETROM
2956 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2957#endif
2958#ifdef AF_BRIDGE
2959 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2960#endif
2961#ifdef AF_AAL5
2962 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2963#endif
2964#ifdef AF_X25
2965 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2966#endif
2967#ifdef AF_INET6
2968 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2969#endif
2970#ifdef AF_ROSE
2971 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2972#endif
Jeremy Hylton22308652001-02-02 03:23:09 +00002973#if defined(linux) && defined(AF_PACKET)
2974 insint(d, "AF_PACKET", AF_PACKET);
2975 insint(d, "PF_PACKET", PF_PACKET);
2976 insint(d, "PACKET_HOST", PACKET_HOST);
2977 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
2978 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
2979 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
2980 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
2981 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
2982 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002983#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002984
2985 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002986 insint(d, "SOCK_STREAM", SOCK_STREAM);
2987 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002988#ifndef __BEOS__
2989/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002990 insint(d, "SOCK_RAW", SOCK_RAW);
2991 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2992 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002993#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002994
2995#ifdef SO_DEBUG
2996 insint(d, "SO_DEBUG", SO_DEBUG);
2997#endif
2998#ifdef SO_ACCEPTCONN
2999 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
3000#endif
3001#ifdef SO_REUSEADDR
3002 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
3003#endif
3004#ifdef SO_KEEPALIVE
3005 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
3006#endif
3007#ifdef SO_DONTROUTE
3008 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
3009#endif
3010#ifdef SO_BROADCAST
3011 insint(d, "SO_BROADCAST", SO_BROADCAST);
3012#endif
3013#ifdef SO_USELOOPBACK
3014 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
3015#endif
3016#ifdef SO_LINGER
3017 insint(d, "SO_LINGER", SO_LINGER);
3018#endif
3019#ifdef SO_OOBINLINE
3020 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
3021#endif
3022#ifdef SO_REUSEPORT
3023 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
3024#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003025#ifdef SO_SNDBUF
3026 insint(d, "SO_SNDBUF", SO_SNDBUF);
3027#endif
3028#ifdef SO_RCVBUF
3029 insint(d, "SO_RCVBUF", SO_RCVBUF);
3030#endif
3031#ifdef SO_SNDLOWAT
3032 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
3033#endif
3034#ifdef SO_RCVLOWAT
3035 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
3036#endif
3037#ifdef SO_SNDTIMEO
3038 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
3039#endif
3040#ifdef SO_RCVTIMEO
3041 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
3042#endif
3043#ifdef SO_ERROR
3044 insint(d, "SO_ERROR", SO_ERROR);
3045#endif
3046#ifdef SO_TYPE
3047 insint(d, "SO_TYPE", SO_TYPE);
3048#endif
3049
3050 /* Maximum number of connections for "listen" */
3051#ifdef SOMAXCONN
3052 insint(d, "SOMAXCONN", SOMAXCONN);
3053#else
3054 insint(d, "SOMAXCONN", 5); /* Common value */
3055#endif
3056
3057 /* Flags for send, recv */
3058#ifdef MSG_OOB
3059 insint(d, "MSG_OOB", MSG_OOB);
3060#endif
3061#ifdef MSG_PEEK
3062 insint(d, "MSG_PEEK", MSG_PEEK);
3063#endif
3064#ifdef MSG_DONTROUTE
3065 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
3066#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003067#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00003068 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003069#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003070#ifdef MSG_EOR
3071 insint(d, "MSG_EOR", MSG_EOR);
3072#endif
3073#ifdef MSG_TRUNC
3074 insint(d, "MSG_TRUNC", MSG_TRUNC);
3075#endif
3076#ifdef MSG_CTRUNC
3077 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
3078#endif
3079#ifdef MSG_WAITALL
3080 insint(d, "MSG_WAITALL", MSG_WAITALL);
3081#endif
3082#ifdef MSG_BTAG
3083 insint(d, "MSG_BTAG", MSG_BTAG);
3084#endif
3085#ifdef MSG_ETAG
3086 insint(d, "MSG_ETAG", MSG_ETAG);
3087#endif
3088
3089 /* Protocol level and numbers, usable for [gs]etsockopt */
3090#ifdef SOL_SOCKET
3091 insint(d, "SOL_SOCKET", SOL_SOCKET);
3092#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003093#ifdef SOL_IP
3094 insint(d, "SOL_IP", SOL_IP);
3095#else
3096 insint(d, "SOL_IP", 0);
3097#endif
3098#ifdef SOL_IPX
3099 insint(d, "SOL_IPX", SOL_IPX);
3100#endif
3101#ifdef SOL_AX25
3102 insint(d, "SOL_AX25", SOL_AX25);
3103#endif
3104#ifdef SOL_ATALK
3105 insint(d, "SOL_ATALK", SOL_ATALK);
3106#endif
3107#ifdef SOL_NETROM
3108 insint(d, "SOL_NETROM", SOL_NETROM);
3109#endif
3110#ifdef SOL_ROSE
3111 insint(d, "SOL_ROSE", SOL_ROSE);
3112#endif
3113#ifdef SOL_TCP
3114 insint(d, "SOL_TCP", SOL_TCP);
3115#else
3116 insint(d, "SOL_TCP", 6);
3117#endif
3118#ifdef SOL_UDP
3119 insint(d, "SOL_UDP", SOL_UDP);
3120#else
3121 insint(d, "SOL_UDP", 17);
3122#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003123#ifdef IPPROTO_IP
3124 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003125#else
3126 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003127#endif
3128#ifdef IPPROTO_ICMP
3129 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003130#else
3131 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003132#endif
3133#ifdef IPPROTO_IGMP
3134 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
3135#endif
3136#ifdef IPPROTO_GGP
3137 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
3138#endif
3139#ifdef IPPROTO_TCP
3140 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003141#else
3142 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003143#endif
3144#ifdef IPPROTO_EGP
3145 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
3146#endif
3147#ifdef IPPROTO_PUP
3148 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
3149#endif
3150#ifdef IPPROTO_UDP
3151 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003152#else
3153 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003154#endif
3155#ifdef IPPROTO_IDP
3156 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
3157#endif
3158#ifdef IPPROTO_HELLO
3159 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
3160#endif
3161#ifdef IPPROTO_ND
3162 insint(d, "IPPROTO_ND", IPPROTO_ND);
3163#endif
3164#ifdef IPPROTO_TP
3165 insint(d, "IPPROTO_TP", IPPROTO_TP);
3166#endif
3167#ifdef IPPROTO_XTP
3168 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
3169#endif
3170#ifdef IPPROTO_EON
3171 insint(d, "IPPROTO_EON", IPPROTO_EON);
3172#endif
3173#ifdef IPPROTO_BIP
3174 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
3175#endif
3176/**/
3177#ifdef IPPROTO_RAW
3178 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003179#else
3180 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003181#endif
3182#ifdef IPPROTO_MAX
3183 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
3184#endif
3185
3186 /* Some port configuration */
3187#ifdef IPPORT_RESERVED
3188 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
3189#else
3190 insint(d, "IPPORT_RESERVED", 1024);
3191#endif
3192#ifdef IPPORT_USERRESERVED
3193 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
3194#else
3195 insint(d, "IPPORT_USERRESERVED", 5000);
3196#endif
3197
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003198 /* Some reserved IP v.4 addresses */
3199#ifdef INADDR_ANY
3200 insint(d, "INADDR_ANY", INADDR_ANY);
3201#else
3202 insint(d, "INADDR_ANY", 0x00000000);
3203#endif
3204#ifdef INADDR_BROADCAST
3205 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
3206#else
3207 insint(d, "INADDR_BROADCAST", 0xffffffff);
3208#endif
3209#ifdef INADDR_LOOPBACK
3210 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
3211#else
3212 insint(d, "INADDR_LOOPBACK", 0x7F000001);
3213#endif
3214#ifdef INADDR_UNSPEC_GROUP
3215 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
3216#else
3217 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
3218#endif
3219#ifdef INADDR_ALLHOSTS_GROUP
3220 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
3221#else
3222 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
3223#endif
3224#ifdef INADDR_MAX_LOCAL_GROUP
3225 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
3226#else
3227 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
3228#endif
3229#ifdef INADDR_NONE
3230 insint(d, "INADDR_NONE", INADDR_NONE);
3231#else
3232 insint(d, "INADDR_NONE", 0xffffffff);
3233#endif
3234
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003235 /* IP [gs]etsockopt options */
3236#ifdef IP_OPTIONS
3237 insint(d, "IP_OPTIONS", IP_OPTIONS);
3238#endif
3239#ifdef IP_HDRINCL
3240 insint(d, "IP_HDRINCL", IP_HDRINCL);
3241#endif
3242#ifdef IP_TOS
3243 insint(d, "IP_TOS", IP_TOS);
3244#endif
3245#ifdef IP_TTL
3246 insint(d, "IP_TTL", IP_TTL);
3247#endif
3248#ifdef IP_RECVOPTS
3249 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
3250#endif
3251#ifdef IP_RECVRETOPTS
3252 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
3253#endif
3254#ifdef IP_RECVDSTADDR
3255 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
3256#endif
3257#ifdef IP_RETOPTS
3258 insint(d, "IP_RETOPTS", IP_RETOPTS);
3259#endif
3260#ifdef IP_MULTICAST_IF
3261 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
3262#endif
3263#ifdef IP_MULTICAST_TTL
3264 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
3265#endif
3266#ifdef IP_MULTICAST_LOOP
3267 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
3268#endif
3269#ifdef IP_ADD_MEMBERSHIP
3270 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
3271#endif
3272#ifdef IP_DROP_MEMBERSHIP
3273 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
3274#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003275#ifdef IP_DEFAULT_MULTICAST_TTL
3276 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
3277#endif
3278#ifdef IP_DEFAULT_MULTICAST_LOOP
3279 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
3280#endif
3281#ifdef IP_MAX_MEMBERSHIPS
3282 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
3283#endif
3284
3285 /* TCP options */
3286#ifdef TCP_NODELAY
3287 insint(d, "TCP_NODELAY", TCP_NODELAY);
3288#endif
3289#ifdef TCP_MAXSEG
3290 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
3291#endif
3292
3293 /* IPX options */
3294#ifdef IPX_TYPE
3295 insint(d, "IPX_TYPE", IPX_TYPE);
3296#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003297
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003298 /* get{addr,name}info parameters */
3299#ifdef EAI_ADDRFAMILY
3300 insint(d, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
3301#endif
3302#ifdef EAI_AGAIN
3303 insint(d, "EAI_AGAIN", EAI_AGAIN);
3304#endif
3305#ifdef EAI_BADFLAGS
3306 insint(d, "EAI_BADFLAGS", EAI_BADFLAGS);
3307#endif
3308#ifdef EAI_FAIL
3309 insint(d, "EAI_FAIL", EAI_FAIL);
3310#endif
3311#ifdef EAI_FAMILY
3312 insint(d, "EAI_FAMILY", EAI_FAMILY);
3313#endif
3314#ifdef EAI_MEMORY
3315 insint(d, "EAI_MEMORY", EAI_MEMORY);
3316#endif
3317#ifdef EAI_NODATA
3318 insint(d, "EAI_NODATA", EAI_NODATA);
3319#endif
3320#ifdef EAI_NONAME
3321 insint(d, "EAI_NONAME", EAI_NONAME);
3322#endif
3323#ifdef EAI_SERVICE
3324 insint(d, "EAI_SERVICE", EAI_SERVICE);
3325#endif
3326#ifdef EAI_SOCKTYPE
3327 insint(d, "EAI_SOCKTYPE", EAI_SOCKTYPE);
3328#endif
3329#ifdef EAI_SYSTEM
3330 insint(d, "EAI_SYSTEM", EAI_SYSTEM);
3331#endif
3332#ifdef EAI_BADHINTS
3333 insint(d, "EAI_BADHINTS", EAI_BADHINTS);
3334#endif
3335#ifdef EAI_PROTOCOL
3336 insint(d, "EAI_PROTOCOL", EAI_PROTOCOL);
3337#endif
3338#ifdef EAI_MAX
3339 insint(d, "EAI_MAX", EAI_MAX);
3340#endif
3341#ifdef AI_PASSIVE
3342 insint(d, "AI_PASSIVE", AI_PASSIVE);
3343#endif
3344#ifdef AI_CANONNAME
3345 insint(d, "AI_CANONNAME", AI_CANONNAME);
3346#endif
3347#ifdef AI_NUMERICHOST
3348 insint(d, "AI_NUMERICHOST", AI_NUMERICHOST);
3349#endif
3350#ifdef AI_MASK
3351 insint(d, "AI_MASK", AI_MASK);
3352#endif
3353#ifdef AI_ALL
3354 insint(d, "AI_ALL", AI_ALL);
3355#endif
3356#ifdef AI_V4MAPPED_CFG
3357 insint(d, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
3358#endif
3359#ifdef AI_ADDRCONFIG
3360 insint(d, "AI_ADDRCONFIG", AI_ADDRCONFIG);
3361#endif
3362#ifdef AI_V4MAPPED
3363 insint(d, "AI_V4MAPPED", AI_V4MAPPED);
3364#endif
3365#ifdef AI_DEFAULT
3366 insint(d, "AI_DEFAULT", AI_DEFAULT);
3367#endif
3368#ifdef NI_MAXHOST
3369 insint(d, "NI_MAXHOST", NI_MAXHOST);
3370#endif
3371#ifdef NI_MAXSERV
3372 insint(d, "NI_MAXSERV", NI_MAXSERV);
3373#endif
3374#ifdef NI_NOFQDN
3375 insint(d, "NI_NOFQDN", NI_NOFQDN);
3376#endif
3377#ifdef NI_NUMERICHOST
3378 insint(d, "NI_NUMERICHOST", NI_NUMERICHOST);
3379#endif
3380#ifdef NI_NAMEREQD
3381 insint(d, "NI_NAMEREQD", NI_NAMEREQD);
3382#endif
3383#ifdef NI_NUMERICSERV
3384 insint(d, "NI_NUMERICSERV", NI_NUMERICSERV);
3385#endif
3386#ifdef NI_DGRAM
3387 insint(d, "NI_DGRAM", NI_DGRAM);
3388#endif
3389
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003390 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003391#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003392 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003393#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003394}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003395
3396/* Simplistic emulation code for inet_pton that only works for IPv4 */
3397#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003398int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003399inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003400{
3401 if(af == AF_INET){
3402 long packed_addr;
3403#ifdef USE_GUSI1
3404 packed_addr = (long)inet_addr(src).s_addr;
3405#else
3406 packed_addr = inet_addr(src);
3407#endif
3408 if (packed_addr == INADDR_NONE)
3409 return 0;
3410 memcpy(dst, &packed_addr, 4);
3411 return 1;
3412 }
3413 /* Should set errno to EAFNOSUPPORT */
3414 return -1;
3415}
3416
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003417const char *
3418inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003419{
3420 if (af == AF_INET) {
3421 struct in_addr packed_addr;
3422 if (size < 16)
3423 /* Should set errno to ENOSPC. */
3424 return NULL;
3425 memcpy(&packed_addr, src, sizeof(packed_addr));
3426 return strncpy(dst, inet_ntoa(packed_addr), size);
3427 }
3428 /* Should set errno to EAFNOSUPPORT */
3429 return NULL;
3430}
3431#endif