blob: 4f35b32bc0a45bc907785ac2d8d9e37156ddd32d [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
4This module provides an interface to Berkeley socket IPC.
5
6Limitations:
7
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008- only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Jeremy Hylton22308652001-02-02 03:23:09 +00009 portable manner, though AF_PACKET is supported under Linux.
Guido van Rossum384ca9c2001-10-27 22:20:47 +000010- no read/write operations (use sendall/recv or makefile instead)
11- additional restrictions apply on Windows (compensated for by socket.py)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000012
Guido van Rossum27e177d1995-03-16 15:43:47 +000013Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000014
Guido van Rossum27e177d1995-03-16 15:43:47 +000015- socket.error: exception raised for socket specific errors
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000016- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
17 a subclass of socket.error
18- socket.herror: exception raised for gethostby* errors,
19 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000020- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000021- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000022- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000023- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000024- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000025- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000026- socket.ntohs(16 bit value) --> new int object
27- socket.ntohl(32 bit value) --> new int object
28- socket.htons(16 bit value) --> new int object
29- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000030- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
31 --> List of (family, socktype, proto, canonname, sockaddr)
32- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000033- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +000034- socket.inet_aton(IP address) -> 32-bit packed IP representation
35- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum6574b3e1991-06-25 21:36:08 +000036- an Internet socket address is a pair (hostname, port)
37 where hostname can be anything recognized by gethostbyname()
38 (including the dd.dd.dd.dd notation) and port is in host byte order
39- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000040- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000041- an AF_PACKET socket address is a tuple containing a string
42 specifying the ethernet interface and an integer specifying
43 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000044 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
45 specify packet-type and ha-type/addr -- these are ignored by
Jeremy Hylton22308652001-02-02 03:23:09 +000046 networking code, but accepted since they are returned by the
47 getsockname() method.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048
Guido van Rossum30a685f1991-06-27 15:51:29 +000049Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000050
Guido van Rossum81194471991-07-27 21:42:02 +000051- s.accept() --> new socket object, sockaddr
Fred Drake728819a2000-07-01 03:40:12 +000052- s.bind(sockaddr) --> None
Guido van Rossum27e177d1995-03-16 15:43:47 +000053- s.close() --> None
Fred Drake728819a2000-07-01 03:40:12 +000054- s.connect(sockaddr) --> None
55- s.connect_ex(sockaddr) --> 0 or errno (handy for e.g. async connect)
Guido van Rossum27e177d1995-03-16 15:43:47 +000056- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000057- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000058- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000059- s.getsockname() --> sockaddr
60- s.getsockopt(level, optname[, buflen]) --> int or string
61- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000062- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000063- s.recv(buflen [,flags]) --> string
64- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000065- s.send(string [,flags]) --> nbytes
Guido van Rossum9f7a5392001-10-26 03:25:00 +000066- s.sendall(string [,flags]) # tries to send everything in a loop
Guido van Rossumb6775db1994-08-01 11:34:53 +000067- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000068- s.setblocking(0 | 1) --> None
69- s.setsockopt(level, optname, value) --> None
70- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000071- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000072
Guido van Rossum6574b3e1991-06-25 21:36:08 +000073*/
74
Guido van Rossum73624e91994-10-10 17:59:00 +000075#include "Python.h"
Guido van Rossum3baaa131999-03-22 21:44:51 +000076
Guido van Rossum384ca9c2001-10-27 22:20:47 +000077/* XXX This is a terrible mess of of platform-dependent preprocessor hacks.
78 I hope some day someone can clean this up please... */
79
Guido van Rossum9376b741999-09-15 22:01:40 +000080/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
81 script doesn't get this right, so we hardcode some platform checks below.
82 On the other hand, not all Linux versions agree, so there the settings
83 computed by the configure script are needed! */
84
85#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000086# undef HAVE_GETHOSTBYNAME_R_3_ARG
87# undef HAVE_GETHOSTBYNAME_R_5_ARG
88# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +000089#endif
Guido van Rossume7de2061999-03-24 17:24:33 +000090
Guido van Rossum7a122991999-04-13 04:07:32 +000091#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000092# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +000093#endif
94
Guido van Rossume7de2061999-03-24 17:24:33 +000095#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000096# if defined(_AIX) || defined(__osf__)
97# define HAVE_GETHOSTBYNAME_R_3_ARG
98# elif defined(__sun) || defined(__sgi)
99# define HAVE_GETHOSTBYNAME_R_5_ARG
100# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000101/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000102# else
103# undef HAVE_GETHOSTBYNAME_R
104# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000105#endif
106
Guido van Rossum3baaa131999-03-22 21:44:51 +0000107#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000108# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000109#endif
110
111#ifdef USE_GETHOSTBYNAME_LOCK
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000112# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000113#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000114
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000115#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000116# include <types.h>
117# include <io.h>
118# include <sys/ioctl.h>
119# include <utils.h>
120# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000121#endif
122
123#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000124# define INCL_DOS
125# define INCL_DOSERRORS
126# define INCL_NOPMAPI
127# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000128#endif
129
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000130/* Generic includes */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000131#include <sys/types.h>
Guido van Rossum81194471991-07-27 21:42:02 +0000132#include <signal.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000133
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000134/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000135#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000136#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000137
138/* Addressing includes */
139
Guido van Rossum6f489d91996-06-28 20:15:15 +0000140#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000141
142/* Non-MS WINDOWS includes */
143# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000144
Guido van Rossum9376b741999-09-15 22:01:40 +0000145/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000146# ifdef __BEOS__
147# include <net/netdb.h>
148# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
149# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000150typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000151# else
152# ifndef USE_GUSI1
153# include <arpa/inet.h>
154# endif
155# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000156
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000157# ifndef RISCOS
158# include <fcntl.h>
159# else
160# include <sys/fcntl.h>
161# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000162int h_errno; /* not used */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000163# endif
164
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000165#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000166
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167/* MS_WINDOWS includes */
168# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000169
Jeremy Hylton22308652001-02-02 03:23:09 +0000170#endif
171
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000172#ifdef HAVE_STDDEF_H
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000173# include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000174#endif
175
176#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000177# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000178#endif
179
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000180#ifndef O_NDELAY
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000181# define O_NDELAY O_NONBLOCK /* For QNX only? */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000182#endif
183
Guido van Rossumff3ab422000-04-24 15:16:03 +0000184#ifdef USE_GUSI1
Jack Jansen508537b1996-02-14 15:57:45 +0000185/* fdopen() isn't declared in stdio.h (sigh) */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000186# include <GUSI.h>
Jack Jansen508537b1996-02-14 15:57:45 +0000187#endif
188
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000189#include "addrinfo.h"
190
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000191#ifndef HAVE_INET_PTON
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000192int inet_pton (int af, const char *src, void *dst);
193const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000194#endif
195
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000196#ifdef __APPLE__
197/* On OS X, getaddrinfo returns no error indication of lookup
198 failure, so we must use the emulation instead of the libinfo
199 implementation. Unfortunately, performing an autoconf test
200 for this bug would require DNS access for the machine performing
201 the configuration, which is not acceptable. Therefore, we
202 determine the bug just by checking for __APPLE__. If this bug
203 gets ever fixed, perhaps checking for sys/version.h would be
204 appropriate, which is 10/0 on the system with the bug. */
205#undef HAVE_GETADDRINFO
206/* avoid clashes with the C library definition of the symbol. */
207#define getaddrinfo fake_getaddrinfo
208#endif
209
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000210/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000211#if !defined(HAVE_GETADDRINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000212#include "getaddrinfo.c"
213#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000214#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000215#include "getnameinfo.c"
216#endif
217
Guido van Rossumbcc20741998-08-04 22:53:56 +0000218#if defined(MS_WINDOWS) || defined(__BEOS__)
219/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000220/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000221#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000222#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000223#endif
224
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000225#ifdef MS_WIN32
226# define EAFNOSUPPORT WSAEAFNOSUPPORT
227# define snprintf _snprintf
228#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000229
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000230#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000231#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000232#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000233#endif
234
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000235#ifndef SOCKETCLOSE
236#define SOCKETCLOSE close
237#endif
238
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000239/* XXX There's a problem here: *static* functions are not supposed to have
240 a Py prefix (or use CapitalizedWords). Later... */
241
Guido van Rossum30a685f1991-06-27 15:51:29 +0000242/* Global variable holding the exception type for errors detected
243 by this module (but not argument type or memory errors, etc.). */
244
Guido van Rossum73624e91994-10-10 17:59:00 +0000245static PyObject *PySocket_Error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000246static PyObject *PyH_Error;
247static PyObject *PyGAI_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000248
Guido van Rossum48a680c2001-03-02 06:34:14 +0000249#ifdef RISCOS
250/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
251static int taskwindow;
252#endif
253
Tim Peters643a7fc2002-02-17 04:13:21 +0000254/* A forward reference to the socket type object.
255 The PySocketSock_Type variable contains pointers to various functions,
256 some of which call PySocketSock_New(), which uses PySocketSock_Type, so
257 there has to be a circular reference. */
258staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000259
Guido van Rossum30a685f1991-06-27 15:51:29 +0000260/* Convenience function to raise an error according to errno
261 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000262
Guido van Rossum73624e91994-10-10 17:59:00 +0000263static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000264PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000265{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000266#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000267 int err_no = WSAGetLastError();
268 if (err_no) {
269 static struct { int no; const char *msg; } *msgp, msgs[] = {
270 { WSAEINTR, "Interrupted system call" },
271 { WSAEBADF, "Bad file descriptor" },
272 { WSAEACCES, "Permission denied" },
273 { WSAEFAULT, "Bad address" },
274 { WSAEINVAL, "Invalid argument" },
275 { WSAEMFILE, "Too many open files" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000276 { WSAEWOULDBLOCK,
Mark Hammond46a733d2000-07-24 01:45:11 +0000277 "The socket operation could not complete "
278 "without blocking" },
279 { WSAEINPROGRESS, "Operation now in progress" },
280 { WSAEALREADY, "Operation already in progress" },
281 { WSAENOTSOCK, "Socket operation on non-socket" },
282 { WSAEDESTADDRREQ, "Destination address required" },
283 { WSAEMSGSIZE, "Message too long" },
284 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
285 { WSAENOPROTOOPT, "Protocol not available" },
286 { WSAEPROTONOSUPPORT, "Protocol not supported" },
287 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
288 { WSAEOPNOTSUPP, "Operation not supported" },
289 { WSAEPFNOSUPPORT, "Protocol family not supported" },
290 { WSAEAFNOSUPPORT, "Address family not supported" },
291 { WSAEADDRINUSE, "Address already in use" },
292 { WSAEADDRNOTAVAIL,
293 "Can't assign requested address" },
294 { WSAENETDOWN, "Network is down" },
295 { WSAENETUNREACH, "Network is unreachable" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000296 { WSAENETRESET,
Mark Hammond46a733d2000-07-24 01:45:11 +0000297 "Network dropped connection on reset" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000298 { WSAECONNABORTED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000299 "Software caused connection abort" },
300 { WSAECONNRESET, "Connection reset by peer" },
301 { WSAENOBUFS, "No buffer space available" },
302 { WSAEISCONN, "Socket is already connected" },
303 { WSAENOTCONN, "Socket is not connected" },
304 { WSAESHUTDOWN, "Can't send after socket shutdown" },
305 { WSAETOOMANYREFS,
306 "Too many references: can't splice" },
307 { WSAETIMEDOUT, "Operation timed out" },
308 { WSAECONNREFUSED, "Connection refused" },
309 { WSAELOOP, "Too many levels of symbolic links" },
310 { WSAENAMETOOLONG, "File name too long" },
311 { WSAEHOSTDOWN, "Host is down" },
312 { WSAEHOSTUNREACH, "No route to host" },
313 { WSAENOTEMPTY, "Directory not empty" },
314 { WSAEPROCLIM, "Too many processes" },
315 { WSAEUSERS, "Too many users" },
316 { WSAEDQUOT, "Disc quota exceeded" },
317 { WSAESTALE, "Stale NFS file handle" },
318 { WSAEREMOTE, "Too many levels of remote in path" },
319 { WSASYSNOTREADY,
320 "Network subsystem is unvailable" },
321 { WSAVERNOTSUPPORTED,
322 "WinSock version is not supported" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000323 { WSANOTINITIALISED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000324 "Successful WSAStartup() not yet performed" },
325 { WSAEDISCON, "Graceful shutdown in progress" },
326 /* Resolver errors */
327 { WSAHOST_NOT_FOUND, "No such host is known" },
328 { WSATRY_AGAIN, "Host not found, or server failed" },
329 { WSANO_RECOVERY,
330 "Unexpected server error encountered" },
331 { WSANO_DATA, "Valid name without requested data" },
332 { WSANO_ADDRESS, "No address, look for MX record" },
333 { 0, NULL }
334 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000335 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000336 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000337
Mark Hammond46a733d2000-07-24 01:45:11 +0000338 for (msgp = msgs; msgp->msg; msgp++) {
339 if (err_no == msgp->no) {
340 msg = msgp->msg;
341 break;
342 }
343 }
344
345 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000346 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000347 PyErr_SetObject(PySocket_Error, v);
348 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000349 }
350 return NULL;
351 }
352 else
353#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000354
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000355#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000356 if (sock_errno() != NO_ERROR) {
357 APIRET rc;
358 ULONG msglen;
359 char outbuf[100];
360 int myerrorcode = sock_errno();
361
362 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
363 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
364 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
365 if (rc == NO_ERROR) {
366 PyObject *v;
367
368 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
369 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
370 char *lastc = &outbuf[ strlen(outbuf)-1 ];
371 while (lastc > outbuf && isspace(*lastc))
372 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
373 }
374 v = Py_BuildValue("(is)", myerrorcode, outbuf);
375 if (v != NULL) {
376 PyErr_SetObject(PySocket_Error, v);
377 Py_DECREF(v);
378 }
379 return NULL;
380 }
381 }
382#endif
383
Guido van Rossum73624e91994-10-10 17:59:00 +0000384 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000385}
386
Guido van Rossum30a685f1991-06-27 15:51:29 +0000387
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000388static PyObject *
389PyH_Err(int h_error)
390{
391 PyObject *v;
392
393#ifdef HAVE_HSTRERROR
394 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
395#else
396 v = Py_BuildValue("(is)", h_error, "host not found");
397#endif
398 if (v != NULL) {
Martin v. Löwis864e9ff2001-08-04 22:32:03 +0000399 PyErr_SetObject(PyH_Error, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000400 Py_DECREF(v);
401 }
402
403 return NULL;
404}
405
406
407static PyObject *
408PyGAI_Err(int error)
409{
410 PyObject *v;
411
Martin v. Löwis272cb402002-03-01 08:31:07 +0000412#ifdef EAI_SYSTEM
413 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000414 if (error == EAI_SYSTEM)
415 return PySocket_Err();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000416#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000417
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000418#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000419 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000420#else
421 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
422#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000423 if (v != NULL) {
424 PyErr_SetObject(PyGAI_Error, v);
425 Py_DECREF(v);
426 }
427
428 return NULL;
429}
430
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000431/* Initialize a new socket object. */
432
433static void
434init_sockobject(PySocketSockObject *s,
435 SOCKET_T fd, int family, int type, int proto)
436{
437#ifdef RISCOS
438 int block = 1;
439#endif
440 s->sock_fd = fd;
441 s->sock_family = family;
442 s->sock_type = type;
443 s->sock_proto = proto;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000444 s->errorhandler = &PySocket_Err;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000445#ifdef RISCOS
446 if(taskwindow) {
447 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
448 }
449#endif
450}
451
452
Guido van Rossum30a685f1991-06-27 15:51:29 +0000453/* Create a new socket object.
454 This just creates the object and initializes it.
455 If the creation fails, return NULL and set an exception (implicit
456 in NEWOBJ()). */
457
Guido van Rossum73624e91994-10-10 17:59:00 +0000458static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000459PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000460{
Guido van Rossum73624e91994-10-10 17:59:00 +0000461 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000462 s = (PySocketSockObject *)
463 PyType_GenericNew(&PySocketSock_Type, NULL, NULL);
464 if (s != NULL)
465 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000466 return s;
467}
468
Guido van Rossum30a685f1991-06-27 15:51:29 +0000469
Guido van Rossum48a680c2001-03-02 06:34:14 +0000470/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000471 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000472#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000473PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000474#endif
475
476
Guido van Rossum30a685f1991-06-27 15:51:29 +0000477/* Convert a string specifying a host name or one of a few symbolic
478 names to a numeric IP address. This usually calls gethostbyname()
479 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000480 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000481 an error occurred; then an exception is raised. */
482
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000483static int
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000484setipaddr(char* name, struct sockaddr * addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000485{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000486 struct addrinfo hints, *res;
487 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000488
Guido van Rossuma376cc51996-12-05 23:43:35 +0000489 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000490 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000491 int siz;
492 memset(&hints, 0, sizeof(hints));
493 hints.ai_family = af;
494 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
495 hints.ai_flags = AI_PASSIVE;
496 error = getaddrinfo(NULL, "0", &hints, &res);
497 if (error) {
498 PyGAI_Err(error);
499 return -1;
500 }
501 switch (res->ai_family) {
502 case AF_INET:
503 siz = 4;
504 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000505#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000506 case AF_INET6:
507 siz = 16;
508 break;
509#endif
510 default:
511 freeaddrinfo(res);
512 PyErr_SetString(PySocket_Error,
513 "unsupported address family");
514 return -1;
515 }
516 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000517 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000518 PyErr_SetString(PySocket_Error,
519 "wildcard resolved to multiple address");
520 return -1;
521 }
522 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
523 freeaddrinfo(res);
524 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000525 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000526 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000527 struct sockaddr_in *sin;
528 if (af != PF_INET && af != PF_UNSPEC) {
529 PyErr_SetString(PySocket_Error,
530 "address family mismatched");
531 return -1;
532 }
533 sin = (struct sockaddr_in *)addr_ret;
534 memset((void *) sin, '\0', sizeof(*sin));
535 sin->sin_family = AF_INET;
536#ifdef HAVE_SOCKADDR_SA_LEN
537 sin->sin_len = sizeof(*sin);
538#endif
539 sin->sin_addr.s_addr = INADDR_BROADCAST;
540 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000541 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000542 memset(&hints, 0, sizeof(hints));
543 hints.ai_family = af;
544 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000545#if defined(__digital__) && defined(__unix__)
Martin v. Löwisb8fc9722001-10-24 17:35:46 +0000546 if (error == EAI_NONAME && af == AF_UNSPEC) {
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000547 /* On Tru64 V5.1, numeric-to-addr conversion
Martin v. Löwis861a65b2001-10-24 14:36:00 +0000548 fails if no address family is given. Assume IPv4 for now.*/
549 hints.ai_family = AF_INET;
550 error = getaddrinfo(name, NULL, &hints, &res);
551 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000552#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000553 if (error) {
554 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000555 return -1;
556 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000557 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
558 freeaddrinfo(res);
559 switch (addr_ret->sa_family) {
560 case AF_INET:
561 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000562#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000563 case AF_INET6:
564 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000565#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000566 default:
567 PyErr_SetString(PySocket_Error, "unknown address family");
568 return -1;
569 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000570}
571
Guido van Rossum30a685f1991-06-27 15:51:29 +0000572
Guido van Rossum30a685f1991-06-27 15:51:29 +0000573/* Create a string object representing an IP address.
574 This is always a string of the form 'dd.dd.dd.dd' (with variable
575 size numbers). */
576
Guido van Rossum73624e91994-10-10 17:59:00 +0000577static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000578makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000579{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000580 char buf[NI_MAXHOST];
581 int error;
582
583 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
584 NI_NUMERICHOST);
585 if (error) {
586 PyGAI_Err(error);
587 return NULL;
588 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000589 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000590}
591
592
593/* Create an object representing the given socket address,
594 suitable for passing it back to bind(), connect() etc.
595 The family field of the sockaddr structure is inspected
596 to determine what kind of address it really is. */
597
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000598/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000599static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000600makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000601{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000602 if (addrlen == 0) {
603 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000604 Py_INCREF(Py_None);
605 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000606 }
607
Guido van Rossumbcc20741998-08-04 22:53:56 +0000608#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000609 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000610 addr->sa_family = AF_INET;
611#endif
612
Guido van Rossum30a685f1991-06-27 15:51:29 +0000613 switch (addr->sa_family) {
614
615 case AF_INET:
616 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000617 struct sockaddr_in *a;
618 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000619 PyObject *ret = NULL;
620 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000621 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000622 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
623 Py_DECREF(addrobj);
624 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000625 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000626 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000627
Guido van Rossumb6775db1994-08-01 11:34:53 +0000628#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000629 case AF_UNIX:
630 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000631 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000632 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000633 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000634#endif /* AF_UNIX */
635
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000636#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000637 case AF_INET6:
638 {
639 struct sockaddr_in6 *a;
640 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
641 PyObject *ret = NULL;
642 if (addrobj) {
643 a = (struct sockaddr_in6 *)addr;
644 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
645 a->sin6_flowinfo, a->sin6_scope_id);
646 Py_DECREF(addrobj);
647 }
648 return ret;
649 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000650#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000651
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000652#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000653 case AF_PACKET:
654 {
655 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
656 char *ifname = "";
657 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000658 /* need to look up interface name give index */
659 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000660 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000661 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000662 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000663 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000664 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000665 a->sll_pkttype, a->sll_hatype,
666 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000667 }
668#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000669
Guido van Rossum30a685f1991-06-27 15:51:29 +0000670 /* More cases here... */
671
672 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000673 /* If we don't know the address family, don't raise an
674 exception -- return it as a tuple. */
675 return Py_BuildValue("is#",
676 addr->sa_family,
677 addr->sa_data,
678 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000679
Guido van Rossum30a685f1991-06-27 15:51:29 +0000680 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000681}
682
Guido van Rossum30a685f1991-06-27 15:51:29 +0000683
684/* Parse a socket address argument according to the socket object's
685 address family. Return 1 if the address was in the proper format,
686 0 of not. The address is returned through addr_ret, its length
687 through len_ret. */
688
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000689static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000690getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000691 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000692{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000693 switch (s->sock_family) {
694
Guido van Rossumb6775db1994-08-01 11:34:53 +0000695#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000696 case AF_UNIX:
697 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000698 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000699 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000700 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000701 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000702 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000703 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000704 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000705 PyErr_SetString(PySocket_Error,
706 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000707 return 0;
708 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000709 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000710 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000711 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000712 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000713 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000714 return 1;
715 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000716#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000717
Guido van Rossum30a685f1991-06-27 15:51:29 +0000718 case AF_INET:
719 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000720 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000721 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000722 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000723 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000724 if (!PyTuple_Check(args)) {
725 PyErr_Format(PyExc_TypeError,
726 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
727 args->ob_type->tp_name);
728 return 0;
729 }
730 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000731 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000732 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000733 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000734 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000735 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000736 *addr_ret = (struct sockaddr *) addr;
737 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000738 return 1;
739 }
740
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000741#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000742 case AF_INET6:
743 {
744 struct sockaddr_in6* addr;
745 char *host;
746 int port, flowinfo, scope_id;
747 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
748 flowinfo = scope_id = 0;
749 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
750 &scope_id)) {
751 return 0;
752 }
753 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
754 return 0;
755 addr->sin6_family = s->sock_family;
756 addr->sin6_port = htons((short)port);
757 addr->sin6_flowinfo = flowinfo;
758 addr->sin6_scope_id = scope_id;
759 *addr_ret = (struct sockaddr *) addr;
760 *len_ret = sizeof *addr;
761 return 1;
762 }
763#endif
764
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000765#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000766 case AF_PACKET:
767 {
768 struct sockaddr_ll* addr;
769 struct ifreq ifr;
770 char *interfaceName;
771 int protoNumber;
772 int hatype = 0;
773 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000774 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000775
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000776 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
777 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000778 return 0;
779 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
780 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000781 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000782 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +0000783 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000784 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000785 addr = &(s->sock_addr.ll);
786 addr->sll_family = AF_PACKET;
787 addr->sll_protocol = htons((short)protoNumber);
788 addr->sll_ifindex = ifr.ifr_ifindex;
789 addr->sll_pkttype = pkttype;
790 addr->sll_hatype = hatype;
791 *addr_ret = (struct sockaddr *) addr;
792 *len_ret = sizeof *addr;
793 return 1;
794 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000795#endif
796
Guido van Rossum30a685f1991-06-27 15:51:29 +0000797 /* More cases here... */
798
799 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000800 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000801 return 0;
802
803 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000804}
805
Guido van Rossum30a685f1991-06-27 15:51:29 +0000806
Guido van Rossum48a680c2001-03-02 06:34:14 +0000807/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000808 Return 1 if the family is known, 0 otherwise. The length is returned
809 through len_ret. */
810
811static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000812getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000813{
814 switch (s->sock_family) {
815
Guido van Rossumb6775db1994-08-01 11:34:53 +0000816#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000817 case AF_UNIX:
818 {
819 *len_ret = sizeof (struct sockaddr_un);
820 return 1;
821 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000822#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000823
824 case AF_INET:
825 {
826 *len_ret = sizeof (struct sockaddr_in);
827 return 1;
828 }
829
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000830#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000831 case AF_INET6:
832 {
833 *len_ret = sizeof (struct sockaddr_in6);
834 return 1;
835 }
836#endif
837
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000838#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000839 case AF_PACKET:
840 {
841 *len_ret = sizeof (struct sockaddr_ll);
842 return 1;
843 }
844#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000845
Guido van Rossum710e1df1992-06-12 10:39:36 +0000846 /* More cases here... */
847
848 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000849 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000850 return 0;
851
852 }
853}
854
855
Guido van Rossum30a685f1991-06-27 15:51:29 +0000856/* s.accept() method */
857
Guido van Rossum73624e91994-10-10 17:59:00 +0000858static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000859PySocketSock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000860{
861 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000862 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000863 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000864 PyObject *sock = NULL;
865 PyObject *addr = NULL;
866 PyObject *res = NULL;
867
Guido van Rossum710e1df1992-06-12 10:39:36 +0000868 if (!getsockaddrlen(s, &addrlen))
869 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000870 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000871 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000872 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000873 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000874#ifdef MS_WINDOWS
875 if (newfd == INVALID_SOCKET)
876#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000877 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000878#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000879 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +0000880
Guido van Rossum30a685f1991-06-27 15:51:29 +0000881 /* Create the new object with unspecified family,
882 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000883 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000884 s->sock_family,
885 s->sock_type,
886 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000887 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000888 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000889 goto finally;
890 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000891 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000892 addrlen);
893 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000894 goto finally;
895
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000896 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000897
898 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000899 Py_XDECREF(sock);
900 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000901 return res;
902}
903
Guido van Rossum82a5c661998-07-07 20:45:43 +0000904static char accept_doc[] =
905"accept() -> (socket object, address info)\n\
906\n\
907Wait for an incoming connection. Return a new socket representing the\n\
908connection, and the address of the client. For IP sockets, the address\n\
909info is a pair (hostaddr, port).";
910
Guido van Rossum30a685f1991-06-27 15:51:29 +0000911
Guido van Rossume4485b01994-09-07 14:32:49 +0000912/* s.setblocking(1 | 0) method */
913
Guido van Rossum73624e91994-10-10 17:59:00 +0000914static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000915PySocketSock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +0000916{
917 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000918#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000919#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000920 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000921#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000922#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000923 block = PyInt_AsLong(arg);
924 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +0000925 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000926 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000927#ifdef __BEOS__
928 block = !block;
929 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
930 (void *)(&block), sizeof( int ) );
931#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000932#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000933#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000934#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000935 block = !block;
936 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
937#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000938 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
939 if (block)
940 delay_flag &= (~O_NDELAY);
941 else
942 delay_flag |= O_NDELAY;
943 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000944#endif /* !PYOS_OS2 */
945#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000946 block = !block;
947 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000948#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000949#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000950#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +0000951 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000952
Guido van Rossum73624e91994-10-10 17:59:00 +0000953 Py_INCREF(Py_None);
954 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000955}
Guido van Rossume4485b01994-09-07 14:32:49 +0000956
Guido van Rossum82a5c661998-07-07 20:45:43 +0000957static char setblocking_doc[] =
958"setblocking(flag)\n\
959\n\
960Set the socket to blocking (flag is true) or non-blocking (false).\n\
961This uses the FIONBIO ioctl with the O_NDELAY flag.";
962
Guido van Rossume4485b01994-09-07 14:32:49 +0000963
Guido van Rossum48a680c2001-03-02 06:34:14 +0000964#ifdef RISCOS
965/* s.sleeptaskw(1 | 0) method */
966
967static PyObject *
968PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
969{
970 int block;
971 int delay_flag;
972 if (!PyArg_GetInt(args, &block))
973 return NULL;
974 Py_BEGIN_ALLOW_THREADS
975 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
976 Py_END_ALLOW_THREADS
977
978 Py_INCREF(Py_None);
979 return Py_None;
980}
981static char sleeptaskw_doc[] =
982"sleeptaskw(flag)\n\
983\n\
984Allow sleeps in taskwindows.";
985#endif
986
987
Guido van Rossumaee08791992-09-08 09:05:33 +0000988/* s.setsockopt() method.
989 With an integer third argument, sets an integer option.
990 With a string third argument, sets an option from a buffer;
991 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000992
Guido van Rossum73624e91994-10-10 17:59:00 +0000993static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000994PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000995{
996 int level;
997 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000998 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000999 char *buf;
1000 int buflen;
1001 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001002
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001003 if (PyArg_ParseTuple(args, "iii:setsockopt",
1004 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001005 buf = (char *) &flag;
1006 buflen = sizeof flag;
1007 }
1008 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001009 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001010 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1011 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001012 return NULL;
1013 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001014 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001015 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001016 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001017 Py_INCREF(Py_None);
1018 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001019}
1020
Guido van Rossum82a5c661998-07-07 20:45:43 +00001021static char setsockopt_doc[] =
1022"setsockopt(level, option, value)\n\
1023\n\
1024Set a socket option. See the Unix manual for level and option.\n\
1025The value argument can either be an integer or a string.";
1026
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001027
Guido van Rossumaee08791992-09-08 09:05:33 +00001028/* s.getsockopt() method.
1029 With two arguments, retrieves an integer option.
1030 With a third integer argument, retrieves a string buffer of that size;
1031 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001032
Guido van Rossum73624e91994-10-10 17:59:00 +00001033static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001034PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001035{
1036 int level;
1037 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001038 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001039 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001040 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001041
Guido van Rossumbcc20741998-08-04 22:53:56 +00001042#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001043 /* We have incomplete socket support. */
1044 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001045 return NULL;
1046#else
1047
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001048 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1049 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001050 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001051
Guido van Rossumbe32c891996-06-20 16:25:29 +00001052 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001053 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001054 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001055 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001056 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001057 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001058 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001059 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001060 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001061 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001062 PyErr_SetString(PySocket_Error,
1063 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001064 return NULL;
1065 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001066 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001067 if (buf == NULL)
1068 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001069 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001070 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001071 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001072 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001073 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001074 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001075 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001076 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001077#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001078}
1079
Guido van Rossum82a5c661998-07-07 20:45:43 +00001080static char getsockopt_doc[] =
1081"getsockopt(level, option[, buffersize]) -> value\n\
1082\n\
1083Get a socket option. See the Unix manual for level and option.\n\
1084If a nonzero buffersize argument is given, the return value is a\n\
1085string of that length; otherwise it is an integer.";
1086
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001087
Fred Drake728819a2000-07-01 03:40:12 +00001088/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001089
Guido van Rossum73624e91994-10-10 17:59:00 +00001090static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001091PySocketSock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001092{
1093 struct sockaddr *addr;
1094 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001095 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001096
Fred Drake728819a2000-07-01 03:40:12 +00001097 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001098 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001099 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001100 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001101 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001102 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001103 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001104 Py_INCREF(Py_None);
1105 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001106}
1107
Guido van Rossum82a5c661998-07-07 20:45:43 +00001108static char bind_doc[] =
1109"bind(address)\n\
1110\n\
1111Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001112pair (host, port); the host must refer to the local host. For raw packet\n\
1113sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001114
Guido van Rossum30a685f1991-06-27 15:51:29 +00001115
1116/* s.close() method.
1117 Set the file descriptor to -1 so operations tried subsequently
1118 will surely fail. */
1119
Guido van Rossum73624e91994-10-10 17:59:00 +00001120static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001121PySocketSock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001122{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001123 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001124
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001125 if ((fd = s->sock_fd) != -1) {
1126 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001127 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001128 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001129 Py_END_ALLOW_THREADS
1130 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001131 Py_INCREF(Py_None);
1132 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001133}
1134
Guido van Rossum82a5c661998-07-07 20:45:43 +00001135static char close_doc[] =
1136"close()\n\
1137\n\
1138Close the socket. It cannot be used after this call.";
1139
Guido van Rossum30a685f1991-06-27 15:51:29 +00001140
Fred Drake728819a2000-07-01 03:40:12 +00001141/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001142
Guido van Rossum73624e91994-10-10 17:59:00 +00001143static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001144PySocketSock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001145{
1146 struct sockaddr *addr;
1147 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001148 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001149
Fred Drake728819a2000-07-01 03:40:12 +00001150 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001151 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001152 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001153 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001154 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001155 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001156 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001157 Py_INCREF(Py_None);
1158 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001159}
1160
Guido van Rossum82a5c661998-07-07 20:45:43 +00001161static char connect_doc[] =
1162"connect(address)\n\
1163\n\
1164Connect the socket to a remote address. For IP sockets, the address\n\
1165is a pair (host, port).";
1166
Guido van Rossum30a685f1991-06-27 15:51:29 +00001167
Fred Drake728819a2000-07-01 03:40:12 +00001168/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001169
1170static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001171PySocketSock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001172{
1173 struct sockaddr *addr;
1174 int addrlen;
1175 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001176
Fred Drake728819a2000-07-01 03:40:12 +00001177 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001178 return NULL;
1179 Py_BEGIN_ALLOW_THREADS
1180 res = connect(s->sock_fd, addr, addrlen);
1181 Py_END_ALLOW_THREADS
Tim Petersc32410a2001-10-30 01:26:49 +00001182 if (res != 0) {
1183#ifdef MS_WINDOWS
1184 res = WSAGetLastError();
1185#else
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001186 res = errno;
Tim Petersc32410a2001-10-30 01:26:49 +00001187#endif
1188 }
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001189 return PyInt_FromLong((long) res);
1190}
1191
Guido van Rossum82a5c661998-07-07 20:45:43 +00001192static char connect_ex_doc[] =
1193"connect_ex(address)\n\
1194\n\
1195This is like connect(address), but returns an error code (the errno value)\n\
1196instead of raising an exception when an error occurs.";
1197
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001198
Guido van Rossumed233a51992-06-23 09:07:03 +00001199/* s.fileno() method */
1200
Guido van Rossum73624e91994-10-10 17:59:00 +00001201static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001202PySocketSock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001203{
Fred Drakea04eaad2000-06-30 02:46:07 +00001204#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001205 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001206#else
1207 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1208#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001209}
1210
Guido van Rossum82a5c661998-07-07 20:45:43 +00001211static char fileno_doc[] =
1212"fileno() -> integer\n\
1213\n\
1214Return the integer file descriptor of the socket.";
1215
Guido van Rossumed233a51992-06-23 09:07:03 +00001216
Guido van Rossumbe32c891996-06-20 16:25:29 +00001217#ifndef NO_DUP
1218/* s.dup() method */
1219
1220static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001221PySocketSock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001222{
Fred Drakea04eaad2000-06-30 02:46:07 +00001223 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001224 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001225
Guido van Rossumbe32c891996-06-20 16:25:29 +00001226 newfd = dup(s->sock_fd);
1227 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001228 return s->errorhandler();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001229 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001230 s->sock_family,
1231 s->sock_type,
1232 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001233 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001234 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001235 return sock;
1236}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001237
1238static char dup_doc[] =
1239"dup() -> socket object\n\
1240\n\
1241Return a new socket object connected to the same system resource.";
1242
Guido van Rossumbe32c891996-06-20 16:25:29 +00001243#endif
1244
1245
Guido van Rossumc89705d1992-11-26 08:54:07 +00001246/* s.getsockname() method */
1247
Guido van Rossum73624e91994-10-10 17:59:00 +00001248static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001249PySocketSock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001250{
1251 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001252 int res;
1253 socklen_t addrlen;
1254
Guido van Rossumc89705d1992-11-26 08:54:07 +00001255 if (!getsockaddrlen(s, &addrlen))
1256 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001257 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001258 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001259 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001260 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001261 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001262 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001263 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001264}
1265
Guido van Rossum82a5c661998-07-07 20:45:43 +00001266static char getsockname_doc[] =
1267"getsockname() -> address info\n\
1268\n\
1269Return the address of the local endpoint. For IP sockets, the address\n\
1270info is a pair (hostaddr, port).";
1271
Guido van Rossumc89705d1992-11-26 08:54:07 +00001272
Guido van Rossumb6775db1994-08-01 11:34:53 +00001273#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001274/* s.getpeername() method */
1275
Guido van Rossum73624e91994-10-10 17:59:00 +00001276static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001277PySocketSock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001278{
1279 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001280 int res;
1281 socklen_t addrlen;
1282
Guido van Rossumc89705d1992-11-26 08:54:07 +00001283 if (!getsockaddrlen(s, &addrlen))
1284 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001285 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001286 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001287 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001288 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001289 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001290 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001291 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001292}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001293
1294static char getpeername_doc[] =
1295"getpeername() -> address info\n\
1296\n\
1297Return the address of the remote endpoint. For IP sockets, the address\n\
1298info is a pair (hostaddr, port).";
1299
Guido van Rossumb6775db1994-08-01 11:34:53 +00001300#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001301
1302
Guido van Rossum30a685f1991-06-27 15:51:29 +00001303/* s.listen(n) method */
1304
Guido van Rossum73624e91994-10-10 17:59:00 +00001305static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001306PySocketSock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001307{
1308 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001309 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001310
1311 backlog = PyInt_AsLong(arg);
1312 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001313 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001314 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001315 if (backlog < 1)
1316 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001317 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001318 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001319 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001320 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001321 Py_INCREF(Py_None);
1322 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001323}
1324
Guido van Rossum82a5c661998-07-07 20:45:43 +00001325static char listen_doc[] =
1326"listen(backlog)\n\
1327\n\
1328Enable a server to accept connections. The backlog argument must be at\n\
1329least 1; it specifies the number of unaccepted connection that the system\n\
1330will allow before refusing new connections.";
1331
1332
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001333#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001334/* s.makefile(mode) method.
1335 Create a new open file object referring to a dupped version of
1336 the socket's file descriptor. (The dup() call is necessary so
1337 that the open file and socket objects may be closed independent
1338 of each other.)
1339 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1340
Guido van Rossum73624e91994-10-10 17:59:00 +00001341static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001342PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001343{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001344 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001345 char *mode = "r";
1346 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001347#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001348 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001349#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001350 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001351#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001352 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001353 PyObject *f;
1354
Guido van Rossum43713e52000-02-29 13:59:29 +00001355 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001356 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001357#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001358 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1359 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001360#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001361 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001362#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001363 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001364 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001365 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001366 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001367 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001368#ifdef USE_GUSI2
1369 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
1370 if (strchr(mode, 'b') != NULL )
1371 bufsize = 0;
1372#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001373 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1374 if (f != NULL)
1375 PyFile_SetBufSize(f, bufsize);
1376 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001377}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001378
1379static char makefile_doc[] =
1380"makefile([mode[, buffersize]]) -> file object\n\
1381\n\
1382Return a regular file object corresponding to the socket.\n\
1383The mode and buffersize arguments are as for the built-in open() function.";
1384
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001385#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001386
Guido van Rossum48a680c2001-03-02 06:34:14 +00001387
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001388/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001389
Guido van Rossum73624e91994-10-10 17:59:00 +00001390static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001391PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001392{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001393 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001394 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001395 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001396 return NULL;
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001397 if (len < 0) {
1398 PyErr_SetString(PyExc_ValueError,
1399 "negative buffersize in connect");
1400 return NULL;
1401 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001402 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001403 if (buf == NULL)
1404 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001405 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001406 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001407 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001408 if (n < 0) {
1409 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001410 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001411 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001412 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001413 return NULL;
1414 return buf;
1415}
1416
Guido van Rossum82a5c661998-07-07 20:45:43 +00001417static char recv_doc[] =
1418"recv(buffersize[, flags]) -> data\n\
1419\n\
1420Receive up to buffersize bytes from the socket. For the optional flags\n\
1421argument, see the Unix manual. When no data is available, block until\n\
1422at least one byte is available or until the remote end is closed. When\n\
1423the remote end is closed and all data is read, return the empty string.";
1424
Guido van Rossum30a685f1991-06-27 15:51:29 +00001425
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001426/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001427
Guido van Rossum73624e91994-10-10 17:59:00 +00001428static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001429PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001430{
1431 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001432 PyObject *buf = NULL;
1433 PyObject *addr = NULL;
1434 PyObject *ret = NULL;
1435
Guido van Rossumff3ab422000-04-24 15:16:03 +00001436 int len, n, flags = 0;
1437 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001438 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001439 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001440 if (!getsockaddrlen(s, &addrlen))
1441 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001442 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001443 if (buf == NULL)
1444 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001445 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001446 memset(addrbuf, 0, addrlen);
1447 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001448#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001449#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001450 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001451#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001452 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001453#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001454#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001455 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001456#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001457 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001458 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001459 if (n < 0) {
1460 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001461 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001462 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001463 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001464 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001465
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001466 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001467 goto finally;
1468
Guido van Rossum73624e91994-10-10 17:59:00 +00001469 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001470 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001471 Py_XDECREF(addr);
1472 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001473 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001474}
1475
Guido van Rossum82a5c661998-07-07 20:45:43 +00001476static char recvfrom_doc[] =
1477"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1478\n\
1479Like recv(buffersize, flags) but also return the sender's address info.";
1480
Guido van Rossum30a685f1991-06-27 15:51:29 +00001481
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001482/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001483
Guido van Rossum73624e91994-10-10 17:59:00 +00001484static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001485PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001486{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001487 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001488 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001489 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001490 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001491 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001492 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001493 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001494 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001495 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001496 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001497}
1498
Guido van Rossum82a5c661998-07-07 20:45:43 +00001499static char send_doc[] =
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001500"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001501\n\
1502Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001503argument, see the Unix manual. Return the number of bytes\n\
1504sent; this may be less than len(data) if the network is busy.";
1505
1506
1507/* s.sendall(data [,flags]) method */
1508
1509static PyObject *
1510PySocketSock_sendall(PySocketSockObject *s, PyObject *args)
1511{
1512 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001513 int len, n, flags = 0;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001514 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1515 return NULL;
1516 Py_BEGIN_ALLOW_THREADS
1517 do {
1518 n = send(s->sock_fd, buf, len, flags);
1519 if (n < 0)
1520 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001521 buf += n;
1522 len -= n;
1523 } while (len > 0);
1524 Py_END_ALLOW_THREADS
1525 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001526 return s->errorhandler();
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001527 Py_INCREF(Py_None);
1528 return Py_None;
1529}
1530
1531static char sendall_doc[] =
1532"sendall(data[, flags])\n\
1533\n\
1534Send a data string to the socket. For the optional flags\n\
1535argument, see the Unix manual. This calls send() repeatedly\n\
1536until all data is sent. If an error occurs, it's impossible\n\
1537to tell how much data has been sent.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001538
Guido van Rossum30a685f1991-06-27 15:51:29 +00001539
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001540/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001541
Guido van Rossum73624e91994-10-10 17:59:00 +00001542static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001543PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001544{
Guido van Rossum73624e91994-10-10 17:59:00 +00001545 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001546 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001547 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001548 int addrlen, len, n, flags;
1549 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001550 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001551 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001552 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1553 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001554 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001555 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001556 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001557 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001558 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001559 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001560 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001561 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001562 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001563 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001564}
1565
Guido van Rossum82a5c661998-07-07 20:45:43 +00001566static char sendto_doc[] =
1567"sendto(data[, flags], address)\n\
1568\n\
1569Like send(data, flags) but allows specifying the destination address.\n\
1570For IP sockets, the address is a pair (hostaddr, port).";
1571
Guido van Rossum30a685f1991-06-27 15:51:29 +00001572
1573/* s.shutdown(how) method */
1574
Guido van Rossum73624e91994-10-10 17:59:00 +00001575static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001576PySocketSock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001577{
1578 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001579 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001580
1581 how = PyInt_AsLong(arg);
1582 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001583 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001584 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001585 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001586 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001587 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001588 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001589 Py_INCREF(Py_None);
1590 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001591}
1592
Guido van Rossum82a5c661998-07-07 20:45:43 +00001593static char shutdown_doc[] =
1594"shutdown(flag)\n\
1595\n\
1596Shut down the reading side of the socket (flag == 0), the writing side\n\
1597of the socket (flag == 1), or both ends (flag == 2).";
1598
Guido van Rossum30a685f1991-06-27 15:51:29 +00001599
1600/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001601
Guido van Rossum73624e91994-10-10 17:59:00 +00001602static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum17209fc2001-10-15 21:12:54 +00001603 {"accept", (PyCFunction)PySocketSock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001604 accept_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001605 {"bind", (PyCFunction)PySocketSock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001606 bind_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00001607 {"close", (PyCFunction)PySocketSock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001608 close_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001609 {"connect", (PyCFunction)PySocketSock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001610 connect_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001611 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001612 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001613#ifndef NO_DUP
Guido van Rossum17209fc2001-10-15 21:12:54 +00001614 {"dup", (PyCFunction)PySocketSock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001615 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001616#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001617 {"fileno", (PyCFunction)PySocketSock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001618 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001619#ifdef HAVE_GETPEERNAME
Guido van Rossum17209fc2001-10-15 21:12:54 +00001620 {"getpeername", (PyCFunction)PySocketSock_getpeername,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001621 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001622#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001623 {"getsockname", (PyCFunction)PySocketSock_getsockname,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001624 METH_NOARGS, getsockname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001625 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1626 getsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001627 {"listen", (PyCFunction)PySocketSock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001628 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001629#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001630 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1631 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001632#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001633 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1634 recv_doc},
1635 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1636 recvfrom_doc},
1637 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1638 send_doc},
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001639 {"sendall", (PyCFunction)PySocketSock_sendall, METH_VARARGS,
1640 sendall_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001641 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1642 sendto_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001643 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001644 setblocking_doc},
1645 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1646 setsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001647 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001648 shutdown_doc},
1649#ifdef RISCOS
1650 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1651 sleeptaskw_doc},
1652#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001653 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001654};
1655
Guido van Rossum30a685f1991-06-27 15:51:29 +00001656
Guido van Rossum73624e91994-10-10 17:59:00 +00001657/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001658 First close the file description. */
1659
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001660static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001661PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001662{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001663 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001664 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001665 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001666}
1667
Guido van Rossum30a685f1991-06-27 15:51:29 +00001668
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001669static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001670PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001671{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001672 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001673#if SIZEOF_SOCKET_T > SIZEOF_LONG
1674 if (s->sock_fd > LONG_MAX) {
1675 /* this can occur on Win64, and actually there is a special
1676 ugly printf formatter for decimal pointer length integer
1677 printing, only bother if necessary*/
1678 PyErr_SetString(PyExc_OverflowError,
1679 "no printf formatter to display the socket descriptor in decimal");
1680 return NULL;
1681 }
1682#endif
Tim Peters885d4572001-11-28 20:27:42 +00001683 PyOS_snprintf(buf, sizeof(buf),
1684 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1685 (long)s->sock_fd, s->sock_family,
1686 s->sock_type,
1687 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001688 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001689}
1690
1691
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001692/* Create a new, uninitialized socket object. */
1693
1694static PyObject *
1695PySocketSock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1696{
1697 PyObject *new;
1698
1699 new = type->tp_alloc(type, 0);
1700 if (new != NULL)
1701 ((PySocketSockObject *)new)->sock_fd = -1;
1702 return new;
1703}
1704
1705
1706/* Initialize a new socket object. */
1707
1708/*ARGSUSED*/
1709static int
1710PySocketSock_init(PyObject *self, PyObject *args, PyObject *kwds)
1711{
1712 PySocketSockObject *s = (PySocketSockObject *)self;
1713 SOCKET_T fd;
1714 int family = AF_INET, type = SOCK_STREAM, proto = 0;
1715 static char *keywords[] = {"family", "type", "proto", 0};
1716
1717 if (!PyArg_ParseTupleAndKeywords(args, kwds,
1718 "|iii:socket", keywords,
1719 &family, &type, &proto))
1720 return -1;
1721 Py_BEGIN_ALLOW_THREADS
1722 fd = socket(family, type, proto);
1723 Py_END_ALLOW_THREADS
1724#ifdef MS_WINDOWS
1725 if (fd == INVALID_SOCKET)
1726#else
1727 if (fd < 0)
1728#endif
1729 {
1730 PySocket_Err();
1731 return -1;
1732 }
1733 init_sockobject(s, fd, family, type, proto);
1734 /* From now on, ignore SIGPIPE and let the error checking
1735 do the work. */
1736#ifdef SIGPIPE
1737 (void) signal(SIGPIPE, SIG_IGN);
1738#endif
1739 return 0;
1740}
1741
1742
Guido van Rossumb6775db1994-08-01 11:34:53 +00001743/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001744
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001745static char socket_doc[] =
1746"socket([family[, type[, proto]]]) -> socket object\n\
1747\n\
1748Open a socket of the given type. The family argument specifies the\n\
1749address family; it defaults to AF_INET. The type argument specifies\n\
1750whether this is a stream (SOCK_STREAM, this is the default)\n\
1751or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1752specifying the default protocol.\n\
1753\n\
1754A socket represents one endpoint of a network connection.\n\
1755\n\
1756Methods:\n\
1757\n\
1758accept() -- accept a connection, returning new socket and client address\n\
1759bind() -- bind the socket to a local address\n\
1760close() -- close the socket\n\
1761connect() -- connect the socket to a remote address\n\
1762connect_ex() -- connect, return an error code instead of an exception \n\
1763dup() -- return a new socket object identical to the current one (*)\n\
1764fileno() -- return underlying file descriptor\n\
1765getpeername() -- return remote address (*)\n\
1766getsockname() -- return local address\n\
1767getsockopt() -- get socket options\n\
1768listen() -- start listening for incoming connections\n\
Andrew M. Kuchling3072ecd2001-11-28 04:28:31 +00001769makefile() -- return a file object corresponding to the socket (*)\n\
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001770recv() -- receive data\n\
1771recvfrom() -- receive data and sender's address\n\
1772send() -- send data, may not send all of it\n\
1773sendall() -- send all data\n\
1774sendto() -- send data to a given address\n\
1775setblocking() -- set or clear the blocking I/O flag\n\
1776setsockopt() -- set socket options\n\
1777shutdown() -- shut down traffic in one or both directions\n\
1778\n\
1779(*) not available on all platforms!)";
1780
Guido van Rossum73624e91994-10-10 17:59:00 +00001781static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001782 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001783 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00001784 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001785 sizeof(PySocketSockObject), /* tp_basicsize */
1786 0, /* tp_itemsize */
1787 (destructor)PySocketSock_dealloc, /* tp_dealloc */
1788 0, /* tp_print */
1789 0, /* tp_getattr */
1790 0, /* tp_setattr */
1791 0, /* tp_compare */
1792 (reprfunc)PySocketSock_repr, /* tp_repr */
1793 0, /* tp_as_number */
1794 0, /* tp_as_sequence */
1795 0, /* tp_as_mapping */
1796 0, /* tp_hash */
1797 0, /* tp_call */
1798 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001799 0, /* set below */ /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001800 0, /* tp_setattro */
1801 0, /* tp_as_buffer */
1802 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1803 socket_doc, /* tp_doc */
1804 0, /* tp_traverse */
1805 0, /* tp_clear */
1806 0, /* tp_richcompare */
1807 0, /* tp_weaklistoffset */
1808 0, /* tp_iter */
1809 0, /* tp_iternext */
1810 PySocketSock_methods, /* tp_methods */
1811 0, /* tp_members */
1812 0, /* tp_getset */
1813 0, /* tp_base */
1814 0, /* tp_dict */
1815 0, /* tp_descr_get */
1816 0, /* tp_descr_set */
1817 0, /* tp_dictoffset */
1818 PySocketSock_init, /* tp_init */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001819 0, /* set below */ /* tp_alloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001820 PySocketSock_new, /* tp_new */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001821 0, /* set below */ /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001822};
1823
Guido van Rossum30a685f1991-06-27 15:51:29 +00001824
Guido van Rossum81194471991-07-27 21:42:02 +00001825/* Python interface to gethostname(). */
1826
1827/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001828static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001829PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001830{
1831 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001832 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001833 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001834 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001835 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001836 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001837 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001838 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001839 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001840 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001841 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001842}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001843
Guido van Rossum82a5c661998-07-07 20:45:43 +00001844static char gethostname_doc[] =
1845"gethostname() -> string\n\
1846\n\
1847Return the current host name.";
1848
Guido van Rossumff4949e1992-08-05 19:58:53 +00001849
Guido van Rossum30a685f1991-06-27 15:51:29 +00001850/* Python interface to gethostbyname(name). */
1851
1852/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001853static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001854PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001855{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001856 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001857 struct sockaddr_storage addrbuf;
1858
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001859 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001860 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001861 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001862 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001863 return makeipaddr((struct sockaddr *)&addrbuf,
1864 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001865}
1866
Guido van Rossum82a5c661998-07-07 20:45:43 +00001867static char gethostbyname_doc[] =
1868"gethostbyname(host) -> address\n\
1869\n\
1870Return the IP address (a string of the form '255.255.255.255') for a host.";
1871
1872
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001873/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1874
1875static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001876gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001877{
1878 char **pch;
1879 PyObject *rtn_tuple = (PyObject *)NULL;
1880 PyObject *name_list = (PyObject *)NULL;
1881 PyObject *addr_list = (PyObject *)NULL;
1882 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001883
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001884 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001885 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001886#ifndef RISCOS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001887 PyH_Err(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001888#else
1889 PyErr_SetString(PySocket_Error, "host not found");
1890#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001891 return NULL;
1892 }
1893 if (h->h_addrtype != af) {
1894#ifdef HAVE_STRERROR
1895 /* Let's get real error message to return */
1896 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001897#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001898 PyErr_SetString(PySocket_Error,
1899 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001900#endif
1901 return NULL;
1902 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001903 switch (af) {
1904 case AF_INET:
1905 if (alen < sizeof(struct sockaddr_in))
1906 return NULL;
1907 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001908#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001909 case AF_INET6:
1910 if (alen < sizeof(struct sockaddr_in6))
1911 return NULL;
1912 break;
1913#endif
1914 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001915 if ((name_list = PyList_New(0)) == NULL)
1916 goto err;
1917 if ((addr_list = PyList_New(0)) == NULL)
1918 goto err;
1919 for (pch = h->h_aliases; *pch != NULL; pch++) {
1920 int status;
1921 tmp = PyString_FromString(*pch);
1922 if (tmp == NULL)
1923 goto err;
1924 status = PyList_Append(name_list, tmp);
1925 Py_DECREF(tmp);
1926 if (status)
1927 goto err;
1928 }
1929 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1930 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001931 switch (af) {
1932 case AF_INET:
1933 {
1934 struct sockaddr_in sin;
1935 memset(&sin, 0, sizeof(sin));
1936 sin.sin_family = af;
1937#ifdef HAVE_SOCKADDR_SA_LEN
1938 sin.sin_len = sizeof(sin);
1939#endif
1940 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
1941 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
1942 if (pch == h->h_addr_list && alen >= sizeof(sin))
1943 memcpy((char *) addr, &sin, sizeof(sin));
1944 break;
1945 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001946#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001947 case AF_INET6:
1948 {
1949 struct sockaddr_in6 sin6;
1950 memset(&sin6, 0, sizeof(sin6));
1951 sin6.sin6_family = af;
1952#ifdef HAVE_SOCKADDR_SA_LEN
1953 sin6.sin6_len = sizeof(sin6);
1954#endif
1955 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
1956 tmp = makeipaddr((struct sockaddr *)&sin6,
1957 sizeof(sin6));
1958 if (pch == h->h_addr_list && alen >= sizeof(sin6))
1959 memcpy((char *) addr, &sin6, sizeof(sin6));
1960 break;
1961 }
1962#endif
1963 default: /* can't happen */
1964 PyErr_SetString(PySocket_Error,
1965 "unsupported address family");
1966 return NULL;
1967 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001968 if (tmp == NULL)
1969 goto err;
1970 status = PyList_Append(addr_list, tmp);
1971 Py_DECREF(tmp);
1972 if (status)
1973 goto err;
1974 }
1975 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1976 err:
1977 Py_XDECREF(name_list);
1978 Py_XDECREF(addr_list);
1979 return rtn_tuple;
1980}
1981
1982
1983/* Python interface to gethostbyname_ex(name). */
1984
1985/*ARGSUSED*/
1986static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001987PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001988{
1989 char *name;
1990 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001991 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001992 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00001993 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001994#ifdef HAVE_GETHOSTBYNAME_R
1995 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001996#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1997 struct hostent_data data;
1998#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001999 char buf[16384];
2000 int buf_len = (sizeof buf) - 1;
2001 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002002#endif
2003#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002004 int result;
2005#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002006#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002007
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002008 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002009 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002010 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002011 return NULL;
2012 Py_BEGIN_ALLOW_THREADS
2013#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002014#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002015 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002016#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002017 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002018#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002019 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002020 result = gethostbyname_r(name, &hp_allocated, &data);
2021 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002022#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002023#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002024#ifdef USE_GETHOSTBYNAME_LOCK
2025 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002026#endif
2027 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002028#endif /* HAVE_GETHOSTBYNAME_R */
2029 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002030 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
2031 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
2032 sa = (struct sockaddr*)&addr;
2033 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002034#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002035 PyThread_release_lock(gethostbyname_lock);
2036#endif
2037 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002038}
2039
2040static char ghbn_ex_doc[] =
2041"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2042\n\
2043Return the true host name, a list of aliases, and a list of IP addresses,\n\
2044for a host. The host argument is a string giving a host name or IP number.";
2045
2046
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002047/* Python interface to gethostbyaddr(IP). */
2048
2049/*ARGSUSED*/
2050static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002051PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002052{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002053#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002054 struct sockaddr_storage addr;
2055#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002056 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002057#endif
2058 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002059 char *ip_num;
2060 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002061 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002062#ifdef HAVE_GETHOSTBYNAME_R
2063 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002064#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2065 struct hostent_data data;
2066#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002067 char buf[16384];
2068 int buf_len = (sizeof buf) - 1;
2069 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002070#endif
2071#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002072 int result;
2073#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002074#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002075 char *ap;
2076 int al;
2077 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002078
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002079 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002080 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002081 af = PF_UNSPEC;
2082 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002083 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002084 af = sa->sa_family;
2085 ap = NULL;
2086 al = 0;
2087 switch (af) {
2088 case AF_INET:
2089 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2090 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2091 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002092#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002093 case AF_INET6:
2094 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2095 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2096 break;
2097#endif
2098 default:
2099 PyErr_SetString(PySocket_Error, "unsupported address family");
2100 return NULL;
2101 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002102 Py_BEGIN_ALLOW_THREADS
2103#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002104#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002105 result = gethostbyaddr_r(ap, al, af,
2106 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002107 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002108#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002109 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002110 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002111#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002112 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002113 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002114 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002115#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002116#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002117#ifdef USE_GETHOSTBYNAME_LOCK
2118 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002119#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002120 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002121#endif /* HAVE_GETHOSTBYNAME_R */
2122 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002123 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002124#ifdef USE_GETHOSTBYNAME_LOCK
2125 PyThread_release_lock(gethostbyname_lock);
2126#endif
2127 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002128}
2129
Guido van Rossum82a5c661998-07-07 20:45:43 +00002130static char gethostbyaddr_doc[] =
2131"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2132\n\
2133Return the true host name, a list of aliases, and a list of IP addresses,\n\
2134for a host. The host argument is a string giving a host name or IP number.";
2135
Guido van Rossum30a685f1991-06-27 15:51:29 +00002136
2137/* Python interface to getservbyname(name).
2138 This only returns the port number, since the other info is already
2139 known or not useful (like the list of aliases). */
2140
2141/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002142static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002143PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002144{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002145 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002146 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002147 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002148 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002149 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002150 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002151 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002152 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002153 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002154 return NULL;
2155 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002156 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002157}
2158
Guido van Rossum82a5c661998-07-07 20:45:43 +00002159static char getservbyname_doc[] =
2160"getservbyname(servicename, protocolname) -> integer\n\
2161\n\
2162Return a port number from a service name and protocol name.\n\
2163The protocol name should be 'tcp' or 'udp'.";
2164
Guido van Rossum30a685f1991-06-27 15:51:29 +00002165
Guido van Rossum3901d851996-12-19 16:35:04 +00002166/* Python interface to getprotobyname(name).
2167 This only returns the protocol number, since the other info is
2168 already known or not useful (like the list of aliases). */
2169
2170/*ARGSUSED*/
2171static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002172PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002173{
2174 char *name;
2175 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002176#ifdef __BEOS__
2177/* Not available in BeOS yet. - [cjh] */
2178 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2179 return NULL;
2180#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002181 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002182 return NULL;
2183 Py_BEGIN_ALLOW_THREADS
2184 sp = getprotobyname(name);
2185 Py_END_ALLOW_THREADS
2186 if (sp == NULL) {
2187 PyErr_SetString(PySocket_Error, "protocol not found");
2188 return NULL;
2189 }
2190 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002191#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002192}
2193
Guido van Rossum82a5c661998-07-07 20:45:43 +00002194static char getprotobyname_doc[] =
2195"getprotobyname(name) -> integer\n\
2196\n\
2197Return the protocol number for the named protocol. (Rarely used.)";
2198
Guido van Rossum3901d851996-12-19 16:35:04 +00002199
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002200#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002201/* Create a socket object from a numeric file description.
2202 Useful e.g. if stdin is a socket.
2203 Additional arguments as for socket(). */
2204
2205/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002206static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002207PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002208{
Guido van Rossum73624e91994-10-10 17:59:00 +00002209 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002210 SOCKET_T fd;
2211 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002212 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2213 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002214 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002215 /* Dup the fd so it and the socket can be closed independently */
2216 fd = dup(fd);
2217 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002218 return PySocket_Err();
2219 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002220 /* From now on, ignore SIGPIPE and let the error checking
2221 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002222#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002223 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002224#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002225 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002226}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002227
2228static char fromfd_doc[] =
2229"fromfd(fd, family, type[, proto]) -> socket object\n\
2230\n\
2231Create a socket object from the given file descriptor.\n\
2232The remaining arguments are the same as for socket().";
2233
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002234#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002235
Guido van Rossum82a5c661998-07-07 20:45:43 +00002236
Guido van Rossum006bf911996-06-12 04:04:55 +00002237static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002238PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002239{
2240 int x1, x2;
2241
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002242 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002243 return NULL;
2244 }
2245 x2 = (int)ntohs((short)x1);
2246 return PyInt_FromLong(x2);
2247}
2248
Guido van Rossum82a5c661998-07-07 20:45:43 +00002249static char ntohs_doc[] =
2250"ntohs(integer) -> integer\n\
2251\n\
2252Convert a 16-bit integer from network to host byte order.";
2253
2254
Guido van Rossum006bf911996-06-12 04:04:55 +00002255static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002256PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002257{
2258 int x1, x2;
2259
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002260 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002261 return NULL;
2262 }
2263 x2 = ntohl(x1);
2264 return PyInt_FromLong(x2);
2265}
2266
Guido van Rossum82a5c661998-07-07 20:45:43 +00002267static char ntohl_doc[] =
2268"ntohl(integer) -> integer\n\
2269\n\
2270Convert a 32-bit integer from network to host byte order.";
2271
2272
Guido van Rossum006bf911996-06-12 04:04:55 +00002273static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002274PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002275{
2276 int x1, x2;
2277
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002278 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002279 return NULL;
2280 }
2281 x2 = (int)htons((short)x1);
2282 return PyInt_FromLong(x2);
2283}
2284
Guido van Rossum82a5c661998-07-07 20:45:43 +00002285static char htons_doc[] =
2286"htons(integer) -> integer\n\
2287\n\
2288Convert a 16-bit integer from host to network byte order.";
2289
2290
Guido van Rossum006bf911996-06-12 04:04:55 +00002291static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002292PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002293{
2294 int x1, x2;
2295
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002296 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002297 return NULL;
2298 }
2299 x2 = htonl(x1);
2300 return PyInt_FromLong(x2);
2301}
2302
Guido van Rossum82a5c661998-07-07 20:45:43 +00002303static char htonl_doc[] =
2304"htonl(integer) -> integer\n\
2305\n\
2306Convert a 32-bit integer from host to network byte order.";
2307
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002308/*
2309 * socket.inet_aton() and socket.inet_ntoa() functions
2310 *
2311 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2312 *
2313 */
2314
Guido van Rossum48a680c2001-03-02 06:34:14 +00002315static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002316"inet_aton(string) -> packed 32-bit IP representation\n\
2317\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002318Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002319binary format used in low-level network functions.";
2320
2321static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002322PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002323{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002324#ifndef INADDR_NONE
2325#define INADDR_NONE (-1)
2326#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002327
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002328 /* Have to use inet_addr() instead */
2329 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002330 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002331
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002332 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002333 return NULL;
2334 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002335#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002336 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002337#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002338 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002339#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002340
2341 if (packed_addr == INADDR_NONE) { /* invalid address */
2342 PyErr_SetString(PySocket_Error,
2343 "illegal IP address string passed to inet_aton");
2344 return NULL;
2345 }
2346
2347 return PyString_FromStringAndSize((char *) &packed_addr,
2348 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002349}
2350
Guido van Rossum48a680c2001-03-02 06:34:14 +00002351static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002352"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002353\n\
2354Convert an IP address from 32-bit packed binary format to string format";
2355
2356static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002357PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002358{
2359 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002360 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002361 struct in_addr packed_addr;
2362
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002363 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002364 return NULL;
2365 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002366
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002367 if (addr_len != sizeof(packed_addr)) {
2368 PyErr_SetString(PySocket_Error,
2369 "packed IP wrong length for inet_ntoa");
2370 return NULL;
2371 }
2372
2373 memcpy(&packed_addr, packed_str, addr_len);
2374
2375 return PyString_FromString(inet_ntoa(packed_addr));
2376}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002377
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002378/* Python interface to getaddrinfo(host, port). */
2379
2380/*ARGSUSED*/
2381static PyObject *
2382PySocket_getaddrinfo(PyObject *self, PyObject *args)
2383{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002384 struct addrinfo hints, *res;
2385 struct addrinfo *res0 = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002386 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002387 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002388 char *hptr, *pptr;
2389 int family, socktype, protocol, flags;
2390 int error;
2391 PyObject *all = (PyObject *)NULL;
2392 PyObject *single = (PyObject *)NULL;
2393
2394 family = socktype = protocol = flags = 0;
2395 family = PF_UNSPEC;
2396 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2397 &hptr, &pobj, &family, &socktype,
2398 &protocol, &flags)) {
2399 return NULL;
2400 }
2401 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002402 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002403 pptr = pbuf;
2404 } else if (PyString_Check(pobj)) {
2405 pptr = PyString_AsString(pobj);
2406 } else if (pobj == Py_None) {
2407 pptr = (char *)NULL;
2408 } else {
2409 PyErr_SetString(PySocket_Error, "Int or String expected");
2410 return NULL;
2411 }
2412 memset(&hints, 0, sizeof(hints));
2413 hints.ai_family = family;
2414 hints.ai_socktype = socktype;
2415 hints.ai_protocol = protocol;
2416 hints.ai_flags = flags;
2417 error = getaddrinfo(hptr, pptr, &hints, &res0);
2418 if (error) {
2419 PyGAI_Err(error);
2420 return NULL;
2421 }
2422
2423 if ((all = PyList_New(0)) == NULL)
2424 goto err;
2425 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002426 PyObject *addr =
2427 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2428 if (addr == NULL)
2429 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002430 single = Py_BuildValue("iiisO", res->ai_family,
2431 res->ai_socktype, res->ai_protocol,
2432 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002433 addr);
2434 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002435 if (single == NULL)
2436 goto err;
2437
2438 if (PyList_Append(all, single))
2439 goto err;
2440 Py_XDECREF(single);
2441 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002442 return all;
2443 err:
2444 Py_XDECREF(single);
2445 Py_XDECREF(all);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002446 if (res0)
2447 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002448 return (PyObject *)NULL;
2449}
2450
2451static char getaddrinfo_doc[] =
2452"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2453 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2454\n\
2455Resolve host and port into addrinfo struct.";
2456
2457/* Python interface to getnameinfo(sa, flags). */
2458
2459/*ARGSUSED*/
2460static PyObject *
2461PySocket_getnameinfo(PyObject *self, PyObject *args)
2462{
2463 PyObject *sa = (PyObject *)NULL;
2464 int flags;
2465 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002466 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002467 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2468 struct addrinfo hints, *res = NULL;
2469 int error;
2470 PyObject *ret = (PyObject *)NULL;
2471
2472 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002473 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002474 return NULL;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002475 if (!PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, &scope_id))
2476 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002477 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002478 memset(&hints, 0, sizeof(hints));
2479 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002480 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002481 error = getaddrinfo(hostp, pbuf, &hints, &res);
2482 if (error) {
2483 PyGAI_Err(error);
2484 goto fail;
2485 }
2486 if (res->ai_next) {
2487 PyErr_SetString(PySocket_Error,
2488 "sockaddr resolved to multiple addresses");
2489 goto fail;
2490 }
2491 switch (res->ai_family) {
2492 case AF_INET:
2493 {
2494 char *t1;
2495 int t2;
2496 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2497 PyErr_SetString(PySocket_Error,
2498 "IPv4 sockaddr must be 2 tuple");
2499 goto fail;
2500 }
2501 break;
2502 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002503#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002504 case AF_INET6:
2505 {
2506 struct sockaddr_in6 *sin6;
2507 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2508 sin6->sin6_flowinfo = flowinfo;
2509 sin6->sin6_scope_id = scope_id;
2510 break;
2511 }
2512#endif
2513 }
2514 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2515 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2516 if (error) {
2517 PyGAI_Err(error);
2518 goto fail;
2519 }
2520 ret = Py_BuildValue("ss", hbuf, pbuf);
2521
2522fail:
2523 if (res)
2524 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002525 return ret;
2526}
2527
2528static char getnameinfo_doc[] =
2529"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2530\n\
2531Get host and port for a sockaddr.";
2532
Guido van Rossum30a685f1991-06-27 15:51:29 +00002533/* List of functions exported by this module. */
2534
Guido van Rossum73624e91994-10-10 17:59:00 +00002535static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002536 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002537 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002538 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002539 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002540 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002541 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002542 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002543 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002544 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002545 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002546 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002547 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002548#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002549 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002550 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002551#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002552 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002553 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002554 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002555 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002556 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002557 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002558 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002559 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002560 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002561 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002562 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002563 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002564 {"getaddrinfo", PySocket_getaddrinfo,
2565 METH_VARARGS, getaddrinfo_doc},
2566 {"getnameinfo", PySocket_getnameinfo,
2567 METH_VARARGS, getnameinfo_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00002568 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002569};
2570
Guido van Rossum30a685f1991-06-27 15:51:29 +00002571
2572/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002573 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002574 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002575 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002576static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002577insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002578{
Guido van Rossum73624e91994-10-10 17:59:00 +00002579 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002580 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002581 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002582
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002583 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002584}
2585
Guido van Rossum30a685f1991-06-27 15:51:29 +00002586
Guido van Rossum8d665e61996-06-26 18:22:49 +00002587#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002588
2589/* Additional initialization and cleanup for NT/Windows */
2590
2591static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002592NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002593{
2594 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002595}
2596
2597static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002598NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002599{
2600 WSADATA WSAData;
2601 int ret;
2602 char buf[100];
2603 ret = WSAStartup(0x0101, &WSAData);
2604 switch (ret) {
2605 case 0: /* no error */
2606 atexit(NTcleanup);
2607 return 1;
2608 case WSASYSNOTREADY:
2609 PyErr_SetString(PyExc_ImportError,
2610 "WSAStartup failed: network not ready");
2611 break;
2612 case WSAVERNOTSUPPORTED:
2613 case WSAEINVAL:
2614 PyErr_SetString(PyExc_ImportError,
2615 "WSAStartup failed: requested version not supported");
2616 break;
2617 default:
Tim Peters885d4572001-11-28 20:27:42 +00002618 PyOS_snprintf(buf, sizeof(buf),
2619 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002620 PyErr_SetString(PyExc_ImportError, buf);
2621 break;
2622 }
2623 return 0;
2624}
2625
Guido van Rossum8d665e61996-06-26 18:22:49 +00002626#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002627
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002628#if defined(PYOS_OS2)
2629
2630/* Additional initialization and cleanup for OS/2 */
2631
2632static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002633OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002634{
2635 /* No cleanup is necessary for OS/2 Sockets */
2636}
2637
2638static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002639OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002640{
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002641#if !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002642 char reason[64];
2643 int rc = sock_init();
2644
2645 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002646 atexit(OS2cleanup);
2647 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002648 }
2649
Tim Peters75cdad52001-11-28 22:07:30 +00002650 PyOS_snprintf(reason, sizeof(reason),
2651 "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002652 PyErr_SetString(PyExc_ImportError, reason);
2653
Guido van Rossum32c575d1997-12-02 20:37:32 +00002654 return 0; /* Indicate Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002655#else
2656 /* no need to initialise sockets with GCC/EMX */
2657 return 1;
2658#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002659}
2660
2661#endif /* PYOS_OS2 */
2662
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002663/* C API table - always add new things to the end for binary
2664 compatibility. */
2665static
2666PySocketModule_APIObject PySocketModuleAPI =
2667{
2668 &PySocketSock_Type,
2669};
2670
Guido van Rossum30a685f1991-06-27 15:51:29 +00002671/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002672 * This is called when the first 'import socket' is done,
2673 * via a table in config.c, if config.c is compiled with USE_SOCKET
2674 * defined.
2675 *
2676 * For MS_WINDOWS (which means any Windows variant), this module
2677 * is actually called "_socket", and there's a wrapper "socket.py"
2678 * which implements some missing functionality (such as makefile(),
2679 * dup() and fromfd()). The import of "_socket" may fail with an
2680 * ImportError exception if initialization of WINSOCK fails. When
2681 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2682 * scheduled to be made at exit time.
2683 *
2684 * For OS/2, this module is also called "_socket" and uses a wrapper
2685 * "socket.py" which implements that functionality that is missing
2686 * when PC operating systems don't put socket descriptors in the
2687 * operating system's filesystem layer.
2688 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002689
Guido van Rossum82a5c661998-07-07 20:45:43 +00002690static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002691"Implementation module for socket operations. See the socket module\n\
2692for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002693
Guido van Rossum3886bb61998-12-04 18:50:17 +00002694DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002695init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002696{
Guido van Rossum73624e91994-10-10 17:59:00 +00002697 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002698#ifdef RISCOS
2699 _kernel_swi_regs r;
2700 r.r[0]=0;
2701 _kernel_swi(0x43380, &r, &r);
2702 taskwindow = r.r[0];
2703#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002704#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002705 if (!NTinit())
2706 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002707#else
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002708#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002709 if (!OS2init())
2710 return;
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002711#endif /* PYOS_OS2 */
Fred Drakea136d492000-08-16 14:18:30 +00002712#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002713#endif /* RISCOS */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002714 PySocketSock_Type.ob_type = &PyType_Type;
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002715 PySocketSock_Type.tp_getattro = PyObject_GenericGetAttr;
2716 PySocketSock_Type.tp_alloc = PyType_GenericAlloc;
2717 PySocketSock_Type.tp_free = _PyObject_Del;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002718 m = Py_InitModule3(PySocket_MODULE_NAME,
2719 PySocket_methods,
2720 module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00002721 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002722 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2723 if (PySocket_Error == NULL)
2724 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002725 PyDict_SetItemString(d, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002726 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
2727 if (PyH_Error == NULL)
2728 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002729 PyDict_SetItemString(d, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002730 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
2731 NULL);
2732 if (PyGAI_Error == NULL)
2733 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002734 PyDict_SetItemString(d, "gaierror", PyGAI_Error);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002735 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002736 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002737 return;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002738 if (PyDict_SetItemString(d, "socket",
2739 (PyObject *)&PySocketSock_Type) != 0)
2740 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002741
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002742 /* Export C API */
2743 if (PyDict_SetItemString(d, PySocket_CAPI_NAME,
2744 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
2745 ) != 0)
2746 return;
2747
Guido van Rossum09be4091999-08-09 14:40:40 +00002748 /* Address families (we only support AF_INET and AF_UNIX) */
2749#ifdef AF_UNSPEC
2750 insint(d, "AF_UNSPEC", AF_UNSPEC);
2751#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002752 insint(d, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002753#ifdef AF_INET6
2754 insint(d, "AF_INET6", AF_INET6);
2755#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002756#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002757 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002758#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002759#ifdef AF_AX25
2760 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2761#endif
2762#ifdef AF_IPX
2763 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2764#endif
2765#ifdef AF_APPLETALK
2766 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2767#endif
2768#ifdef AF_NETROM
2769 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2770#endif
2771#ifdef AF_BRIDGE
2772 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2773#endif
2774#ifdef AF_AAL5
2775 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2776#endif
2777#ifdef AF_X25
2778 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2779#endif
2780#ifdef AF_INET6
2781 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2782#endif
2783#ifdef AF_ROSE
2784 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2785#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002786#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00002787 insint(d, "AF_PACKET", AF_PACKET);
2788 insint(d, "PF_PACKET", PF_PACKET);
2789 insint(d, "PACKET_HOST", PACKET_HOST);
2790 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
2791 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
2792 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
2793 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
2794 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
2795 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002796#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002797
2798 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002799 insint(d, "SOCK_STREAM", SOCK_STREAM);
2800 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002801#ifndef __BEOS__
2802/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002803 insint(d, "SOCK_RAW", SOCK_RAW);
2804 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2805 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002806#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002807
2808#ifdef SO_DEBUG
2809 insint(d, "SO_DEBUG", SO_DEBUG);
2810#endif
2811#ifdef SO_ACCEPTCONN
2812 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2813#endif
2814#ifdef SO_REUSEADDR
2815 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2816#endif
2817#ifdef SO_KEEPALIVE
2818 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2819#endif
2820#ifdef SO_DONTROUTE
2821 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2822#endif
2823#ifdef SO_BROADCAST
2824 insint(d, "SO_BROADCAST", SO_BROADCAST);
2825#endif
2826#ifdef SO_USELOOPBACK
2827 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2828#endif
2829#ifdef SO_LINGER
2830 insint(d, "SO_LINGER", SO_LINGER);
2831#endif
2832#ifdef SO_OOBINLINE
2833 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2834#endif
2835#ifdef SO_REUSEPORT
2836 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2837#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002838#ifdef SO_SNDBUF
2839 insint(d, "SO_SNDBUF", SO_SNDBUF);
2840#endif
2841#ifdef SO_RCVBUF
2842 insint(d, "SO_RCVBUF", SO_RCVBUF);
2843#endif
2844#ifdef SO_SNDLOWAT
2845 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2846#endif
2847#ifdef SO_RCVLOWAT
2848 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2849#endif
2850#ifdef SO_SNDTIMEO
2851 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2852#endif
2853#ifdef SO_RCVTIMEO
2854 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2855#endif
2856#ifdef SO_ERROR
2857 insint(d, "SO_ERROR", SO_ERROR);
2858#endif
2859#ifdef SO_TYPE
2860 insint(d, "SO_TYPE", SO_TYPE);
2861#endif
2862
2863 /* Maximum number of connections for "listen" */
2864#ifdef SOMAXCONN
2865 insint(d, "SOMAXCONN", SOMAXCONN);
2866#else
2867 insint(d, "SOMAXCONN", 5); /* Common value */
2868#endif
2869
2870 /* Flags for send, recv */
2871#ifdef MSG_OOB
2872 insint(d, "MSG_OOB", MSG_OOB);
2873#endif
2874#ifdef MSG_PEEK
2875 insint(d, "MSG_PEEK", MSG_PEEK);
2876#endif
2877#ifdef MSG_DONTROUTE
2878 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2879#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002880#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00002881 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002882#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002883#ifdef MSG_EOR
2884 insint(d, "MSG_EOR", MSG_EOR);
2885#endif
2886#ifdef MSG_TRUNC
2887 insint(d, "MSG_TRUNC", MSG_TRUNC);
2888#endif
2889#ifdef MSG_CTRUNC
2890 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2891#endif
2892#ifdef MSG_WAITALL
2893 insint(d, "MSG_WAITALL", MSG_WAITALL);
2894#endif
2895#ifdef MSG_BTAG
2896 insint(d, "MSG_BTAG", MSG_BTAG);
2897#endif
2898#ifdef MSG_ETAG
2899 insint(d, "MSG_ETAG", MSG_ETAG);
2900#endif
2901
2902 /* Protocol level and numbers, usable for [gs]etsockopt */
2903#ifdef SOL_SOCKET
2904 insint(d, "SOL_SOCKET", SOL_SOCKET);
2905#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002906#ifdef SOL_IP
2907 insint(d, "SOL_IP", SOL_IP);
2908#else
2909 insint(d, "SOL_IP", 0);
2910#endif
2911#ifdef SOL_IPX
2912 insint(d, "SOL_IPX", SOL_IPX);
2913#endif
2914#ifdef SOL_AX25
2915 insint(d, "SOL_AX25", SOL_AX25);
2916#endif
2917#ifdef SOL_ATALK
2918 insint(d, "SOL_ATALK", SOL_ATALK);
2919#endif
2920#ifdef SOL_NETROM
2921 insint(d, "SOL_NETROM", SOL_NETROM);
2922#endif
2923#ifdef SOL_ROSE
2924 insint(d, "SOL_ROSE", SOL_ROSE);
2925#endif
2926#ifdef SOL_TCP
2927 insint(d, "SOL_TCP", SOL_TCP);
2928#else
2929 insint(d, "SOL_TCP", 6);
2930#endif
2931#ifdef SOL_UDP
2932 insint(d, "SOL_UDP", SOL_UDP);
2933#else
2934 insint(d, "SOL_UDP", 17);
2935#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002936#ifdef IPPROTO_IP
2937 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002938#else
2939 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002940#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002941#ifdef IPPROTO_HOPOPTS
2942 insint(d, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
2943#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002944#ifdef IPPROTO_ICMP
2945 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002946#else
2947 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002948#endif
2949#ifdef IPPROTO_IGMP
2950 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2951#endif
2952#ifdef IPPROTO_GGP
2953 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2954#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002955#ifdef IPPROTO_IPV4
2956 insint(d, "IPPROTO_IPV4", IPPROTO_IPV4);
2957#endif
2958#ifdef IPPROTO_IPIP
2959 insint(d, "IPPROTO_IPIP", IPPROTO_IPIP);
2960#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002961#ifdef IPPROTO_TCP
2962 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002963#else
2964 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002965#endif
2966#ifdef IPPROTO_EGP
2967 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2968#endif
2969#ifdef IPPROTO_PUP
2970 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2971#endif
2972#ifdef IPPROTO_UDP
2973 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002974#else
2975 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002976#endif
2977#ifdef IPPROTO_IDP
2978 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2979#endif
2980#ifdef IPPROTO_HELLO
2981 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2982#endif
2983#ifdef IPPROTO_ND
2984 insint(d, "IPPROTO_ND", IPPROTO_ND);
2985#endif
2986#ifdef IPPROTO_TP
2987 insint(d, "IPPROTO_TP", IPPROTO_TP);
2988#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002989#ifdef IPPROTO_IPV6
2990 insint(d, "IPPROTO_IPV6", IPPROTO_IPV6);
2991#endif
2992#ifdef IPPROTO_ROUTING
2993 insint(d, "IPPROTO_ROUTING", IPPROTO_ROUTING);
2994#endif
2995#ifdef IPPROTO_FRAGMENT
2996 insint(d, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
2997#endif
2998#ifdef IPPROTO_RSVP
2999 insint(d, "IPPROTO_RSVP", IPPROTO_RSVP);
3000#endif
3001#ifdef IPPROTO_GRE
3002 insint(d, "IPPROTO_GRE", IPPROTO_GRE);
3003#endif
3004#ifdef IPPROTO_ESP
3005 insint(d, "IPPROTO_ESP", IPPROTO_ESP);
3006#endif
3007#ifdef IPPROTO_AH
3008 insint(d, "IPPROTO_AH", IPPROTO_AH);
3009#endif
3010#ifdef IPPROTO_MOBILE
3011 insint(d, "IPPROTO_MOBILE", IPPROTO_MOBILE);
3012#endif
3013#ifdef IPPROTO_ICMPV6
3014 insint(d, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
3015#endif
3016#ifdef IPPROTO_NONE
3017 insint(d, "IPPROTO_NONE", IPPROTO_NONE);
3018#endif
3019#ifdef IPPROTO_DSTOPTS
3020 insint(d, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
3021#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003022#ifdef IPPROTO_XTP
3023 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
3024#endif
3025#ifdef IPPROTO_EON
3026 insint(d, "IPPROTO_EON", IPPROTO_EON);
3027#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003028#ifdef IPPROTO_PIM
3029 insint(d, "IPPROTO_PIM", IPPROTO_PIM);
3030#endif
3031#ifdef IPPROTO_IPCOMP
3032 insint(d, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
3033#endif
3034#ifdef IPPROTO_VRRP
3035 insint(d, "IPPROTO_VRRP", IPPROTO_VRRP);
3036#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003037#ifdef IPPROTO_BIP
3038 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
3039#endif
3040/**/
3041#ifdef IPPROTO_RAW
3042 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003043#else
3044 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003045#endif
3046#ifdef IPPROTO_MAX
3047 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
3048#endif
3049
3050 /* Some port configuration */
3051#ifdef IPPORT_RESERVED
3052 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
3053#else
3054 insint(d, "IPPORT_RESERVED", 1024);
3055#endif
3056#ifdef IPPORT_USERRESERVED
3057 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
3058#else
3059 insint(d, "IPPORT_USERRESERVED", 5000);
3060#endif
3061
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003062 /* Some reserved IP v.4 addresses */
3063#ifdef INADDR_ANY
3064 insint(d, "INADDR_ANY", INADDR_ANY);
3065#else
3066 insint(d, "INADDR_ANY", 0x00000000);
3067#endif
3068#ifdef INADDR_BROADCAST
3069 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
3070#else
3071 insint(d, "INADDR_BROADCAST", 0xffffffff);
3072#endif
3073#ifdef INADDR_LOOPBACK
3074 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
3075#else
3076 insint(d, "INADDR_LOOPBACK", 0x7F000001);
3077#endif
3078#ifdef INADDR_UNSPEC_GROUP
3079 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
3080#else
3081 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
3082#endif
3083#ifdef INADDR_ALLHOSTS_GROUP
3084 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
3085#else
3086 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
3087#endif
3088#ifdef INADDR_MAX_LOCAL_GROUP
3089 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
3090#else
3091 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
3092#endif
3093#ifdef INADDR_NONE
3094 insint(d, "INADDR_NONE", INADDR_NONE);
3095#else
3096 insint(d, "INADDR_NONE", 0xffffffff);
3097#endif
3098
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003099 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003100#ifdef IP_OPTIONS
3101 insint(d, "IP_OPTIONS", IP_OPTIONS);
3102#endif
3103#ifdef IP_HDRINCL
3104 insint(d, "IP_HDRINCL", IP_HDRINCL);
3105#endif
3106#ifdef IP_TOS
3107 insint(d, "IP_TOS", IP_TOS);
3108#endif
3109#ifdef IP_TTL
3110 insint(d, "IP_TTL", IP_TTL);
3111#endif
3112#ifdef IP_RECVOPTS
3113 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
3114#endif
3115#ifdef IP_RECVRETOPTS
3116 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
3117#endif
3118#ifdef IP_RECVDSTADDR
3119 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
3120#endif
3121#ifdef IP_RETOPTS
3122 insint(d, "IP_RETOPTS", IP_RETOPTS);
3123#endif
3124#ifdef IP_MULTICAST_IF
3125 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
3126#endif
3127#ifdef IP_MULTICAST_TTL
3128 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
3129#endif
3130#ifdef IP_MULTICAST_LOOP
3131 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
3132#endif
3133#ifdef IP_ADD_MEMBERSHIP
3134 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
3135#endif
3136#ifdef IP_DROP_MEMBERSHIP
3137 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
3138#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003139#ifdef IP_DEFAULT_MULTICAST_TTL
3140 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
3141#endif
3142#ifdef IP_DEFAULT_MULTICAST_LOOP
3143 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
3144#endif
3145#ifdef IP_MAX_MEMBERSHIPS
3146 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
3147#endif
3148
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003149 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3150#ifdef IPV6_JOIN_GROUP
3151 insint(d, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
3152#endif
3153#ifdef IPV6_LEAVE_GROUP
3154 insint(d, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
3155#endif
3156#ifdef IPV6_MULTICAST_HOPS
3157 insint(d, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
3158#endif
3159#ifdef IPV6_MULTICAST_IF
3160 insint(d, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
3161#endif
3162#ifdef IPV6_MULTICAST_LOOP
3163 insint(d, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
3164#endif
3165#ifdef IPV6_UNICAST_HOPS
3166 insint(d, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
3167#endif
3168
Guido van Rossum09be4091999-08-09 14:40:40 +00003169 /* TCP options */
3170#ifdef TCP_NODELAY
3171 insint(d, "TCP_NODELAY", TCP_NODELAY);
3172#endif
3173#ifdef TCP_MAXSEG
3174 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
3175#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003176#ifdef TCP_CORK
3177 insint(d, "TCP_CORK", TCP_CORK);
3178#endif
3179#ifdef TCP_KEEPIDLE
3180 insint(d, "TCP_KEEPIDLE", TCP_KEEPIDLE);
3181#endif
3182#ifdef TCP_KEEPINTVL
3183 insint(d, "TCP_KEEPINTVL", TCP_KEEPINTVL);
3184#endif
3185#ifdef TCP_KEEPCNT
3186 insint(d, "TCP_KEEPCNT", TCP_KEEPCNT);
3187#endif
3188#ifdef TCP_SYNCNT
3189 insint(d, "TCP_SYNCNT", TCP_SYNCNT);
3190#endif
3191#ifdef TCP_LINGER2
3192 insint(d, "TCP_LINGER2", TCP_LINGER2);
3193#endif
3194#ifdef TCP_DEFER_ACCEPT
3195 insint(d, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
3196#endif
3197#ifdef TCP_WINDOW_CLAMP
3198 insint(d, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
3199#endif
3200#ifdef TCP_INFO
3201 insint(d, "TCP_INFO", TCP_INFO);
3202#endif
3203#ifdef TCP_QUICKACK
3204 insint(d, "TCP_QUICKACK", TCP_QUICKACK);
3205#endif
3206
Guido van Rossum09be4091999-08-09 14:40:40 +00003207
3208 /* IPX options */
3209#ifdef IPX_TYPE
3210 insint(d, "IPX_TYPE", IPX_TYPE);
3211#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003212
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003213 /* get{addr,name}info parameters */
3214#ifdef EAI_ADDRFAMILY
3215 insint(d, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
3216#endif
3217#ifdef EAI_AGAIN
3218 insint(d, "EAI_AGAIN", EAI_AGAIN);
3219#endif
3220#ifdef EAI_BADFLAGS
3221 insint(d, "EAI_BADFLAGS", EAI_BADFLAGS);
3222#endif
3223#ifdef EAI_FAIL
3224 insint(d, "EAI_FAIL", EAI_FAIL);
3225#endif
3226#ifdef EAI_FAMILY
3227 insint(d, "EAI_FAMILY", EAI_FAMILY);
3228#endif
3229#ifdef EAI_MEMORY
3230 insint(d, "EAI_MEMORY", EAI_MEMORY);
3231#endif
3232#ifdef EAI_NODATA
3233 insint(d, "EAI_NODATA", EAI_NODATA);
3234#endif
3235#ifdef EAI_NONAME
3236 insint(d, "EAI_NONAME", EAI_NONAME);
3237#endif
3238#ifdef EAI_SERVICE
3239 insint(d, "EAI_SERVICE", EAI_SERVICE);
3240#endif
3241#ifdef EAI_SOCKTYPE
3242 insint(d, "EAI_SOCKTYPE", EAI_SOCKTYPE);
3243#endif
3244#ifdef EAI_SYSTEM
3245 insint(d, "EAI_SYSTEM", EAI_SYSTEM);
3246#endif
3247#ifdef EAI_BADHINTS
3248 insint(d, "EAI_BADHINTS", EAI_BADHINTS);
3249#endif
3250#ifdef EAI_PROTOCOL
3251 insint(d, "EAI_PROTOCOL", EAI_PROTOCOL);
3252#endif
3253#ifdef EAI_MAX
3254 insint(d, "EAI_MAX", EAI_MAX);
3255#endif
3256#ifdef AI_PASSIVE
3257 insint(d, "AI_PASSIVE", AI_PASSIVE);
3258#endif
3259#ifdef AI_CANONNAME
3260 insint(d, "AI_CANONNAME", AI_CANONNAME);
3261#endif
3262#ifdef AI_NUMERICHOST
3263 insint(d, "AI_NUMERICHOST", AI_NUMERICHOST);
3264#endif
3265#ifdef AI_MASK
3266 insint(d, "AI_MASK", AI_MASK);
3267#endif
3268#ifdef AI_ALL
3269 insint(d, "AI_ALL", AI_ALL);
3270#endif
3271#ifdef AI_V4MAPPED_CFG
3272 insint(d, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
3273#endif
3274#ifdef AI_ADDRCONFIG
3275 insint(d, "AI_ADDRCONFIG", AI_ADDRCONFIG);
3276#endif
3277#ifdef AI_V4MAPPED
3278 insint(d, "AI_V4MAPPED", AI_V4MAPPED);
3279#endif
3280#ifdef AI_DEFAULT
3281 insint(d, "AI_DEFAULT", AI_DEFAULT);
3282#endif
3283#ifdef NI_MAXHOST
3284 insint(d, "NI_MAXHOST", NI_MAXHOST);
3285#endif
3286#ifdef NI_MAXSERV
3287 insint(d, "NI_MAXSERV", NI_MAXSERV);
3288#endif
3289#ifdef NI_NOFQDN
3290 insint(d, "NI_NOFQDN", NI_NOFQDN);
3291#endif
3292#ifdef NI_NUMERICHOST
3293 insint(d, "NI_NUMERICHOST", NI_NUMERICHOST);
3294#endif
3295#ifdef NI_NAMEREQD
3296 insint(d, "NI_NAMEREQD", NI_NAMEREQD);
3297#endif
3298#ifdef NI_NUMERICSERV
3299 insint(d, "NI_NUMERICSERV", NI_NUMERICSERV);
3300#endif
3301#ifdef NI_DGRAM
3302 insint(d, "NI_DGRAM", NI_DGRAM);
3303#endif
3304
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003305 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003306#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003307 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003308#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003309}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003310
3311/* Simplistic emulation code for inet_pton that only works for IPv4 */
3312#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003313int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003314inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003315{
3316 if(af == AF_INET){
3317 long packed_addr;
3318#ifdef USE_GUSI1
3319 packed_addr = (long)inet_addr(src).s_addr;
3320#else
3321 packed_addr = inet_addr(src);
3322#endif
3323 if (packed_addr == INADDR_NONE)
3324 return 0;
3325 memcpy(dst, &packed_addr, 4);
3326 return 1;
3327 }
3328 /* Should set errno to EAFNOSUPPORT */
3329 return -1;
3330}
3331
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003332const char *
3333inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003334{
3335 if (af == AF_INET) {
3336 struct in_addr packed_addr;
3337 if (size < 16)
3338 /* Should set errno to ENOSPC. */
3339 return NULL;
3340 memcpy(&packed_addr, src, sizeof(packed_addr));
3341 return strncpy(dst, inet_ntoa(packed_addr), size);
3342 }
3343 /* Should set errno to EAFNOSUPPORT */
3344 return NULL;
3345}
3346#endif