blob: 2f954a9ce3929790366bcacd585b4c3a65d5b6e3 [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
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000230#if defined(PYOS_OS2)
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
355#if defined(PYOS_OS2)
356 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
412 if (error == EAI_SYSTEM)
413 return PySocket_Err();
414
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000415#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000416 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000417#else
418 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
419#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000420 if (v != NULL) {
421 PyErr_SetObject(PyGAI_Error, v);
422 Py_DECREF(v);
423 }
424
425 return NULL;
426}
427
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000428/* Initialize a new socket object. */
429
430static void
431init_sockobject(PySocketSockObject *s,
432 SOCKET_T fd, int family, int type, int proto)
433{
434#ifdef RISCOS
435 int block = 1;
436#endif
437 s->sock_fd = fd;
438 s->sock_family = family;
439 s->sock_type = type;
440 s->sock_proto = proto;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000441 s->errorhandler = &PySocket_Err;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000442#ifdef RISCOS
443 if(taskwindow) {
444 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
445 }
446#endif
447}
448
449
Guido van Rossum30a685f1991-06-27 15:51:29 +0000450/* Create a new socket object.
451 This just creates the object and initializes it.
452 If the creation fails, return NULL and set an exception (implicit
453 in NEWOBJ()). */
454
Guido van Rossum73624e91994-10-10 17:59:00 +0000455static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000456PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000457{
Guido van Rossum73624e91994-10-10 17:59:00 +0000458 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000459 s = (PySocketSockObject *)
460 PyType_GenericNew(&PySocketSock_Type, NULL, NULL);
461 if (s != NULL)
462 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000463 return s;
464}
465
Guido van Rossum30a685f1991-06-27 15:51:29 +0000466
Guido van Rossum48a680c2001-03-02 06:34:14 +0000467/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000468 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000469#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000470PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000471#endif
472
473
Guido van Rossum30a685f1991-06-27 15:51:29 +0000474/* Convert a string specifying a host name or one of a few symbolic
475 names to a numeric IP address. This usually calls gethostbyname()
476 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000477 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000478 an error occurred; then an exception is raised. */
479
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000480static int
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000481setipaddr(char* name, struct sockaddr * addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000482{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000483 struct addrinfo hints, *res;
484 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000485
Guido van Rossuma376cc51996-12-05 23:43:35 +0000486 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000487 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000488 int siz;
489 memset(&hints, 0, sizeof(hints));
490 hints.ai_family = af;
491 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
492 hints.ai_flags = AI_PASSIVE;
493 error = getaddrinfo(NULL, "0", &hints, &res);
494 if (error) {
495 PyGAI_Err(error);
496 return -1;
497 }
498 switch (res->ai_family) {
499 case AF_INET:
500 siz = 4;
501 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000502#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000503 case AF_INET6:
504 siz = 16;
505 break;
506#endif
507 default:
508 freeaddrinfo(res);
509 PyErr_SetString(PySocket_Error,
510 "unsupported address family");
511 return -1;
512 }
513 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000514 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000515 PyErr_SetString(PySocket_Error,
516 "wildcard resolved to multiple address");
517 return -1;
518 }
519 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
520 freeaddrinfo(res);
521 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000522 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000523 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000524 struct sockaddr_in *sin;
525 if (af != PF_INET && af != PF_UNSPEC) {
526 PyErr_SetString(PySocket_Error,
527 "address family mismatched");
528 return -1;
529 }
530 sin = (struct sockaddr_in *)addr_ret;
531 memset((void *) sin, '\0', sizeof(*sin));
532 sin->sin_family = AF_INET;
533#ifdef HAVE_SOCKADDR_SA_LEN
534 sin->sin_len = sizeof(*sin);
535#endif
536 sin->sin_addr.s_addr = INADDR_BROADCAST;
537 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000538 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000539 memset(&hints, 0, sizeof(hints));
540 hints.ai_family = af;
541 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000542#if defined(__digital__) && defined(__unix__)
Martin v. Löwisb8fc9722001-10-24 17:35:46 +0000543 if (error == EAI_NONAME && af == AF_UNSPEC) {
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000544 /* On Tru64 V5.1, numeric-to-addr conversion
Martin v. Löwis861a65b2001-10-24 14:36:00 +0000545 fails if no address family is given. Assume IPv4 for now.*/
546 hints.ai_family = AF_INET;
547 error = getaddrinfo(name, NULL, &hints, &res);
548 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000549#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000550 if (error) {
551 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000552 return -1;
553 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000554 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
555 freeaddrinfo(res);
556 switch (addr_ret->sa_family) {
557 case AF_INET:
558 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000559#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000560 case AF_INET6:
561 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000562#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000563 default:
564 PyErr_SetString(PySocket_Error, "unknown address family");
565 return -1;
566 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000567}
568
Guido van Rossum30a685f1991-06-27 15:51:29 +0000569
Guido van Rossum30a685f1991-06-27 15:51:29 +0000570/* Create a string object representing an IP address.
571 This is always a string of the form 'dd.dd.dd.dd' (with variable
572 size numbers). */
573
Guido van Rossum73624e91994-10-10 17:59:00 +0000574static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000575makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000576{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000577 char buf[NI_MAXHOST];
578 int error;
579
580 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
581 NI_NUMERICHOST);
582 if (error) {
583 PyGAI_Err(error);
584 return NULL;
585 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000586 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000587}
588
589
590/* Create an object representing the given socket address,
591 suitable for passing it back to bind(), connect() etc.
592 The family field of the sockaddr structure is inspected
593 to determine what kind of address it really is. */
594
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000595/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000596static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000597makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000598{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000599 if (addrlen == 0) {
600 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000601 Py_INCREF(Py_None);
602 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000603 }
604
Guido van Rossumbcc20741998-08-04 22:53:56 +0000605#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000606 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000607 addr->sa_family = AF_INET;
608#endif
609
Guido van Rossum30a685f1991-06-27 15:51:29 +0000610 switch (addr->sa_family) {
611
612 case AF_INET:
613 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000614 struct sockaddr_in *a;
615 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000616 PyObject *ret = NULL;
617 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000618 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000619 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
620 Py_DECREF(addrobj);
621 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000622 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000623 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000624
Guido van Rossumb6775db1994-08-01 11:34:53 +0000625#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000626 case AF_UNIX:
627 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000628 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000629 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000630 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000631#endif /* AF_UNIX */
632
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000633#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000634 case AF_INET6:
635 {
636 struct sockaddr_in6 *a;
637 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
638 PyObject *ret = NULL;
639 if (addrobj) {
640 a = (struct sockaddr_in6 *)addr;
641 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
642 a->sin6_flowinfo, a->sin6_scope_id);
643 Py_DECREF(addrobj);
644 }
645 return ret;
646 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000647#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000648
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000649#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000650 case AF_PACKET:
651 {
652 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
653 char *ifname = "";
654 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000655 /* need to look up interface name give index */
656 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000657 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000658 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000659 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000660 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000661 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000662 a->sll_pkttype, a->sll_hatype,
663 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000664 }
665#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000666
Guido van Rossum30a685f1991-06-27 15:51:29 +0000667 /* More cases here... */
668
669 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000670 /* If we don't know the address family, don't raise an
671 exception -- return it as a tuple. */
672 return Py_BuildValue("is#",
673 addr->sa_family,
674 addr->sa_data,
675 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000676
Guido van Rossum30a685f1991-06-27 15:51:29 +0000677 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000678}
679
Guido van Rossum30a685f1991-06-27 15:51:29 +0000680
681/* Parse a socket address argument according to the socket object's
682 address family. Return 1 if the address was in the proper format,
683 0 of not. The address is returned through addr_ret, its length
684 through len_ret. */
685
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000686static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000687getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000688 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000689{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000690 switch (s->sock_family) {
691
Guido van Rossumb6775db1994-08-01 11:34:53 +0000692#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000693 case AF_UNIX:
694 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000695 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000696 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000697 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000698 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000699 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000700 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000701 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000702 PyErr_SetString(PySocket_Error,
703 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000704 return 0;
705 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000706 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000707 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000708 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000709 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000710 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000711 return 1;
712 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000713#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000714
Guido van Rossum30a685f1991-06-27 15:51:29 +0000715 case AF_INET:
716 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000717 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000718 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000719 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000720 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000721 if (!PyTuple_Check(args)) {
722 PyErr_Format(PyExc_TypeError,
723 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
724 args->ob_type->tp_name);
725 return 0;
726 }
727 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000728 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000729 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000730 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000731 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000732 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000733 *addr_ret = (struct sockaddr *) addr;
734 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000735 return 1;
736 }
737
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000738#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000739 case AF_INET6:
740 {
741 struct sockaddr_in6* addr;
742 char *host;
743 int port, flowinfo, scope_id;
744 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
745 flowinfo = scope_id = 0;
746 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
747 &scope_id)) {
748 return 0;
749 }
750 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
751 return 0;
752 addr->sin6_family = s->sock_family;
753 addr->sin6_port = htons((short)port);
754 addr->sin6_flowinfo = flowinfo;
755 addr->sin6_scope_id = scope_id;
756 *addr_ret = (struct sockaddr *) addr;
757 *len_ret = sizeof *addr;
758 return 1;
759 }
760#endif
761
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000762#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000763 case AF_PACKET:
764 {
765 struct sockaddr_ll* addr;
766 struct ifreq ifr;
767 char *interfaceName;
768 int protoNumber;
769 int hatype = 0;
770 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000771 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000772
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000773 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
774 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000775 return 0;
776 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
777 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000778 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000779 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +0000780 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000781 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000782 addr = &(s->sock_addr.ll);
783 addr->sll_family = AF_PACKET;
784 addr->sll_protocol = htons((short)protoNumber);
785 addr->sll_ifindex = ifr.ifr_ifindex;
786 addr->sll_pkttype = pkttype;
787 addr->sll_hatype = hatype;
788 *addr_ret = (struct sockaddr *) addr;
789 *len_ret = sizeof *addr;
790 return 1;
791 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000792#endif
793
Guido van Rossum30a685f1991-06-27 15:51:29 +0000794 /* More cases here... */
795
796 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000797 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000798 return 0;
799
800 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000801}
802
Guido van Rossum30a685f1991-06-27 15:51:29 +0000803
Guido van Rossum48a680c2001-03-02 06:34:14 +0000804/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000805 Return 1 if the family is known, 0 otherwise. The length is returned
806 through len_ret. */
807
808static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000809getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000810{
811 switch (s->sock_family) {
812
Guido van Rossumb6775db1994-08-01 11:34:53 +0000813#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000814 case AF_UNIX:
815 {
816 *len_ret = sizeof (struct sockaddr_un);
817 return 1;
818 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000819#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000820
821 case AF_INET:
822 {
823 *len_ret = sizeof (struct sockaddr_in);
824 return 1;
825 }
826
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000827#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000828 case AF_INET6:
829 {
830 *len_ret = sizeof (struct sockaddr_in6);
831 return 1;
832 }
833#endif
834
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000835#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000836 case AF_PACKET:
837 {
838 *len_ret = sizeof (struct sockaddr_ll);
839 return 1;
840 }
841#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000842
Guido van Rossum710e1df1992-06-12 10:39:36 +0000843 /* More cases here... */
844
845 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000846 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000847 return 0;
848
849 }
850}
851
852
Guido van Rossum30a685f1991-06-27 15:51:29 +0000853/* s.accept() method */
854
Guido van Rossum73624e91994-10-10 17:59:00 +0000855static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000856PySocketSock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000857{
858 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000859 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000860 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000861 PyObject *sock = NULL;
862 PyObject *addr = NULL;
863 PyObject *res = NULL;
864
Guido van Rossum710e1df1992-06-12 10:39:36 +0000865 if (!getsockaddrlen(s, &addrlen))
866 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000867 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000868 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000869 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000870 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000871#ifdef MS_WINDOWS
872 if (newfd == INVALID_SOCKET)
873#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000874 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000875#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000876 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +0000877
Guido van Rossum30a685f1991-06-27 15:51:29 +0000878 /* Create the new object with unspecified family,
879 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000880 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000881 s->sock_family,
882 s->sock_type,
883 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000884 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000885 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000886 goto finally;
887 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000888 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000889 addrlen);
890 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000891 goto finally;
892
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000893 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000894
895 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000896 Py_XDECREF(sock);
897 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000898 return res;
899}
900
Guido van Rossum82a5c661998-07-07 20:45:43 +0000901static char accept_doc[] =
902"accept() -> (socket object, address info)\n\
903\n\
904Wait for an incoming connection. Return a new socket representing the\n\
905connection, and the address of the client. For IP sockets, the address\n\
906info is a pair (hostaddr, port).";
907
Guido van Rossum30a685f1991-06-27 15:51:29 +0000908
Guido van Rossume4485b01994-09-07 14:32:49 +0000909/* s.setblocking(1 | 0) method */
910
Guido van Rossum73624e91994-10-10 17:59:00 +0000911static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000912PySocketSock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +0000913{
914 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000915#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000916#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000917 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000918#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000919#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000920 block = PyInt_AsLong(arg);
921 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +0000922 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000923 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000924#ifdef __BEOS__
925 block = !block;
926 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
927 (void *)(&block), sizeof( int ) );
928#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000929#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000930#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000931#ifdef PYOS_OS2
932 block = !block;
933 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
934#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000935 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
936 if (block)
937 delay_flag &= (~O_NDELAY);
938 else
939 delay_flag |= O_NDELAY;
940 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000941#endif /* !PYOS_OS2 */
942#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000943 block = !block;
944 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000945#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000946#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000947#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +0000948 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000949
Guido van Rossum73624e91994-10-10 17:59:00 +0000950 Py_INCREF(Py_None);
951 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000952}
Guido van Rossume4485b01994-09-07 14:32:49 +0000953
Guido van Rossum82a5c661998-07-07 20:45:43 +0000954static char setblocking_doc[] =
955"setblocking(flag)\n\
956\n\
957Set the socket to blocking (flag is true) or non-blocking (false).\n\
958This uses the FIONBIO ioctl with the O_NDELAY flag.";
959
Guido van Rossume4485b01994-09-07 14:32:49 +0000960
Guido van Rossum48a680c2001-03-02 06:34:14 +0000961#ifdef RISCOS
962/* s.sleeptaskw(1 | 0) method */
963
964static PyObject *
965PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
966{
967 int block;
968 int delay_flag;
969 if (!PyArg_GetInt(args, &block))
970 return NULL;
971 Py_BEGIN_ALLOW_THREADS
972 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
973 Py_END_ALLOW_THREADS
974
975 Py_INCREF(Py_None);
976 return Py_None;
977}
978static char sleeptaskw_doc[] =
979"sleeptaskw(flag)\n\
980\n\
981Allow sleeps in taskwindows.";
982#endif
983
984
Guido van Rossumaee08791992-09-08 09:05:33 +0000985/* s.setsockopt() method.
986 With an integer third argument, sets an integer option.
987 With a string third argument, sets an option from a buffer;
988 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000989
Guido van Rossum73624e91994-10-10 17:59:00 +0000990static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000991PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000992{
993 int level;
994 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000995 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000996 char *buf;
997 int buflen;
998 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000999
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001000 if (PyArg_ParseTuple(args, "iii:setsockopt",
1001 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001002 buf = (char *) &flag;
1003 buflen = sizeof flag;
1004 }
1005 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001006 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001007 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1008 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001009 return NULL;
1010 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001011 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001012 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001013 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001014 Py_INCREF(Py_None);
1015 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001016}
1017
Guido van Rossum82a5c661998-07-07 20:45:43 +00001018static char setsockopt_doc[] =
1019"setsockopt(level, option, value)\n\
1020\n\
1021Set a socket option. See the Unix manual for level and option.\n\
1022The value argument can either be an integer or a string.";
1023
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001024
Guido van Rossumaee08791992-09-08 09:05:33 +00001025/* s.getsockopt() method.
1026 With two arguments, retrieves an integer option.
1027 With a third integer argument, retrieves a string buffer of that size;
1028 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001029
Guido van Rossum73624e91994-10-10 17:59:00 +00001030static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001031PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001032{
1033 int level;
1034 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001035 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001036 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001037 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001038
Guido van Rossumbcc20741998-08-04 22:53:56 +00001039#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001040 /* We have incomplete socket support. */
1041 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001042 return NULL;
1043#else
1044
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001045 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1046 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001047 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001048
Guido van Rossumbe32c891996-06-20 16:25:29 +00001049 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001050 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001051 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001052 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001053 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001054 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001055 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001056 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001057 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001058 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001059 PyErr_SetString(PySocket_Error,
1060 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001061 return NULL;
1062 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001063 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001064 if (buf == NULL)
1065 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001066 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001067 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001068 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001069 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001070 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001071 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001072 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001073 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001074#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001075}
1076
Guido van Rossum82a5c661998-07-07 20:45:43 +00001077static char getsockopt_doc[] =
1078"getsockopt(level, option[, buffersize]) -> value\n\
1079\n\
1080Get a socket option. See the Unix manual for level and option.\n\
1081If a nonzero buffersize argument is given, the return value is a\n\
1082string of that length; otherwise it is an integer.";
1083
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001084
Fred Drake728819a2000-07-01 03:40:12 +00001085/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001086
Guido van Rossum73624e91994-10-10 17:59:00 +00001087static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001088PySocketSock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001089{
1090 struct sockaddr *addr;
1091 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001092 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001093
Fred Drake728819a2000-07-01 03:40:12 +00001094 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001095 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001096 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001097 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001098 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001099 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001100 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001101 Py_INCREF(Py_None);
1102 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001103}
1104
Guido van Rossum82a5c661998-07-07 20:45:43 +00001105static char bind_doc[] =
1106"bind(address)\n\
1107\n\
1108Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001109pair (host, port); the host must refer to the local host. For raw packet\n\
1110sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001111
Guido van Rossum30a685f1991-06-27 15:51:29 +00001112
1113/* s.close() method.
1114 Set the file descriptor to -1 so operations tried subsequently
1115 will surely fail. */
1116
Guido van Rossum73624e91994-10-10 17:59:00 +00001117static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001118PySocketSock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001119{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001120 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001121
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001122 if ((fd = s->sock_fd) != -1) {
1123 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001124 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001125 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001126 Py_END_ALLOW_THREADS
1127 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001128 Py_INCREF(Py_None);
1129 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001130}
1131
Guido van Rossum82a5c661998-07-07 20:45:43 +00001132static char close_doc[] =
1133"close()\n\
1134\n\
1135Close the socket. It cannot be used after this call.";
1136
Guido van Rossum30a685f1991-06-27 15:51:29 +00001137
Fred Drake728819a2000-07-01 03:40:12 +00001138/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001139
Guido van Rossum73624e91994-10-10 17:59:00 +00001140static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001141PySocketSock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001142{
1143 struct sockaddr *addr;
1144 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001145 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001146
Fred Drake728819a2000-07-01 03:40:12 +00001147 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001148 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001149 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001150 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001151 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001152 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001153 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001154 Py_INCREF(Py_None);
1155 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001156}
1157
Guido van Rossum82a5c661998-07-07 20:45:43 +00001158static char connect_doc[] =
1159"connect(address)\n\
1160\n\
1161Connect the socket to a remote address. For IP sockets, the address\n\
1162is a pair (host, port).";
1163
Guido van Rossum30a685f1991-06-27 15:51:29 +00001164
Fred Drake728819a2000-07-01 03:40:12 +00001165/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001166
1167static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001168PySocketSock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001169{
1170 struct sockaddr *addr;
1171 int addrlen;
1172 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001173
Fred Drake728819a2000-07-01 03:40:12 +00001174 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001175 return NULL;
1176 Py_BEGIN_ALLOW_THREADS
1177 res = connect(s->sock_fd, addr, addrlen);
1178 Py_END_ALLOW_THREADS
Tim Petersc32410a2001-10-30 01:26:49 +00001179 if (res != 0) {
1180#ifdef MS_WINDOWS
1181 res = WSAGetLastError();
1182#else
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001183 res = errno;
Tim Petersc32410a2001-10-30 01:26:49 +00001184#endif
1185 }
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001186 return PyInt_FromLong((long) res);
1187}
1188
Guido van Rossum82a5c661998-07-07 20:45:43 +00001189static char connect_ex_doc[] =
1190"connect_ex(address)\n\
1191\n\
1192This is like connect(address), but returns an error code (the errno value)\n\
1193instead of raising an exception when an error occurs.";
1194
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001195
Guido van Rossumed233a51992-06-23 09:07:03 +00001196/* s.fileno() method */
1197
Guido van Rossum73624e91994-10-10 17:59:00 +00001198static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001199PySocketSock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001200{
Fred Drakea04eaad2000-06-30 02:46:07 +00001201#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001202 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001203#else
1204 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1205#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001206}
1207
Guido van Rossum82a5c661998-07-07 20:45:43 +00001208static char fileno_doc[] =
1209"fileno() -> integer\n\
1210\n\
1211Return the integer file descriptor of the socket.";
1212
Guido van Rossumed233a51992-06-23 09:07:03 +00001213
Guido van Rossumbe32c891996-06-20 16:25:29 +00001214#ifndef NO_DUP
1215/* s.dup() method */
1216
1217static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001218PySocketSock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001219{
Fred Drakea04eaad2000-06-30 02:46:07 +00001220 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001221 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001222
Guido van Rossumbe32c891996-06-20 16:25:29 +00001223 newfd = dup(s->sock_fd);
1224 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001225 return s->errorhandler();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001226 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001227 s->sock_family,
1228 s->sock_type,
1229 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001230 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001231 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001232 return sock;
1233}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001234
1235static char dup_doc[] =
1236"dup() -> socket object\n\
1237\n\
1238Return a new socket object connected to the same system resource.";
1239
Guido van Rossumbe32c891996-06-20 16:25:29 +00001240#endif
1241
1242
Guido van Rossumc89705d1992-11-26 08:54:07 +00001243/* s.getsockname() method */
1244
Guido van Rossum73624e91994-10-10 17:59:00 +00001245static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001246PySocketSock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001247{
1248 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001249 int res;
1250 socklen_t addrlen;
1251
Guido van Rossumc89705d1992-11-26 08:54:07 +00001252 if (!getsockaddrlen(s, &addrlen))
1253 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001254 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001255 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001256 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001257 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001258 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001259 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001260 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001261}
1262
Guido van Rossum82a5c661998-07-07 20:45:43 +00001263static char getsockname_doc[] =
1264"getsockname() -> address info\n\
1265\n\
1266Return the address of the local endpoint. For IP sockets, the address\n\
1267info is a pair (hostaddr, port).";
1268
Guido van Rossumc89705d1992-11-26 08:54:07 +00001269
Guido van Rossumb6775db1994-08-01 11:34:53 +00001270#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001271/* s.getpeername() method */
1272
Guido van Rossum73624e91994-10-10 17:59:00 +00001273static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001274PySocketSock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001275{
1276 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001277 int res;
1278 socklen_t addrlen;
1279
Guido van Rossumc89705d1992-11-26 08:54:07 +00001280 if (!getsockaddrlen(s, &addrlen))
1281 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001282 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001283 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001284 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001285 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001286 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001287 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001288 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001289}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001290
1291static char getpeername_doc[] =
1292"getpeername() -> address info\n\
1293\n\
1294Return the address of the remote endpoint. For IP sockets, the address\n\
1295info is a pair (hostaddr, port).";
1296
Guido van Rossumb6775db1994-08-01 11:34:53 +00001297#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001298
1299
Guido van Rossum30a685f1991-06-27 15:51:29 +00001300/* s.listen(n) method */
1301
Guido van Rossum73624e91994-10-10 17:59:00 +00001302static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001303PySocketSock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001304{
1305 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001306 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001307
1308 backlog = PyInt_AsLong(arg);
1309 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001310 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001311 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001312 if (backlog < 1)
1313 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001314 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001315 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001316 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001317 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001318 Py_INCREF(Py_None);
1319 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001320}
1321
Guido van Rossum82a5c661998-07-07 20:45:43 +00001322static char listen_doc[] =
1323"listen(backlog)\n\
1324\n\
1325Enable a server to accept connections. The backlog argument must be at\n\
1326least 1; it specifies the number of unaccepted connection that the system\n\
1327will allow before refusing new connections.";
1328
1329
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001330#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001331/* s.makefile(mode) method.
1332 Create a new open file object referring to a dupped version of
1333 the socket's file descriptor. (The dup() call is necessary so
1334 that the open file and socket objects may be closed independent
1335 of each other.)
1336 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1337
Guido van Rossum73624e91994-10-10 17:59:00 +00001338static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001339PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001340{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001341 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001342 char *mode = "r";
1343 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001344#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001345 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001346#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001347 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001348#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001349 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001350 PyObject *f;
1351
Guido van Rossum43713e52000-02-29 13:59:29 +00001352 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001353 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001354#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001355 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1356 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001357#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001358 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001359#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001360 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001361 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001362 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001363 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001364 }
1365 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1366 if (f != NULL)
1367 PyFile_SetBufSize(f, bufsize);
1368 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001369}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001370
1371static char makefile_doc[] =
1372"makefile([mode[, buffersize]]) -> file object\n\
1373\n\
1374Return a regular file object corresponding to the socket.\n\
1375The mode and buffersize arguments are as for the built-in open() function.";
1376
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001377#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001378
Guido van Rossum48a680c2001-03-02 06:34:14 +00001379
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001380/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001381
Guido van Rossum73624e91994-10-10 17:59:00 +00001382static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001383PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001384{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001385 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001386 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001387 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001388 return NULL;
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001389 if (len < 0) {
1390 PyErr_SetString(PyExc_ValueError,
1391 "negative buffersize in connect");
1392 return NULL;
1393 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001394 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001395 if (buf == NULL)
1396 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001397 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001398 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001399 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001400 if (n < 0) {
1401 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001402 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001403 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001404 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001405 return NULL;
1406 return buf;
1407}
1408
Guido van Rossum82a5c661998-07-07 20:45:43 +00001409static char recv_doc[] =
1410"recv(buffersize[, flags]) -> data\n\
1411\n\
1412Receive up to buffersize bytes from the socket. For the optional flags\n\
1413argument, see the Unix manual. When no data is available, block until\n\
1414at least one byte is available or until the remote end is closed. When\n\
1415the remote end is closed and all data is read, return the empty string.";
1416
Guido van Rossum30a685f1991-06-27 15:51:29 +00001417
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001418/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001419
Guido van Rossum73624e91994-10-10 17:59:00 +00001420static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001421PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001422{
1423 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001424 PyObject *buf = NULL;
1425 PyObject *addr = NULL;
1426 PyObject *ret = NULL;
1427
Guido van Rossumff3ab422000-04-24 15:16:03 +00001428 int len, n, flags = 0;
1429 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001430 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001431 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001432 if (!getsockaddrlen(s, &addrlen))
1433 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001434 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001435 if (buf == NULL)
1436 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001437 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001438 memset(addrbuf, 0, addrlen);
1439 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001440#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001441#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001442 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001443#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001444 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001445#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001446#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001447 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001448#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001449 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001450 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001451 if (n < 0) {
1452 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001453 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001454 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001455 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001456 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001457
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001458 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001459 goto finally;
1460
Guido van Rossum73624e91994-10-10 17:59:00 +00001461 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001462 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001463 Py_XDECREF(addr);
1464 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001465 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001466}
1467
Guido van Rossum82a5c661998-07-07 20:45:43 +00001468static char recvfrom_doc[] =
1469"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1470\n\
1471Like recv(buffersize, flags) but also return the sender's address info.";
1472
Guido van Rossum30a685f1991-06-27 15:51:29 +00001473
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001474/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001475
Guido van Rossum73624e91994-10-10 17:59:00 +00001476static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001477PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001478{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001479 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001480 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001481 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001482 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001483 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001484 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001485 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001486 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001487 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001488 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001489}
1490
Guido van Rossum82a5c661998-07-07 20:45:43 +00001491static char send_doc[] =
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001492"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001493\n\
1494Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001495argument, see the Unix manual. Return the number of bytes\n\
1496sent; this may be less than len(data) if the network is busy.";
1497
1498
1499/* s.sendall(data [,flags]) method */
1500
1501static PyObject *
1502PySocketSock_sendall(PySocketSockObject *s, PyObject *args)
1503{
1504 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001505 int len, n, flags = 0;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001506 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1507 return NULL;
1508 Py_BEGIN_ALLOW_THREADS
1509 do {
1510 n = send(s->sock_fd, buf, len, flags);
1511 if (n < 0)
1512 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001513 buf += n;
1514 len -= n;
1515 } while (len > 0);
1516 Py_END_ALLOW_THREADS
1517 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001518 return s->errorhandler();
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001519 Py_INCREF(Py_None);
1520 return Py_None;
1521}
1522
1523static char sendall_doc[] =
1524"sendall(data[, flags])\n\
1525\n\
1526Send a data string to the socket. For the optional flags\n\
1527argument, see the Unix manual. This calls send() repeatedly\n\
1528until all data is sent. If an error occurs, it's impossible\n\
1529to tell how much data has been sent.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001530
Guido van Rossum30a685f1991-06-27 15:51:29 +00001531
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001532/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001533
Guido van Rossum73624e91994-10-10 17:59:00 +00001534static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001535PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001536{
Guido van Rossum73624e91994-10-10 17:59:00 +00001537 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001538 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001539 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001540 int addrlen, len, n, flags;
1541 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001542 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001543 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001544 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1545 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001546 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001547 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001548 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001549 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001550 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001551 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001552 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001553 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001554 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001555 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001556}
1557
Guido van Rossum82a5c661998-07-07 20:45:43 +00001558static char sendto_doc[] =
1559"sendto(data[, flags], address)\n\
1560\n\
1561Like send(data, flags) but allows specifying the destination address.\n\
1562For IP sockets, the address is a pair (hostaddr, port).";
1563
Guido van Rossum30a685f1991-06-27 15:51:29 +00001564
1565/* s.shutdown(how) method */
1566
Guido van Rossum73624e91994-10-10 17:59:00 +00001567static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001568PySocketSock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001569{
1570 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001571 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001572
1573 how = PyInt_AsLong(arg);
1574 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001575 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001576 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001577 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001578 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001579 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001580 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001581 Py_INCREF(Py_None);
1582 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001583}
1584
Guido van Rossum82a5c661998-07-07 20:45:43 +00001585static char shutdown_doc[] =
1586"shutdown(flag)\n\
1587\n\
1588Shut down the reading side of the socket (flag == 0), the writing side\n\
1589of the socket (flag == 1), or both ends (flag == 2).";
1590
Guido van Rossum30a685f1991-06-27 15:51:29 +00001591
1592/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001593
Guido van Rossum73624e91994-10-10 17:59:00 +00001594static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum17209fc2001-10-15 21:12:54 +00001595 {"accept", (PyCFunction)PySocketSock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001596 accept_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001597 {"bind", (PyCFunction)PySocketSock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001598 bind_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00001599 {"close", (PyCFunction)PySocketSock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001600 close_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001601 {"connect", (PyCFunction)PySocketSock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001602 connect_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001603 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001604 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001605#ifndef NO_DUP
Guido van Rossum17209fc2001-10-15 21:12:54 +00001606 {"dup", (PyCFunction)PySocketSock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001607 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001608#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001609 {"fileno", (PyCFunction)PySocketSock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001610 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001611#ifdef HAVE_GETPEERNAME
Guido van Rossum17209fc2001-10-15 21:12:54 +00001612 {"getpeername", (PyCFunction)PySocketSock_getpeername,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001613 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001614#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001615 {"getsockname", (PyCFunction)PySocketSock_getsockname,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001616 METH_NOARGS, getsockname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001617 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1618 getsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001619 {"listen", (PyCFunction)PySocketSock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001620 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001621#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001622 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1623 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001624#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001625 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1626 recv_doc},
1627 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1628 recvfrom_doc},
1629 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1630 send_doc},
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001631 {"sendall", (PyCFunction)PySocketSock_sendall, METH_VARARGS,
1632 sendall_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001633 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1634 sendto_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001635 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001636 setblocking_doc},
1637 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1638 setsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001639 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001640 shutdown_doc},
1641#ifdef RISCOS
1642 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1643 sleeptaskw_doc},
1644#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001645 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001646};
1647
Guido van Rossum30a685f1991-06-27 15:51:29 +00001648
Guido van Rossum73624e91994-10-10 17:59:00 +00001649/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001650 First close the file description. */
1651
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001652static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001653PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001654{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001655 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001656 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001657 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001658}
1659
Guido van Rossum30a685f1991-06-27 15:51:29 +00001660
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001661static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001662PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001663{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001664 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001665#if SIZEOF_SOCKET_T > SIZEOF_LONG
1666 if (s->sock_fd > LONG_MAX) {
1667 /* this can occur on Win64, and actually there is a special
1668 ugly printf formatter for decimal pointer length integer
1669 printing, only bother if necessary*/
1670 PyErr_SetString(PyExc_OverflowError,
1671 "no printf formatter to display the socket descriptor in decimal");
1672 return NULL;
1673 }
1674#endif
Tim Peters885d4572001-11-28 20:27:42 +00001675 PyOS_snprintf(buf, sizeof(buf),
1676 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1677 (long)s->sock_fd, s->sock_family,
1678 s->sock_type,
1679 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001680 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001681}
1682
1683
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001684/* Create a new, uninitialized socket object. */
1685
1686static PyObject *
1687PySocketSock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1688{
1689 PyObject *new;
1690
1691 new = type->tp_alloc(type, 0);
1692 if (new != NULL)
1693 ((PySocketSockObject *)new)->sock_fd = -1;
1694 return new;
1695}
1696
1697
1698/* Initialize a new socket object. */
1699
1700/*ARGSUSED*/
1701static int
1702PySocketSock_init(PyObject *self, PyObject *args, PyObject *kwds)
1703{
1704 PySocketSockObject *s = (PySocketSockObject *)self;
1705 SOCKET_T fd;
1706 int family = AF_INET, type = SOCK_STREAM, proto = 0;
1707 static char *keywords[] = {"family", "type", "proto", 0};
1708
1709 if (!PyArg_ParseTupleAndKeywords(args, kwds,
1710 "|iii:socket", keywords,
1711 &family, &type, &proto))
1712 return -1;
1713 Py_BEGIN_ALLOW_THREADS
1714 fd = socket(family, type, proto);
1715 Py_END_ALLOW_THREADS
1716#ifdef MS_WINDOWS
1717 if (fd == INVALID_SOCKET)
1718#else
1719 if (fd < 0)
1720#endif
1721 {
1722 PySocket_Err();
1723 return -1;
1724 }
1725 init_sockobject(s, fd, family, type, proto);
1726 /* From now on, ignore SIGPIPE and let the error checking
1727 do the work. */
1728#ifdef SIGPIPE
1729 (void) signal(SIGPIPE, SIG_IGN);
1730#endif
1731 return 0;
1732}
1733
1734
Guido van Rossumb6775db1994-08-01 11:34:53 +00001735/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001736
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001737static char socket_doc[] =
1738"socket([family[, type[, proto]]]) -> socket object\n\
1739\n\
1740Open a socket of the given type. The family argument specifies the\n\
1741address family; it defaults to AF_INET. The type argument specifies\n\
1742whether this is a stream (SOCK_STREAM, this is the default)\n\
1743or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1744specifying the default protocol.\n\
1745\n\
1746A socket represents one endpoint of a network connection.\n\
1747\n\
1748Methods:\n\
1749\n\
1750accept() -- accept a connection, returning new socket and client address\n\
1751bind() -- bind the socket to a local address\n\
1752close() -- close the socket\n\
1753connect() -- connect the socket to a remote address\n\
1754connect_ex() -- connect, return an error code instead of an exception \n\
1755dup() -- return a new socket object identical to the current one (*)\n\
1756fileno() -- return underlying file descriptor\n\
1757getpeername() -- return remote address (*)\n\
1758getsockname() -- return local address\n\
1759getsockopt() -- get socket options\n\
1760listen() -- start listening for incoming connections\n\
Andrew M. Kuchling3072ecd2001-11-28 04:28:31 +00001761makefile() -- return a file object corresponding to the socket (*)\n\
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001762recv() -- receive data\n\
1763recvfrom() -- receive data and sender's address\n\
1764send() -- send data, may not send all of it\n\
1765sendall() -- send all data\n\
1766sendto() -- send data to a given address\n\
1767setblocking() -- set or clear the blocking I/O flag\n\
1768setsockopt() -- set socket options\n\
1769shutdown() -- shut down traffic in one or both directions\n\
1770\n\
1771(*) not available on all platforms!)";
1772
Guido van Rossum73624e91994-10-10 17:59:00 +00001773static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001774 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001775 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00001776 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001777 sizeof(PySocketSockObject), /* tp_basicsize */
1778 0, /* tp_itemsize */
1779 (destructor)PySocketSock_dealloc, /* tp_dealloc */
1780 0, /* tp_print */
1781 0, /* tp_getattr */
1782 0, /* tp_setattr */
1783 0, /* tp_compare */
1784 (reprfunc)PySocketSock_repr, /* tp_repr */
1785 0, /* tp_as_number */
1786 0, /* tp_as_sequence */
1787 0, /* tp_as_mapping */
1788 0, /* tp_hash */
1789 0, /* tp_call */
1790 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001791 0, /* set below */ /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001792 0, /* tp_setattro */
1793 0, /* tp_as_buffer */
1794 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1795 socket_doc, /* tp_doc */
1796 0, /* tp_traverse */
1797 0, /* tp_clear */
1798 0, /* tp_richcompare */
1799 0, /* tp_weaklistoffset */
1800 0, /* tp_iter */
1801 0, /* tp_iternext */
1802 PySocketSock_methods, /* tp_methods */
1803 0, /* tp_members */
1804 0, /* tp_getset */
1805 0, /* tp_base */
1806 0, /* tp_dict */
1807 0, /* tp_descr_get */
1808 0, /* tp_descr_set */
1809 0, /* tp_dictoffset */
1810 PySocketSock_init, /* tp_init */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001811 0, /* set below */ /* tp_alloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001812 PySocketSock_new, /* tp_new */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001813 0, /* set below */ /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001814};
1815
Guido van Rossum30a685f1991-06-27 15:51:29 +00001816
Guido van Rossum81194471991-07-27 21:42:02 +00001817/* Python interface to gethostname(). */
1818
1819/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001820static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001821PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001822{
1823 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001824 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001825 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001826 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001827 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001828 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001829 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001830 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001831 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001832 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001833 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001834}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001835
Guido van Rossum82a5c661998-07-07 20:45:43 +00001836static char gethostname_doc[] =
1837"gethostname() -> string\n\
1838\n\
1839Return the current host name.";
1840
Guido van Rossumff4949e1992-08-05 19:58:53 +00001841
Guido van Rossum30a685f1991-06-27 15:51:29 +00001842/* Python interface to gethostbyname(name). */
1843
1844/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001845static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001846PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001847{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001848 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001849 struct sockaddr_storage addrbuf;
1850
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001851 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001852 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001853 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001854 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001855 return makeipaddr((struct sockaddr *)&addrbuf,
1856 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001857}
1858
Guido van Rossum82a5c661998-07-07 20:45:43 +00001859static char gethostbyname_doc[] =
1860"gethostbyname(host) -> address\n\
1861\n\
1862Return the IP address (a string of the form '255.255.255.255') for a host.";
1863
1864
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001865/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1866
1867static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001868gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001869{
1870 char **pch;
1871 PyObject *rtn_tuple = (PyObject *)NULL;
1872 PyObject *name_list = (PyObject *)NULL;
1873 PyObject *addr_list = (PyObject *)NULL;
1874 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001875
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001876 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001877 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001878#ifndef RISCOS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001879 PyH_Err(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001880#else
1881 PyErr_SetString(PySocket_Error, "host not found");
1882#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001883 return NULL;
1884 }
1885 if (h->h_addrtype != af) {
1886#ifdef HAVE_STRERROR
1887 /* Let's get real error message to return */
1888 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001889#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001890 PyErr_SetString(PySocket_Error,
1891 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001892#endif
1893 return NULL;
1894 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001895 switch (af) {
1896 case AF_INET:
1897 if (alen < sizeof(struct sockaddr_in))
1898 return NULL;
1899 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001900#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001901 case AF_INET6:
1902 if (alen < sizeof(struct sockaddr_in6))
1903 return NULL;
1904 break;
1905#endif
1906 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001907 if ((name_list = PyList_New(0)) == NULL)
1908 goto err;
1909 if ((addr_list = PyList_New(0)) == NULL)
1910 goto err;
1911 for (pch = h->h_aliases; *pch != NULL; pch++) {
1912 int status;
1913 tmp = PyString_FromString(*pch);
1914 if (tmp == NULL)
1915 goto err;
1916 status = PyList_Append(name_list, tmp);
1917 Py_DECREF(tmp);
1918 if (status)
1919 goto err;
1920 }
1921 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1922 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001923 switch (af) {
1924 case AF_INET:
1925 {
1926 struct sockaddr_in sin;
1927 memset(&sin, 0, sizeof(sin));
1928 sin.sin_family = af;
1929#ifdef HAVE_SOCKADDR_SA_LEN
1930 sin.sin_len = sizeof(sin);
1931#endif
1932 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
1933 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
1934 if (pch == h->h_addr_list && alen >= sizeof(sin))
1935 memcpy((char *) addr, &sin, sizeof(sin));
1936 break;
1937 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001938#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001939 case AF_INET6:
1940 {
1941 struct sockaddr_in6 sin6;
1942 memset(&sin6, 0, sizeof(sin6));
1943 sin6.sin6_family = af;
1944#ifdef HAVE_SOCKADDR_SA_LEN
1945 sin6.sin6_len = sizeof(sin6);
1946#endif
1947 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
1948 tmp = makeipaddr((struct sockaddr *)&sin6,
1949 sizeof(sin6));
1950 if (pch == h->h_addr_list && alen >= sizeof(sin6))
1951 memcpy((char *) addr, &sin6, sizeof(sin6));
1952 break;
1953 }
1954#endif
1955 default: /* can't happen */
1956 PyErr_SetString(PySocket_Error,
1957 "unsupported address family");
1958 return NULL;
1959 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001960 if (tmp == NULL)
1961 goto err;
1962 status = PyList_Append(addr_list, tmp);
1963 Py_DECREF(tmp);
1964 if (status)
1965 goto err;
1966 }
1967 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1968 err:
1969 Py_XDECREF(name_list);
1970 Py_XDECREF(addr_list);
1971 return rtn_tuple;
1972}
1973
1974
1975/* Python interface to gethostbyname_ex(name). */
1976
1977/*ARGSUSED*/
1978static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001979PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001980{
1981 char *name;
1982 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001983 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001984 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00001985 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001986#ifdef HAVE_GETHOSTBYNAME_R
1987 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001988#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1989 struct hostent_data data;
1990#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001991 char buf[16384];
1992 int buf_len = (sizeof buf) - 1;
1993 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001994#endif
1995#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001996 int result;
1997#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001998#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001999
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002000 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002001 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002002 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002003 return NULL;
2004 Py_BEGIN_ALLOW_THREADS
2005#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002006#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002007 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002008#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002009 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002010#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002011 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002012 result = gethostbyname_r(name, &hp_allocated, &data);
2013 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002014#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002015#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002016#ifdef USE_GETHOSTBYNAME_LOCK
2017 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002018#endif
2019 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002020#endif /* HAVE_GETHOSTBYNAME_R */
2021 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002022 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
2023 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
2024 sa = (struct sockaddr*)&addr;
2025 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002026#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002027 PyThread_release_lock(gethostbyname_lock);
2028#endif
2029 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002030}
2031
2032static char ghbn_ex_doc[] =
2033"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2034\n\
2035Return the true host name, a list of aliases, and a list of IP addresses,\n\
2036for a host. The host argument is a string giving a host name or IP number.";
2037
2038
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002039/* Python interface to gethostbyaddr(IP). */
2040
2041/*ARGSUSED*/
2042static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002043PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002044{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002045#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002046 struct sockaddr_storage addr;
2047#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002048 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002049#endif
2050 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002051 char *ip_num;
2052 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002053 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002054#ifdef HAVE_GETHOSTBYNAME_R
2055 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002056#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2057 struct hostent_data data;
2058#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002059 char buf[16384];
2060 int buf_len = (sizeof buf) - 1;
2061 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002062#endif
2063#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002064 int result;
2065#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002066#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002067 char *ap;
2068 int al;
2069 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002070
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002071 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002072 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002073 af = PF_UNSPEC;
2074 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002075 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002076 af = sa->sa_family;
2077 ap = NULL;
2078 al = 0;
2079 switch (af) {
2080 case AF_INET:
2081 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2082 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2083 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002084#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002085 case AF_INET6:
2086 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2087 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2088 break;
2089#endif
2090 default:
2091 PyErr_SetString(PySocket_Error, "unsupported address family");
2092 return NULL;
2093 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002094 Py_BEGIN_ALLOW_THREADS
2095#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002096#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002097 result = gethostbyaddr_r(ap, al, af,
2098 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002099 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002100#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002101 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002102 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002103#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002104 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002105 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002106 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002107#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002108#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002109#ifdef USE_GETHOSTBYNAME_LOCK
2110 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002111#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002112 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002113#endif /* HAVE_GETHOSTBYNAME_R */
2114 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002115 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002116#ifdef USE_GETHOSTBYNAME_LOCK
2117 PyThread_release_lock(gethostbyname_lock);
2118#endif
2119 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002120}
2121
Guido van Rossum82a5c661998-07-07 20:45:43 +00002122static char gethostbyaddr_doc[] =
2123"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2124\n\
2125Return the true host name, a list of aliases, and a list of IP addresses,\n\
2126for a host. The host argument is a string giving a host name or IP number.";
2127
Guido van Rossum30a685f1991-06-27 15:51:29 +00002128
2129/* Python interface to getservbyname(name).
2130 This only returns the port number, since the other info is already
2131 known or not useful (like the list of aliases). */
2132
2133/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002134static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002135PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002136{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002137 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002138 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002139 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002140 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002141 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002142 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002143 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002144 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002145 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002146 return NULL;
2147 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002148 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002149}
2150
Guido van Rossum82a5c661998-07-07 20:45:43 +00002151static char getservbyname_doc[] =
2152"getservbyname(servicename, protocolname) -> integer\n\
2153\n\
2154Return a port number from a service name and protocol name.\n\
2155The protocol name should be 'tcp' or 'udp'.";
2156
Guido van Rossum30a685f1991-06-27 15:51:29 +00002157
Guido van Rossum3901d851996-12-19 16:35:04 +00002158/* Python interface to getprotobyname(name).
2159 This only returns the protocol number, since the other info is
2160 already known or not useful (like the list of aliases). */
2161
2162/*ARGSUSED*/
2163static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002164PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002165{
2166 char *name;
2167 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002168#ifdef __BEOS__
2169/* Not available in BeOS yet. - [cjh] */
2170 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2171 return NULL;
2172#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002173 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002174 return NULL;
2175 Py_BEGIN_ALLOW_THREADS
2176 sp = getprotobyname(name);
2177 Py_END_ALLOW_THREADS
2178 if (sp == NULL) {
2179 PyErr_SetString(PySocket_Error, "protocol not found");
2180 return NULL;
2181 }
2182 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002183#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002184}
2185
Guido van Rossum82a5c661998-07-07 20:45:43 +00002186static char getprotobyname_doc[] =
2187"getprotobyname(name) -> integer\n\
2188\n\
2189Return the protocol number for the named protocol. (Rarely used.)";
2190
Guido van Rossum3901d851996-12-19 16:35:04 +00002191
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002192#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002193/* Create a socket object from a numeric file description.
2194 Useful e.g. if stdin is a socket.
2195 Additional arguments as for socket(). */
2196
2197/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002198static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002199PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002200{
Guido van Rossum73624e91994-10-10 17:59:00 +00002201 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002202 SOCKET_T fd;
2203 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002204 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2205 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002206 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002207 /* Dup the fd so it and the socket can be closed independently */
2208 fd = dup(fd);
2209 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002210 return PySocket_Err();
2211 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002212 /* From now on, ignore SIGPIPE and let the error checking
2213 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002214#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002215 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002216#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002217 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002218}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002219
2220static char fromfd_doc[] =
2221"fromfd(fd, family, type[, proto]) -> socket object\n\
2222\n\
2223Create a socket object from the given file descriptor.\n\
2224The remaining arguments are the same as for socket().";
2225
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002226#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002227
Guido van Rossum82a5c661998-07-07 20:45:43 +00002228
Guido van Rossum006bf911996-06-12 04:04:55 +00002229static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002230PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002231{
2232 int x1, x2;
2233
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002234 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002235 return NULL;
2236 }
2237 x2 = (int)ntohs((short)x1);
2238 return PyInt_FromLong(x2);
2239}
2240
Guido van Rossum82a5c661998-07-07 20:45:43 +00002241static char ntohs_doc[] =
2242"ntohs(integer) -> integer\n\
2243\n\
2244Convert a 16-bit integer from network to host byte order.";
2245
2246
Guido van Rossum006bf911996-06-12 04:04:55 +00002247static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002248PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002249{
2250 int x1, x2;
2251
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002252 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002253 return NULL;
2254 }
2255 x2 = ntohl(x1);
2256 return PyInt_FromLong(x2);
2257}
2258
Guido van Rossum82a5c661998-07-07 20:45:43 +00002259static char ntohl_doc[] =
2260"ntohl(integer) -> integer\n\
2261\n\
2262Convert a 32-bit integer from network to host byte order.";
2263
2264
Guido van Rossum006bf911996-06-12 04:04:55 +00002265static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002266PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002267{
2268 int x1, x2;
2269
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002270 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002271 return NULL;
2272 }
2273 x2 = (int)htons((short)x1);
2274 return PyInt_FromLong(x2);
2275}
2276
Guido van Rossum82a5c661998-07-07 20:45:43 +00002277static char htons_doc[] =
2278"htons(integer) -> integer\n\
2279\n\
2280Convert a 16-bit integer from host to network byte order.";
2281
2282
Guido van Rossum006bf911996-06-12 04:04:55 +00002283static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002284PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002285{
2286 int x1, x2;
2287
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002288 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002289 return NULL;
2290 }
2291 x2 = htonl(x1);
2292 return PyInt_FromLong(x2);
2293}
2294
Guido van Rossum82a5c661998-07-07 20:45:43 +00002295static char htonl_doc[] =
2296"htonl(integer) -> integer\n\
2297\n\
2298Convert a 32-bit integer from host to network byte order.";
2299
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002300/*
2301 * socket.inet_aton() and socket.inet_ntoa() functions
2302 *
2303 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2304 *
2305 */
2306
Guido van Rossum48a680c2001-03-02 06:34:14 +00002307static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002308"inet_aton(string) -> packed 32-bit IP representation\n\
2309\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002310Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002311binary format used in low-level network functions.";
2312
2313static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002314PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002315{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002316#ifndef INADDR_NONE
2317#define INADDR_NONE (-1)
2318#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002319
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002320 /* Have to use inet_addr() instead */
2321 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002322 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002323
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002324 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002325 return NULL;
2326 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002327#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002328 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002329#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002330 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002331#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002332
2333 if (packed_addr == INADDR_NONE) { /* invalid address */
2334 PyErr_SetString(PySocket_Error,
2335 "illegal IP address string passed to inet_aton");
2336 return NULL;
2337 }
2338
2339 return PyString_FromStringAndSize((char *) &packed_addr,
2340 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002341}
2342
Guido van Rossum48a680c2001-03-02 06:34:14 +00002343static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002344"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002345\n\
2346Convert an IP address from 32-bit packed binary format to string format";
2347
2348static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002349PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002350{
2351 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002352 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002353 struct in_addr packed_addr;
2354
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002355 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002356 return NULL;
2357 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002358
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002359 if (addr_len != sizeof(packed_addr)) {
2360 PyErr_SetString(PySocket_Error,
2361 "packed IP wrong length for inet_ntoa");
2362 return NULL;
2363 }
2364
2365 memcpy(&packed_addr, packed_str, addr_len);
2366
2367 return PyString_FromString(inet_ntoa(packed_addr));
2368}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002369
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002370/* Python interface to getaddrinfo(host, port). */
2371
2372/*ARGSUSED*/
2373static PyObject *
2374PySocket_getaddrinfo(PyObject *self, PyObject *args)
2375{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002376 struct addrinfo hints, *res;
2377 struct addrinfo *res0 = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002378 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002379 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002380 char *hptr, *pptr;
2381 int family, socktype, protocol, flags;
2382 int error;
2383 PyObject *all = (PyObject *)NULL;
2384 PyObject *single = (PyObject *)NULL;
2385
2386 family = socktype = protocol = flags = 0;
2387 family = PF_UNSPEC;
2388 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2389 &hptr, &pobj, &family, &socktype,
2390 &protocol, &flags)) {
2391 return NULL;
2392 }
2393 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002394 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002395 pptr = pbuf;
2396 } else if (PyString_Check(pobj)) {
2397 pptr = PyString_AsString(pobj);
2398 } else if (pobj == Py_None) {
2399 pptr = (char *)NULL;
2400 } else {
2401 PyErr_SetString(PySocket_Error, "Int or String expected");
2402 return NULL;
2403 }
2404 memset(&hints, 0, sizeof(hints));
2405 hints.ai_family = family;
2406 hints.ai_socktype = socktype;
2407 hints.ai_protocol = protocol;
2408 hints.ai_flags = flags;
2409 error = getaddrinfo(hptr, pptr, &hints, &res0);
2410 if (error) {
2411 PyGAI_Err(error);
2412 return NULL;
2413 }
2414
2415 if ((all = PyList_New(0)) == NULL)
2416 goto err;
2417 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002418 PyObject *addr =
2419 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2420 if (addr == NULL)
2421 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002422 single = Py_BuildValue("iiisO", res->ai_family,
2423 res->ai_socktype, res->ai_protocol,
2424 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002425 addr);
2426 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002427 if (single == NULL)
2428 goto err;
2429
2430 if (PyList_Append(all, single))
2431 goto err;
2432 Py_XDECREF(single);
2433 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002434 return all;
2435 err:
2436 Py_XDECREF(single);
2437 Py_XDECREF(all);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002438 if (res0)
2439 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002440 return (PyObject *)NULL;
2441}
2442
2443static char getaddrinfo_doc[] =
2444"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2445 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2446\n\
2447Resolve host and port into addrinfo struct.";
2448
2449/* Python interface to getnameinfo(sa, flags). */
2450
2451/*ARGSUSED*/
2452static PyObject *
2453PySocket_getnameinfo(PyObject *self, PyObject *args)
2454{
2455 PyObject *sa = (PyObject *)NULL;
2456 int flags;
2457 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002458 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002459 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2460 struct addrinfo hints, *res = NULL;
2461 int error;
2462 PyObject *ret = (PyObject *)NULL;
2463
2464 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002465 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002466 return NULL;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002467 if (!PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, &scope_id))
2468 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002469 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002470 memset(&hints, 0, sizeof(hints));
2471 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002472 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002473 error = getaddrinfo(hostp, pbuf, &hints, &res);
2474 if (error) {
2475 PyGAI_Err(error);
2476 goto fail;
2477 }
2478 if (res->ai_next) {
2479 PyErr_SetString(PySocket_Error,
2480 "sockaddr resolved to multiple addresses");
2481 goto fail;
2482 }
2483 switch (res->ai_family) {
2484 case AF_INET:
2485 {
2486 char *t1;
2487 int t2;
2488 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2489 PyErr_SetString(PySocket_Error,
2490 "IPv4 sockaddr must be 2 tuple");
2491 goto fail;
2492 }
2493 break;
2494 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002495#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002496 case AF_INET6:
2497 {
2498 struct sockaddr_in6 *sin6;
2499 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2500 sin6->sin6_flowinfo = flowinfo;
2501 sin6->sin6_scope_id = scope_id;
2502 break;
2503 }
2504#endif
2505 }
2506 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2507 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2508 if (error) {
2509 PyGAI_Err(error);
2510 goto fail;
2511 }
2512 ret = Py_BuildValue("ss", hbuf, pbuf);
2513
2514fail:
2515 if (res)
2516 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002517 return ret;
2518}
2519
2520static char getnameinfo_doc[] =
2521"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2522\n\
2523Get host and port for a sockaddr.";
2524
Guido van Rossum30a685f1991-06-27 15:51:29 +00002525/* List of functions exported by this module. */
2526
Guido van Rossum73624e91994-10-10 17:59:00 +00002527static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002528 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002529 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002530 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002531 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002532 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002533 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002534 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002535 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002536 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002537 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002538 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002539 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002540#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002541 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002542 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002543#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002544 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002545 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002546 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002547 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002548 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002549 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002550 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002551 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002552 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002553 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002554 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002555 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002556 {"getaddrinfo", PySocket_getaddrinfo,
2557 METH_VARARGS, getaddrinfo_doc},
2558 {"getnameinfo", PySocket_getnameinfo,
2559 METH_VARARGS, getnameinfo_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00002560 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002561};
2562
Guido van Rossum30a685f1991-06-27 15:51:29 +00002563
2564/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002565 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002566 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002567 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002568static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002569insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002570{
Guido van Rossum73624e91994-10-10 17:59:00 +00002571 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002572 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002573 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002574
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002575 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002576}
2577
Guido van Rossum30a685f1991-06-27 15:51:29 +00002578
Guido van Rossum8d665e61996-06-26 18:22:49 +00002579#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002580
2581/* Additional initialization and cleanup for NT/Windows */
2582
2583static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002584NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002585{
2586 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002587}
2588
2589static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002590NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002591{
2592 WSADATA WSAData;
2593 int ret;
2594 char buf[100];
2595 ret = WSAStartup(0x0101, &WSAData);
2596 switch (ret) {
2597 case 0: /* no error */
2598 atexit(NTcleanup);
2599 return 1;
2600 case WSASYSNOTREADY:
2601 PyErr_SetString(PyExc_ImportError,
2602 "WSAStartup failed: network not ready");
2603 break;
2604 case WSAVERNOTSUPPORTED:
2605 case WSAEINVAL:
2606 PyErr_SetString(PyExc_ImportError,
2607 "WSAStartup failed: requested version not supported");
2608 break;
2609 default:
Tim Peters885d4572001-11-28 20:27:42 +00002610 PyOS_snprintf(buf, sizeof(buf),
2611 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002612 PyErr_SetString(PyExc_ImportError, buf);
2613 break;
2614 }
2615 return 0;
2616}
2617
Guido van Rossum8d665e61996-06-26 18:22:49 +00002618#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002619
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002620#if defined(PYOS_OS2)
2621
2622/* Additional initialization and cleanup for OS/2 */
2623
2624static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002625OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002626{
2627 /* No cleanup is necessary for OS/2 Sockets */
2628}
2629
2630static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002631OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002632{
2633 char reason[64];
2634 int rc = sock_init();
2635
2636 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002637 atexit(OS2cleanup);
2638 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002639 }
2640
Tim Peters75cdad52001-11-28 22:07:30 +00002641 PyOS_snprintf(reason, sizeof(reason),
2642 "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002643 PyErr_SetString(PyExc_ImportError, reason);
2644
Guido van Rossum32c575d1997-12-02 20:37:32 +00002645 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002646}
2647
2648#endif /* PYOS_OS2 */
2649
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002650/* C API table - always add new things to the end for binary
2651 compatibility. */
2652static
2653PySocketModule_APIObject PySocketModuleAPI =
2654{
2655 &PySocketSock_Type,
2656};
2657
Guido van Rossum30a685f1991-06-27 15:51:29 +00002658/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002659 * This is called when the first 'import socket' is done,
2660 * via a table in config.c, if config.c is compiled with USE_SOCKET
2661 * defined.
2662 *
2663 * For MS_WINDOWS (which means any Windows variant), this module
2664 * is actually called "_socket", and there's a wrapper "socket.py"
2665 * which implements some missing functionality (such as makefile(),
2666 * dup() and fromfd()). The import of "_socket" may fail with an
2667 * ImportError exception if initialization of WINSOCK fails. When
2668 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2669 * scheduled to be made at exit time.
2670 *
2671 * For OS/2, this module is also called "_socket" and uses a wrapper
2672 * "socket.py" which implements that functionality that is missing
2673 * when PC operating systems don't put socket descriptors in the
2674 * operating system's filesystem layer.
2675 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002676
Guido van Rossum82a5c661998-07-07 20:45:43 +00002677static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002678"Implementation module for socket operations. See the socket module\n\
2679for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002680
Guido van Rossum3886bb61998-12-04 18:50:17 +00002681DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002682init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002683{
Guido van Rossum73624e91994-10-10 17:59:00 +00002684 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002685#ifdef RISCOS
2686 _kernel_swi_regs r;
2687 r.r[0]=0;
2688 _kernel_swi(0x43380, &r, &r);
2689 taskwindow = r.r[0];
2690#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002691#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002692 if (!NTinit())
2693 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002694#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002695#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002696 if (!OS2init())
2697 return;
Fred Drakea136d492000-08-16 14:18:30 +00002698#endif /* __TOS_OS2__ */
2699#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002700#endif /* RISCOS */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002701 PySocketSock_Type.ob_type = &PyType_Type;
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002702 PySocketSock_Type.tp_getattro = PyObject_GenericGetAttr;
2703 PySocketSock_Type.tp_alloc = PyType_GenericAlloc;
2704 PySocketSock_Type.tp_free = _PyObject_Del;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002705 m = Py_InitModule3(PySocket_MODULE_NAME,
2706 PySocket_methods,
2707 module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00002708 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002709 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2710 if (PySocket_Error == NULL)
2711 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002712 PyDict_SetItemString(d, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002713 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
2714 if (PyH_Error == NULL)
2715 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002716 PyDict_SetItemString(d, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002717 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
2718 NULL);
2719 if (PyGAI_Error == NULL)
2720 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002721 PyDict_SetItemString(d, "gaierror", PyGAI_Error);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002722 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002723 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002724 return;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002725 if (PyDict_SetItemString(d, "socket",
2726 (PyObject *)&PySocketSock_Type) != 0)
2727 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002728
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002729 /* Export C API */
2730 if (PyDict_SetItemString(d, PySocket_CAPI_NAME,
2731 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
2732 ) != 0)
2733 return;
2734
Guido van Rossum09be4091999-08-09 14:40:40 +00002735 /* Address families (we only support AF_INET and AF_UNIX) */
2736#ifdef AF_UNSPEC
2737 insint(d, "AF_UNSPEC", AF_UNSPEC);
2738#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002739 insint(d, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002740#ifdef AF_INET6
2741 insint(d, "AF_INET6", AF_INET6);
2742#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002743#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002744 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002745#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002746#ifdef AF_AX25
2747 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2748#endif
2749#ifdef AF_IPX
2750 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2751#endif
2752#ifdef AF_APPLETALK
2753 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2754#endif
2755#ifdef AF_NETROM
2756 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2757#endif
2758#ifdef AF_BRIDGE
2759 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2760#endif
2761#ifdef AF_AAL5
2762 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2763#endif
2764#ifdef AF_X25
2765 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2766#endif
2767#ifdef AF_INET6
2768 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2769#endif
2770#ifdef AF_ROSE
2771 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2772#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002773#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00002774 insint(d, "AF_PACKET", AF_PACKET);
2775 insint(d, "PF_PACKET", PF_PACKET);
2776 insint(d, "PACKET_HOST", PACKET_HOST);
2777 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
2778 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
2779 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
2780 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
2781 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
2782 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002783#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002784
2785 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002786 insint(d, "SOCK_STREAM", SOCK_STREAM);
2787 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002788#ifndef __BEOS__
2789/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002790 insint(d, "SOCK_RAW", SOCK_RAW);
2791 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2792 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002793#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002794
2795#ifdef SO_DEBUG
2796 insint(d, "SO_DEBUG", SO_DEBUG);
2797#endif
2798#ifdef SO_ACCEPTCONN
2799 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2800#endif
2801#ifdef SO_REUSEADDR
2802 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2803#endif
2804#ifdef SO_KEEPALIVE
2805 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2806#endif
2807#ifdef SO_DONTROUTE
2808 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2809#endif
2810#ifdef SO_BROADCAST
2811 insint(d, "SO_BROADCAST", SO_BROADCAST);
2812#endif
2813#ifdef SO_USELOOPBACK
2814 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2815#endif
2816#ifdef SO_LINGER
2817 insint(d, "SO_LINGER", SO_LINGER);
2818#endif
2819#ifdef SO_OOBINLINE
2820 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2821#endif
2822#ifdef SO_REUSEPORT
2823 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2824#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002825#ifdef SO_SNDBUF
2826 insint(d, "SO_SNDBUF", SO_SNDBUF);
2827#endif
2828#ifdef SO_RCVBUF
2829 insint(d, "SO_RCVBUF", SO_RCVBUF);
2830#endif
2831#ifdef SO_SNDLOWAT
2832 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2833#endif
2834#ifdef SO_RCVLOWAT
2835 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2836#endif
2837#ifdef SO_SNDTIMEO
2838 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2839#endif
2840#ifdef SO_RCVTIMEO
2841 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2842#endif
2843#ifdef SO_ERROR
2844 insint(d, "SO_ERROR", SO_ERROR);
2845#endif
2846#ifdef SO_TYPE
2847 insint(d, "SO_TYPE", SO_TYPE);
2848#endif
2849
2850 /* Maximum number of connections for "listen" */
2851#ifdef SOMAXCONN
2852 insint(d, "SOMAXCONN", SOMAXCONN);
2853#else
2854 insint(d, "SOMAXCONN", 5); /* Common value */
2855#endif
2856
2857 /* Flags for send, recv */
2858#ifdef MSG_OOB
2859 insint(d, "MSG_OOB", MSG_OOB);
2860#endif
2861#ifdef MSG_PEEK
2862 insint(d, "MSG_PEEK", MSG_PEEK);
2863#endif
2864#ifdef MSG_DONTROUTE
2865 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2866#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002867#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00002868 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002869#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002870#ifdef MSG_EOR
2871 insint(d, "MSG_EOR", MSG_EOR);
2872#endif
2873#ifdef MSG_TRUNC
2874 insint(d, "MSG_TRUNC", MSG_TRUNC);
2875#endif
2876#ifdef MSG_CTRUNC
2877 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2878#endif
2879#ifdef MSG_WAITALL
2880 insint(d, "MSG_WAITALL", MSG_WAITALL);
2881#endif
2882#ifdef MSG_BTAG
2883 insint(d, "MSG_BTAG", MSG_BTAG);
2884#endif
2885#ifdef MSG_ETAG
2886 insint(d, "MSG_ETAG", MSG_ETAG);
2887#endif
2888
2889 /* Protocol level and numbers, usable for [gs]etsockopt */
2890#ifdef SOL_SOCKET
2891 insint(d, "SOL_SOCKET", SOL_SOCKET);
2892#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002893#ifdef SOL_IP
2894 insint(d, "SOL_IP", SOL_IP);
2895#else
2896 insint(d, "SOL_IP", 0);
2897#endif
2898#ifdef SOL_IPX
2899 insint(d, "SOL_IPX", SOL_IPX);
2900#endif
2901#ifdef SOL_AX25
2902 insint(d, "SOL_AX25", SOL_AX25);
2903#endif
2904#ifdef SOL_ATALK
2905 insint(d, "SOL_ATALK", SOL_ATALK);
2906#endif
2907#ifdef SOL_NETROM
2908 insint(d, "SOL_NETROM", SOL_NETROM);
2909#endif
2910#ifdef SOL_ROSE
2911 insint(d, "SOL_ROSE", SOL_ROSE);
2912#endif
2913#ifdef SOL_TCP
2914 insint(d, "SOL_TCP", SOL_TCP);
2915#else
2916 insint(d, "SOL_TCP", 6);
2917#endif
2918#ifdef SOL_UDP
2919 insint(d, "SOL_UDP", SOL_UDP);
2920#else
2921 insint(d, "SOL_UDP", 17);
2922#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002923#ifdef IPPROTO_IP
2924 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002925#else
2926 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002927#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002928#ifdef IPPROTO_HOPOPTS
2929 insint(d, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
2930#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002931#ifdef IPPROTO_ICMP
2932 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002933#else
2934 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002935#endif
2936#ifdef IPPROTO_IGMP
2937 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2938#endif
2939#ifdef IPPROTO_GGP
2940 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2941#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002942#ifdef IPPROTO_IPV4
2943 insint(d, "IPPROTO_IPV4", IPPROTO_IPV4);
2944#endif
2945#ifdef IPPROTO_IPIP
2946 insint(d, "IPPROTO_IPIP", IPPROTO_IPIP);
2947#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002948#ifdef IPPROTO_TCP
2949 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002950#else
2951 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002952#endif
2953#ifdef IPPROTO_EGP
2954 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2955#endif
2956#ifdef IPPROTO_PUP
2957 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2958#endif
2959#ifdef IPPROTO_UDP
2960 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002961#else
2962 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002963#endif
2964#ifdef IPPROTO_IDP
2965 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2966#endif
2967#ifdef IPPROTO_HELLO
2968 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2969#endif
2970#ifdef IPPROTO_ND
2971 insint(d, "IPPROTO_ND", IPPROTO_ND);
2972#endif
2973#ifdef IPPROTO_TP
2974 insint(d, "IPPROTO_TP", IPPROTO_TP);
2975#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002976#ifdef IPPROTO_IPV6
2977 insint(d, "IPPROTO_IPV6", IPPROTO_IPV6);
2978#endif
2979#ifdef IPPROTO_ROUTING
2980 insint(d, "IPPROTO_ROUTING", IPPROTO_ROUTING);
2981#endif
2982#ifdef IPPROTO_FRAGMENT
2983 insint(d, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
2984#endif
2985#ifdef IPPROTO_RSVP
2986 insint(d, "IPPROTO_RSVP", IPPROTO_RSVP);
2987#endif
2988#ifdef IPPROTO_GRE
2989 insint(d, "IPPROTO_GRE", IPPROTO_GRE);
2990#endif
2991#ifdef IPPROTO_ESP
2992 insint(d, "IPPROTO_ESP", IPPROTO_ESP);
2993#endif
2994#ifdef IPPROTO_AH
2995 insint(d, "IPPROTO_AH", IPPROTO_AH);
2996#endif
2997#ifdef IPPROTO_MOBILE
2998 insint(d, "IPPROTO_MOBILE", IPPROTO_MOBILE);
2999#endif
3000#ifdef IPPROTO_ICMPV6
3001 insint(d, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
3002#endif
3003#ifdef IPPROTO_NONE
3004 insint(d, "IPPROTO_NONE", IPPROTO_NONE);
3005#endif
3006#ifdef IPPROTO_DSTOPTS
3007 insint(d, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
3008#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003009#ifdef IPPROTO_XTP
3010 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
3011#endif
3012#ifdef IPPROTO_EON
3013 insint(d, "IPPROTO_EON", IPPROTO_EON);
3014#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003015#ifdef IPPROTO_PIM
3016 insint(d, "IPPROTO_PIM", IPPROTO_PIM);
3017#endif
3018#ifdef IPPROTO_IPCOMP
3019 insint(d, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
3020#endif
3021#ifdef IPPROTO_VRRP
3022 insint(d, "IPPROTO_VRRP", IPPROTO_VRRP);
3023#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003024#ifdef IPPROTO_BIP
3025 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
3026#endif
3027/**/
3028#ifdef IPPROTO_RAW
3029 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003030#else
3031 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003032#endif
3033#ifdef IPPROTO_MAX
3034 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
3035#endif
3036
3037 /* Some port configuration */
3038#ifdef IPPORT_RESERVED
3039 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
3040#else
3041 insint(d, "IPPORT_RESERVED", 1024);
3042#endif
3043#ifdef IPPORT_USERRESERVED
3044 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
3045#else
3046 insint(d, "IPPORT_USERRESERVED", 5000);
3047#endif
3048
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003049 /* Some reserved IP v.4 addresses */
3050#ifdef INADDR_ANY
3051 insint(d, "INADDR_ANY", INADDR_ANY);
3052#else
3053 insint(d, "INADDR_ANY", 0x00000000);
3054#endif
3055#ifdef INADDR_BROADCAST
3056 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
3057#else
3058 insint(d, "INADDR_BROADCAST", 0xffffffff);
3059#endif
3060#ifdef INADDR_LOOPBACK
3061 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
3062#else
3063 insint(d, "INADDR_LOOPBACK", 0x7F000001);
3064#endif
3065#ifdef INADDR_UNSPEC_GROUP
3066 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
3067#else
3068 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
3069#endif
3070#ifdef INADDR_ALLHOSTS_GROUP
3071 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
3072#else
3073 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
3074#endif
3075#ifdef INADDR_MAX_LOCAL_GROUP
3076 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
3077#else
3078 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
3079#endif
3080#ifdef INADDR_NONE
3081 insint(d, "INADDR_NONE", INADDR_NONE);
3082#else
3083 insint(d, "INADDR_NONE", 0xffffffff);
3084#endif
3085
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003086 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003087#ifdef IP_OPTIONS
3088 insint(d, "IP_OPTIONS", IP_OPTIONS);
3089#endif
3090#ifdef IP_HDRINCL
3091 insint(d, "IP_HDRINCL", IP_HDRINCL);
3092#endif
3093#ifdef IP_TOS
3094 insint(d, "IP_TOS", IP_TOS);
3095#endif
3096#ifdef IP_TTL
3097 insint(d, "IP_TTL", IP_TTL);
3098#endif
3099#ifdef IP_RECVOPTS
3100 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
3101#endif
3102#ifdef IP_RECVRETOPTS
3103 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
3104#endif
3105#ifdef IP_RECVDSTADDR
3106 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
3107#endif
3108#ifdef IP_RETOPTS
3109 insint(d, "IP_RETOPTS", IP_RETOPTS);
3110#endif
3111#ifdef IP_MULTICAST_IF
3112 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
3113#endif
3114#ifdef IP_MULTICAST_TTL
3115 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
3116#endif
3117#ifdef IP_MULTICAST_LOOP
3118 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
3119#endif
3120#ifdef IP_ADD_MEMBERSHIP
3121 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
3122#endif
3123#ifdef IP_DROP_MEMBERSHIP
3124 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
3125#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003126#ifdef IP_DEFAULT_MULTICAST_TTL
3127 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
3128#endif
3129#ifdef IP_DEFAULT_MULTICAST_LOOP
3130 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
3131#endif
3132#ifdef IP_MAX_MEMBERSHIPS
3133 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
3134#endif
3135
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003136 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3137#ifdef IPV6_JOIN_GROUP
3138 insint(d, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
3139#endif
3140#ifdef IPV6_LEAVE_GROUP
3141 insint(d, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
3142#endif
3143#ifdef IPV6_MULTICAST_HOPS
3144 insint(d, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
3145#endif
3146#ifdef IPV6_MULTICAST_IF
3147 insint(d, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
3148#endif
3149#ifdef IPV6_MULTICAST_LOOP
3150 insint(d, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
3151#endif
3152#ifdef IPV6_UNICAST_HOPS
3153 insint(d, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
3154#endif
3155
Guido van Rossum09be4091999-08-09 14:40:40 +00003156 /* TCP options */
3157#ifdef TCP_NODELAY
3158 insint(d, "TCP_NODELAY", TCP_NODELAY);
3159#endif
3160#ifdef TCP_MAXSEG
3161 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
3162#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003163#ifdef TCP_CORK
3164 insint(d, "TCP_CORK", TCP_CORK);
3165#endif
3166#ifdef TCP_KEEPIDLE
3167 insint(d, "TCP_KEEPIDLE", TCP_KEEPIDLE);
3168#endif
3169#ifdef TCP_KEEPINTVL
3170 insint(d, "TCP_KEEPINTVL", TCP_KEEPINTVL);
3171#endif
3172#ifdef TCP_KEEPCNT
3173 insint(d, "TCP_KEEPCNT", TCP_KEEPCNT);
3174#endif
3175#ifdef TCP_SYNCNT
3176 insint(d, "TCP_SYNCNT", TCP_SYNCNT);
3177#endif
3178#ifdef TCP_LINGER2
3179 insint(d, "TCP_LINGER2", TCP_LINGER2);
3180#endif
3181#ifdef TCP_DEFER_ACCEPT
3182 insint(d, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
3183#endif
3184#ifdef TCP_WINDOW_CLAMP
3185 insint(d, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
3186#endif
3187#ifdef TCP_INFO
3188 insint(d, "TCP_INFO", TCP_INFO);
3189#endif
3190#ifdef TCP_QUICKACK
3191 insint(d, "TCP_QUICKACK", TCP_QUICKACK);
3192#endif
3193
Guido van Rossum09be4091999-08-09 14:40:40 +00003194
3195 /* IPX options */
3196#ifdef IPX_TYPE
3197 insint(d, "IPX_TYPE", IPX_TYPE);
3198#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003199
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003200 /* get{addr,name}info parameters */
3201#ifdef EAI_ADDRFAMILY
3202 insint(d, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
3203#endif
3204#ifdef EAI_AGAIN
3205 insint(d, "EAI_AGAIN", EAI_AGAIN);
3206#endif
3207#ifdef EAI_BADFLAGS
3208 insint(d, "EAI_BADFLAGS", EAI_BADFLAGS);
3209#endif
3210#ifdef EAI_FAIL
3211 insint(d, "EAI_FAIL", EAI_FAIL);
3212#endif
3213#ifdef EAI_FAMILY
3214 insint(d, "EAI_FAMILY", EAI_FAMILY);
3215#endif
3216#ifdef EAI_MEMORY
3217 insint(d, "EAI_MEMORY", EAI_MEMORY);
3218#endif
3219#ifdef EAI_NODATA
3220 insint(d, "EAI_NODATA", EAI_NODATA);
3221#endif
3222#ifdef EAI_NONAME
3223 insint(d, "EAI_NONAME", EAI_NONAME);
3224#endif
3225#ifdef EAI_SERVICE
3226 insint(d, "EAI_SERVICE", EAI_SERVICE);
3227#endif
3228#ifdef EAI_SOCKTYPE
3229 insint(d, "EAI_SOCKTYPE", EAI_SOCKTYPE);
3230#endif
3231#ifdef EAI_SYSTEM
3232 insint(d, "EAI_SYSTEM", EAI_SYSTEM);
3233#endif
3234#ifdef EAI_BADHINTS
3235 insint(d, "EAI_BADHINTS", EAI_BADHINTS);
3236#endif
3237#ifdef EAI_PROTOCOL
3238 insint(d, "EAI_PROTOCOL", EAI_PROTOCOL);
3239#endif
3240#ifdef EAI_MAX
3241 insint(d, "EAI_MAX", EAI_MAX);
3242#endif
3243#ifdef AI_PASSIVE
3244 insint(d, "AI_PASSIVE", AI_PASSIVE);
3245#endif
3246#ifdef AI_CANONNAME
3247 insint(d, "AI_CANONNAME", AI_CANONNAME);
3248#endif
3249#ifdef AI_NUMERICHOST
3250 insint(d, "AI_NUMERICHOST", AI_NUMERICHOST);
3251#endif
3252#ifdef AI_MASK
3253 insint(d, "AI_MASK", AI_MASK);
3254#endif
3255#ifdef AI_ALL
3256 insint(d, "AI_ALL", AI_ALL);
3257#endif
3258#ifdef AI_V4MAPPED_CFG
3259 insint(d, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
3260#endif
3261#ifdef AI_ADDRCONFIG
3262 insint(d, "AI_ADDRCONFIG", AI_ADDRCONFIG);
3263#endif
3264#ifdef AI_V4MAPPED
3265 insint(d, "AI_V4MAPPED", AI_V4MAPPED);
3266#endif
3267#ifdef AI_DEFAULT
3268 insint(d, "AI_DEFAULT", AI_DEFAULT);
3269#endif
3270#ifdef NI_MAXHOST
3271 insint(d, "NI_MAXHOST", NI_MAXHOST);
3272#endif
3273#ifdef NI_MAXSERV
3274 insint(d, "NI_MAXSERV", NI_MAXSERV);
3275#endif
3276#ifdef NI_NOFQDN
3277 insint(d, "NI_NOFQDN", NI_NOFQDN);
3278#endif
3279#ifdef NI_NUMERICHOST
3280 insint(d, "NI_NUMERICHOST", NI_NUMERICHOST);
3281#endif
3282#ifdef NI_NAMEREQD
3283 insint(d, "NI_NAMEREQD", NI_NAMEREQD);
3284#endif
3285#ifdef NI_NUMERICSERV
3286 insint(d, "NI_NUMERICSERV", NI_NUMERICSERV);
3287#endif
3288#ifdef NI_DGRAM
3289 insint(d, "NI_DGRAM", NI_DGRAM);
3290#endif
3291
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003292 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003293#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003294 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003295#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003296}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003297
3298/* Simplistic emulation code for inet_pton that only works for IPv4 */
3299#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003300int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003301inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003302{
3303 if(af == AF_INET){
3304 long packed_addr;
3305#ifdef USE_GUSI1
3306 packed_addr = (long)inet_addr(src).s_addr;
3307#else
3308 packed_addr = inet_addr(src);
3309#endif
3310 if (packed_addr == INADDR_NONE)
3311 return 0;
3312 memcpy(dst, &packed_addr, 4);
3313 return 1;
3314 }
3315 /* Should set errno to EAFNOSUPPORT */
3316 return -1;
3317}
3318
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003319const char *
3320inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003321{
3322 if (af == AF_INET) {
3323 struct in_addr packed_addr;
3324 if (size < 16)
3325 /* Should set errno to ENOSPC. */
3326 return NULL;
3327 memcpy(&packed_addr, src, sizeof(packed_addr));
3328 return strncpy(dst, inet_ntoa(packed_addr), size);
3329 }
3330 /* Should set errno to EAFNOSUPPORT */
3331 return NULL;
3332}
3333#endif