blob: a8560d6a6ab7cdc9dc2c45674d9a364c303839c7 [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
254
Guido van Rossum30a685f1991-06-27 15:51:29 +0000255/* Convenience function to raise an error according to errno
256 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000257
Guido van Rossum73624e91994-10-10 17:59:00 +0000258static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000259PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000260{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000261#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000262 int err_no = WSAGetLastError();
263 if (err_no) {
264 static struct { int no; const char *msg; } *msgp, msgs[] = {
265 { WSAEINTR, "Interrupted system call" },
266 { WSAEBADF, "Bad file descriptor" },
267 { WSAEACCES, "Permission denied" },
268 { WSAEFAULT, "Bad address" },
269 { WSAEINVAL, "Invalid argument" },
270 { WSAEMFILE, "Too many open files" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000271 { WSAEWOULDBLOCK,
Mark Hammond46a733d2000-07-24 01:45:11 +0000272 "The socket operation could not complete "
273 "without blocking" },
274 { WSAEINPROGRESS, "Operation now in progress" },
275 { WSAEALREADY, "Operation already in progress" },
276 { WSAENOTSOCK, "Socket operation on non-socket" },
277 { WSAEDESTADDRREQ, "Destination address required" },
278 { WSAEMSGSIZE, "Message too long" },
279 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
280 { WSAENOPROTOOPT, "Protocol not available" },
281 { WSAEPROTONOSUPPORT, "Protocol not supported" },
282 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
283 { WSAEOPNOTSUPP, "Operation not supported" },
284 { WSAEPFNOSUPPORT, "Protocol family not supported" },
285 { WSAEAFNOSUPPORT, "Address family not supported" },
286 { WSAEADDRINUSE, "Address already in use" },
287 { WSAEADDRNOTAVAIL,
288 "Can't assign requested address" },
289 { WSAENETDOWN, "Network is down" },
290 { WSAENETUNREACH, "Network is unreachable" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000291 { WSAENETRESET,
Mark Hammond46a733d2000-07-24 01:45:11 +0000292 "Network dropped connection on reset" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000293 { WSAECONNABORTED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000294 "Software caused connection abort" },
295 { WSAECONNRESET, "Connection reset by peer" },
296 { WSAENOBUFS, "No buffer space available" },
297 { WSAEISCONN, "Socket is already connected" },
298 { WSAENOTCONN, "Socket is not connected" },
299 { WSAESHUTDOWN, "Can't send after socket shutdown" },
300 { WSAETOOMANYREFS,
301 "Too many references: can't splice" },
302 { WSAETIMEDOUT, "Operation timed out" },
303 { WSAECONNREFUSED, "Connection refused" },
304 { WSAELOOP, "Too many levels of symbolic links" },
305 { WSAENAMETOOLONG, "File name too long" },
306 { WSAEHOSTDOWN, "Host is down" },
307 { WSAEHOSTUNREACH, "No route to host" },
308 { WSAENOTEMPTY, "Directory not empty" },
309 { WSAEPROCLIM, "Too many processes" },
310 { WSAEUSERS, "Too many users" },
311 { WSAEDQUOT, "Disc quota exceeded" },
312 { WSAESTALE, "Stale NFS file handle" },
313 { WSAEREMOTE, "Too many levels of remote in path" },
314 { WSASYSNOTREADY,
315 "Network subsystem is unvailable" },
316 { WSAVERNOTSUPPORTED,
317 "WinSock version is not supported" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000318 { WSANOTINITIALISED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000319 "Successful WSAStartup() not yet performed" },
320 { WSAEDISCON, "Graceful shutdown in progress" },
321 /* Resolver errors */
322 { WSAHOST_NOT_FOUND, "No such host is known" },
323 { WSATRY_AGAIN, "Host not found, or server failed" },
324 { WSANO_RECOVERY,
325 "Unexpected server error encountered" },
326 { WSANO_DATA, "Valid name without requested data" },
327 { WSANO_ADDRESS, "No address, look for MX record" },
328 { 0, NULL }
329 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000330 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000331 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000332
Mark Hammond46a733d2000-07-24 01:45:11 +0000333 for (msgp = msgs; msgp->msg; msgp++) {
334 if (err_no == msgp->no) {
335 msg = msgp->msg;
336 break;
337 }
338 }
339
340 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000341 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000342 PyErr_SetObject(PySocket_Error, v);
343 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000344 }
345 return NULL;
346 }
347 else
348#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000349
350#if defined(PYOS_OS2)
351 if (sock_errno() != NO_ERROR) {
352 APIRET rc;
353 ULONG msglen;
354 char outbuf[100];
355 int myerrorcode = sock_errno();
356
357 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
358 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
359 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
360 if (rc == NO_ERROR) {
361 PyObject *v;
362
363 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
364 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
365 char *lastc = &outbuf[ strlen(outbuf)-1 ];
366 while (lastc > outbuf && isspace(*lastc))
367 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
368 }
369 v = Py_BuildValue("(is)", myerrorcode, outbuf);
370 if (v != NULL) {
371 PyErr_SetObject(PySocket_Error, v);
372 Py_DECREF(v);
373 }
374 return NULL;
375 }
376 }
377#endif
378
Guido van Rossum73624e91994-10-10 17:59:00 +0000379 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000380}
381
Guido van Rossum30a685f1991-06-27 15:51:29 +0000382
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000383static PyObject *
384PyH_Err(int h_error)
385{
386 PyObject *v;
387
388#ifdef HAVE_HSTRERROR
389 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
390#else
391 v = Py_BuildValue("(is)", h_error, "host not found");
392#endif
393 if (v != NULL) {
Martin v. Löwis864e9ff2001-08-04 22:32:03 +0000394 PyErr_SetObject(PyH_Error, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000395 Py_DECREF(v);
396 }
397
398 return NULL;
399}
400
401
402static PyObject *
403PyGAI_Err(int error)
404{
405 PyObject *v;
406
407 if (error == EAI_SYSTEM)
408 return PySocket_Err();
409
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000410#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000411 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000412#else
413 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
414#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000415 if (v != NULL) {
416 PyErr_SetObject(PyGAI_Error, v);
417 Py_DECREF(v);
418 }
419
420 return NULL;
421}
422
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000423/* Initialize a new socket object. */
424
425static void
426init_sockobject(PySocketSockObject *s,
427 SOCKET_T fd, int family, int type, int proto)
428{
429#ifdef RISCOS
430 int block = 1;
431#endif
432 s->sock_fd = fd;
433 s->sock_family = family;
434 s->sock_type = type;
435 s->sock_proto = proto;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000436 s->errorhandler = &PySocket_Err;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000437#ifdef RISCOS
438 if(taskwindow) {
439 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
440 }
441#endif
442}
443
444
Guido van Rossum30a685f1991-06-27 15:51:29 +0000445/* Create a new socket object.
446 This just creates the object and initializes it.
447 If the creation fails, return NULL and set an exception (implicit
448 in NEWOBJ()). */
449
Guido van Rossum73624e91994-10-10 17:59:00 +0000450static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000451PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000452{
Guido van Rossum73624e91994-10-10 17:59:00 +0000453 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000454 s = (PySocketSockObject *)
455 PyType_GenericNew(&PySocketSock_Type, NULL, NULL);
456 if (s != NULL)
457 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000458 return s;
459}
460
Guido van Rossum30a685f1991-06-27 15:51:29 +0000461
Guido van Rossum48a680c2001-03-02 06:34:14 +0000462/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000463 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000464#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000465PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000466#endif
467
468
Guido van Rossum30a685f1991-06-27 15:51:29 +0000469/* Convert a string specifying a host name or one of a few symbolic
470 names to a numeric IP address. This usually calls gethostbyname()
471 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000472 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000473 an error occurred; then an exception is raised. */
474
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000475static int
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000476setipaddr(char* name, struct sockaddr * addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000477{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000478 struct addrinfo hints, *res;
479 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000480
Guido van Rossuma376cc51996-12-05 23:43:35 +0000481 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000482 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000483 int siz;
484 memset(&hints, 0, sizeof(hints));
485 hints.ai_family = af;
486 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
487 hints.ai_flags = AI_PASSIVE;
488 error = getaddrinfo(NULL, "0", &hints, &res);
489 if (error) {
490 PyGAI_Err(error);
491 return -1;
492 }
493 switch (res->ai_family) {
494 case AF_INET:
495 siz = 4;
496 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000497#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000498 case AF_INET6:
499 siz = 16;
500 break;
501#endif
502 default:
503 freeaddrinfo(res);
504 PyErr_SetString(PySocket_Error,
505 "unsupported address family");
506 return -1;
507 }
508 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000509 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000510 PyErr_SetString(PySocket_Error,
511 "wildcard resolved to multiple address");
512 return -1;
513 }
514 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
515 freeaddrinfo(res);
516 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000517 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000518 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000519 struct sockaddr_in *sin;
520 if (af != PF_INET && af != PF_UNSPEC) {
521 PyErr_SetString(PySocket_Error,
522 "address family mismatched");
523 return -1;
524 }
525 sin = (struct sockaddr_in *)addr_ret;
526 memset((void *) sin, '\0', sizeof(*sin));
527 sin->sin_family = AF_INET;
528#ifdef HAVE_SOCKADDR_SA_LEN
529 sin->sin_len = sizeof(*sin);
530#endif
531 sin->sin_addr.s_addr = INADDR_BROADCAST;
532 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000533 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000534 memset(&hints, 0, sizeof(hints));
535 hints.ai_family = af;
536 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000537#if defined(__digital__) && defined(__unix__)
Martin v. Löwisb8fc9722001-10-24 17:35:46 +0000538 if (error == EAI_NONAME && af == AF_UNSPEC) {
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000539 /* On Tru64 V5.1, numeric-to-addr conversion
Martin v. Löwis861a65b2001-10-24 14:36:00 +0000540 fails if no address family is given. Assume IPv4 for now.*/
541 hints.ai_family = AF_INET;
542 error = getaddrinfo(name, NULL, &hints, &res);
543 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000544#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000545 if (error) {
546 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000547 return -1;
548 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000549 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
550 freeaddrinfo(res);
551 switch (addr_ret->sa_family) {
552 case AF_INET:
553 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000554#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000555 case AF_INET6:
556 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000557#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000558 default:
559 PyErr_SetString(PySocket_Error, "unknown address family");
560 return -1;
561 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000562}
563
Guido van Rossum30a685f1991-06-27 15:51:29 +0000564
Guido van Rossum30a685f1991-06-27 15:51:29 +0000565/* Create a string object representing an IP address.
566 This is always a string of the form 'dd.dd.dd.dd' (with variable
567 size numbers). */
568
Guido van Rossum73624e91994-10-10 17:59:00 +0000569static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000570makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000571{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000572 char buf[NI_MAXHOST];
573 int error;
574
575 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
576 NI_NUMERICHOST);
577 if (error) {
578 PyGAI_Err(error);
579 return NULL;
580 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000581 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000582}
583
584
585/* Create an object representing the given socket address,
586 suitable for passing it back to bind(), connect() etc.
587 The family field of the sockaddr structure is inspected
588 to determine what kind of address it really is. */
589
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000590/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000591static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000592makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000593{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000594 if (addrlen == 0) {
595 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000596 Py_INCREF(Py_None);
597 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000598 }
599
Guido van Rossumbcc20741998-08-04 22:53:56 +0000600#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000601 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000602 addr->sa_family = AF_INET;
603#endif
604
Guido van Rossum30a685f1991-06-27 15:51:29 +0000605 switch (addr->sa_family) {
606
607 case AF_INET:
608 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000609 struct sockaddr_in *a;
610 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000611 PyObject *ret = NULL;
612 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000613 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000614 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
615 Py_DECREF(addrobj);
616 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000617 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000618 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000619
Guido van Rossumb6775db1994-08-01 11:34:53 +0000620#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000621 case AF_UNIX:
622 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000623 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000624 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000625 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000626#endif /* AF_UNIX */
627
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000628#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000629 case AF_INET6:
630 {
631 struct sockaddr_in6 *a;
632 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
633 PyObject *ret = NULL;
634 if (addrobj) {
635 a = (struct sockaddr_in6 *)addr;
636 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
637 a->sin6_flowinfo, a->sin6_scope_id);
638 Py_DECREF(addrobj);
639 }
640 return ret;
641 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000642#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000643
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000644#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000645 case AF_PACKET:
646 {
647 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
648 char *ifname = "";
649 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000650 /* need to look up interface name give index */
651 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000652 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000653 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000654 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000655 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000656 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000657 a->sll_pkttype, a->sll_hatype,
658 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000659 }
660#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000661
Guido van Rossum30a685f1991-06-27 15:51:29 +0000662 /* More cases here... */
663
664 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000665 /* If we don't know the address family, don't raise an
666 exception -- return it as a tuple. */
667 return Py_BuildValue("is#",
668 addr->sa_family,
669 addr->sa_data,
670 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000671
Guido van Rossum30a685f1991-06-27 15:51:29 +0000672 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000673}
674
Guido van Rossum30a685f1991-06-27 15:51:29 +0000675
676/* Parse a socket address argument according to the socket object's
677 address family. Return 1 if the address was in the proper format,
678 0 of not. The address is returned through addr_ret, its length
679 through len_ret. */
680
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000681static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000682getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000683 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000684{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000685 switch (s->sock_family) {
686
Guido van Rossumb6775db1994-08-01 11:34:53 +0000687#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000688 case AF_UNIX:
689 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000690 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000691 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000692 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000693 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000694 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000695 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000696 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000697 PyErr_SetString(PySocket_Error,
698 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000699 return 0;
700 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000701 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000702 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000703 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000704 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000705 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000706 return 1;
707 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000708#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000709
Guido van Rossum30a685f1991-06-27 15:51:29 +0000710 case AF_INET:
711 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000712 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000713 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000714 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000715 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000716 if (!PyTuple_Check(args)) {
717 PyErr_Format(PyExc_TypeError,
718 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
719 args->ob_type->tp_name);
720 return 0;
721 }
722 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000723 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000724 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000725 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000726 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000727 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000728 *addr_ret = (struct sockaddr *) addr;
729 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000730 return 1;
731 }
732
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000733#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000734 case AF_INET6:
735 {
736 struct sockaddr_in6* addr;
737 char *host;
738 int port, flowinfo, scope_id;
739 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
740 flowinfo = scope_id = 0;
741 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
742 &scope_id)) {
743 return 0;
744 }
745 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
746 return 0;
747 addr->sin6_family = s->sock_family;
748 addr->sin6_port = htons((short)port);
749 addr->sin6_flowinfo = flowinfo;
750 addr->sin6_scope_id = scope_id;
751 *addr_ret = (struct sockaddr *) addr;
752 *len_ret = sizeof *addr;
753 return 1;
754 }
755#endif
756
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000757#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000758 case AF_PACKET:
759 {
760 struct sockaddr_ll* addr;
761 struct ifreq ifr;
762 char *interfaceName;
763 int protoNumber;
764 int hatype = 0;
765 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000766 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000767
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000768 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
769 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000770 return 0;
771 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
772 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000773 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000774 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +0000775 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000776 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000777 addr = &(s->sock_addr.ll);
778 addr->sll_family = AF_PACKET;
779 addr->sll_protocol = htons((short)protoNumber);
780 addr->sll_ifindex = ifr.ifr_ifindex;
781 addr->sll_pkttype = pkttype;
782 addr->sll_hatype = hatype;
783 *addr_ret = (struct sockaddr *) addr;
784 *len_ret = sizeof *addr;
785 return 1;
786 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000787#endif
788
Guido van Rossum30a685f1991-06-27 15:51:29 +0000789 /* More cases here... */
790
791 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000792 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000793 return 0;
794
795 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000796}
797
Guido van Rossum30a685f1991-06-27 15:51:29 +0000798
Guido van Rossum48a680c2001-03-02 06:34:14 +0000799/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000800 Return 1 if the family is known, 0 otherwise. The length is returned
801 through len_ret. */
802
803static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000804getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000805{
806 switch (s->sock_family) {
807
Guido van Rossumb6775db1994-08-01 11:34:53 +0000808#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000809 case AF_UNIX:
810 {
811 *len_ret = sizeof (struct sockaddr_un);
812 return 1;
813 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000814#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000815
816 case AF_INET:
817 {
818 *len_ret = sizeof (struct sockaddr_in);
819 return 1;
820 }
821
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000822#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000823 case AF_INET6:
824 {
825 *len_ret = sizeof (struct sockaddr_in6);
826 return 1;
827 }
828#endif
829
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000830#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000831 case AF_PACKET:
832 {
833 *len_ret = sizeof (struct sockaddr_ll);
834 return 1;
835 }
836#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000837
Guido van Rossum710e1df1992-06-12 10:39:36 +0000838 /* More cases here... */
839
840 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000841 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000842 return 0;
843
844 }
845}
846
847
Guido van Rossum30a685f1991-06-27 15:51:29 +0000848/* s.accept() method */
849
Guido van Rossum73624e91994-10-10 17:59:00 +0000850static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000851PySocketSock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000852{
853 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000854 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000855 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000856 PyObject *sock = NULL;
857 PyObject *addr = NULL;
858 PyObject *res = NULL;
859
Guido van Rossum710e1df1992-06-12 10:39:36 +0000860 if (!getsockaddrlen(s, &addrlen))
861 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000862 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000863 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000864 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000865 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000866#ifdef MS_WINDOWS
867 if (newfd == INVALID_SOCKET)
868#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000869 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000870#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000871 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +0000872
Guido van Rossum30a685f1991-06-27 15:51:29 +0000873 /* Create the new object with unspecified family,
874 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000875 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000876 s->sock_family,
877 s->sock_type,
878 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000879 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000880 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000881 goto finally;
882 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000883 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000884 addrlen);
885 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000886 goto finally;
887
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000888 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000889
890 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000891 Py_XDECREF(sock);
892 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000893 return res;
894}
895
Guido van Rossum82a5c661998-07-07 20:45:43 +0000896static char accept_doc[] =
897"accept() -> (socket object, address info)\n\
898\n\
899Wait for an incoming connection. Return a new socket representing the\n\
900connection, and the address of the client. For IP sockets, the address\n\
901info is a pair (hostaddr, port).";
902
Guido van Rossum30a685f1991-06-27 15:51:29 +0000903
Guido van Rossume4485b01994-09-07 14:32:49 +0000904/* s.setblocking(1 | 0) method */
905
Guido van Rossum73624e91994-10-10 17:59:00 +0000906static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000907PySocketSock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +0000908{
909 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000910#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000911#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000912 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000913#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000914#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000915 block = PyInt_AsLong(arg);
916 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +0000917 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000918 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000919#ifdef __BEOS__
920 block = !block;
921 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
922 (void *)(&block), sizeof( int ) );
923#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000924#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000925#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000926#ifdef PYOS_OS2
927 block = !block;
928 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
929#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000930 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
931 if (block)
932 delay_flag &= (~O_NDELAY);
933 else
934 delay_flag |= O_NDELAY;
935 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000936#endif /* !PYOS_OS2 */
937#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000938 block = !block;
939 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000940#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000941#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000942#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +0000943 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000944
Guido van Rossum73624e91994-10-10 17:59:00 +0000945 Py_INCREF(Py_None);
946 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000947}
Guido van Rossume4485b01994-09-07 14:32:49 +0000948
Guido van Rossum82a5c661998-07-07 20:45:43 +0000949static char setblocking_doc[] =
950"setblocking(flag)\n\
951\n\
952Set the socket to blocking (flag is true) or non-blocking (false).\n\
953This uses the FIONBIO ioctl with the O_NDELAY flag.";
954
Guido van Rossume4485b01994-09-07 14:32:49 +0000955
Guido van Rossum48a680c2001-03-02 06:34:14 +0000956#ifdef RISCOS
957/* s.sleeptaskw(1 | 0) method */
958
959static PyObject *
960PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
961{
962 int block;
963 int delay_flag;
964 if (!PyArg_GetInt(args, &block))
965 return NULL;
966 Py_BEGIN_ALLOW_THREADS
967 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
968 Py_END_ALLOW_THREADS
969
970 Py_INCREF(Py_None);
971 return Py_None;
972}
973static char sleeptaskw_doc[] =
974"sleeptaskw(flag)\n\
975\n\
976Allow sleeps in taskwindows.";
977#endif
978
979
Guido van Rossumaee08791992-09-08 09:05:33 +0000980/* s.setsockopt() method.
981 With an integer third argument, sets an integer option.
982 With a string third argument, sets an option from a buffer;
983 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000984
Guido van Rossum73624e91994-10-10 17:59:00 +0000985static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000986PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000987{
988 int level;
989 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000990 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000991 char *buf;
992 int buflen;
993 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000994
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000995 if (PyArg_ParseTuple(args, "iii:setsockopt",
996 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000997 buf = (char *) &flag;
998 buflen = sizeof flag;
999 }
1000 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001001 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001002 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1003 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001004 return NULL;
1005 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001006 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001007 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001008 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001009 Py_INCREF(Py_None);
1010 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001011}
1012
Guido van Rossum82a5c661998-07-07 20:45:43 +00001013static char setsockopt_doc[] =
1014"setsockopt(level, option, value)\n\
1015\n\
1016Set a socket option. See the Unix manual for level and option.\n\
1017The value argument can either be an integer or a string.";
1018
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001019
Guido van Rossumaee08791992-09-08 09:05:33 +00001020/* s.getsockopt() method.
1021 With two arguments, retrieves an integer option.
1022 With a third integer argument, retrieves a string buffer of that size;
1023 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001024
Guido van Rossum73624e91994-10-10 17:59:00 +00001025static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001026PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001027{
1028 int level;
1029 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001030 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001031 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001032 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001033
Guido van Rossumbcc20741998-08-04 22:53:56 +00001034#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001035 /* We have incomplete socket support. */
1036 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001037 return NULL;
1038#else
1039
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001040 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1041 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001042 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001043
Guido van Rossumbe32c891996-06-20 16:25:29 +00001044 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001045 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001046 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001047 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001048 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001049 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001050 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001051 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001052 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001053 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001054 PyErr_SetString(PySocket_Error,
1055 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001056 return NULL;
1057 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001058 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001059 if (buf == NULL)
1060 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001061 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001062 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001063 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001064 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001065 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001066 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001067 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001068 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001069#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001070}
1071
Guido van Rossum82a5c661998-07-07 20:45:43 +00001072static char getsockopt_doc[] =
1073"getsockopt(level, option[, buffersize]) -> value\n\
1074\n\
1075Get a socket option. See the Unix manual for level and option.\n\
1076If a nonzero buffersize argument is given, the return value is a\n\
1077string of that length; otherwise it is an integer.";
1078
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001079
Fred Drake728819a2000-07-01 03:40:12 +00001080/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001081
Guido van Rossum73624e91994-10-10 17:59:00 +00001082static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001083PySocketSock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001084{
1085 struct sockaddr *addr;
1086 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001087 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001088
Fred Drake728819a2000-07-01 03:40:12 +00001089 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001090 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001091 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001092 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001093 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001094 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001095 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001096 Py_INCREF(Py_None);
1097 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001098}
1099
Guido van Rossum82a5c661998-07-07 20:45:43 +00001100static char bind_doc[] =
1101"bind(address)\n\
1102\n\
1103Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001104pair (host, port); the host must refer to the local host. For raw packet\n\
1105sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001106
Guido van Rossum30a685f1991-06-27 15:51:29 +00001107
1108/* s.close() method.
1109 Set the file descriptor to -1 so operations tried subsequently
1110 will surely fail. */
1111
Guido van Rossum73624e91994-10-10 17:59:00 +00001112static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001113PySocketSock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001114{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001115 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001116
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001117 if ((fd = s->sock_fd) != -1) {
1118 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001119 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001120 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001121 Py_END_ALLOW_THREADS
1122 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001123 Py_INCREF(Py_None);
1124 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001125}
1126
Guido van Rossum82a5c661998-07-07 20:45:43 +00001127static char close_doc[] =
1128"close()\n\
1129\n\
1130Close the socket. It cannot be used after this call.";
1131
Guido van Rossum30a685f1991-06-27 15:51:29 +00001132
Fred Drake728819a2000-07-01 03:40:12 +00001133/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001134
Guido van Rossum73624e91994-10-10 17:59:00 +00001135static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001136PySocketSock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001137{
1138 struct sockaddr *addr;
1139 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001140 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001141
Fred Drake728819a2000-07-01 03:40:12 +00001142 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001143 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001144 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001145 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001146 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001147 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001148 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001149 Py_INCREF(Py_None);
1150 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001151}
1152
Guido van Rossum82a5c661998-07-07 20:45:43 +00001153static char connect_doc[] =
1154"connect(address)\n\
1155\n\
1156Connect the socket to a remote address. For IP sockets, the address\n\
1157is a pair (host, port).";
1158
Guido van Rossum30a685f1991-06-27 15:51:29 +00001159
Fred Drake728819a2000-07-01 03:40:12 +00001160/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001161
1162static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001163PySocketSock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001164{
1165 struct sockaddr *addr;
1166 int addrlen;
1167 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001168
Fred Drake728819a2000-07-01 03:40:12 +00001169 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001170 return NULL;
1171 Py_BEGIN_ALLOW_THREADS
1172 res = connect(s->sock_fd, addr, addrlen);
1173 Py_END_ALLOW_THREADS
Tim Petersc32410a2001-10-30 01:26:49 +00001174 if (res != 0) {
1175#ifdef MS_WINDOWS
1176 res = WSAGetLastError();
1177#else
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001178 res = errno;
Tim Petersc32410a2001-10-30 01:26:49 +00001179#endif
1180 }
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001181 return PyInt_FromLong((long) res);
1182}
1183
Guido van Rossum82a5c661998-07-07 20:45:43 +00001184static char connect_ex_doc[] =
1185"connect_ex(address)\n\
1186\n\
1187This is like connect(address), but returns an error code (the errno value)\n\
1188instead of raising an exception when an error occurs.";
1189
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001190
Guido van Rossumed233a51992-06-23 09:07:03 +00001191/* s.fileno() method */
1192
Guido van Rossum73624e91994-10-10 17:59:00 +00001193static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001194PySocketSock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001195{
Fred Drakea04eaad2000-06-30 02:46:07 +00001196#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001197 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001198#else
1199 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1200#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001201}
1202
Guido van Rossum82a5c661998-07-07 20:45:43 +00001203static char fileno_doc[] =
1204"fileno() -> integer\n\
1205\n\
1206Return the integer file descriptor of the socket.";
1207
Guido van Rossumed233a51992-06-23 09:07:03 +00001208
Guido van Rossumbe32c891996-06-20 16:25:29 +00001209#ifndef NO_DUP
1210/* s.dup() method */
1211
1212static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001213PySocketSock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001214{
Fred Drakea04eaad2000-06-30 02:46:07 +00001215 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001216 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001217
Guido van Rossumbe32c891996-06-20 16:25:29 +00001218 newfd = dup(s->sock_fd);
1219 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001220 return s->errorhandler();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001221 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001222 s->sock_family,
1223 s->sock_type,
1224 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001225 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001226 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001227 return sock;
1228}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001229
1230static char dup_doc[] =
1231"dup() -> socket object\n\
1232\n\
1233Return a new socket object connected to the same system resource.";
1234
Guido van Rossumbe32c891996-06-20 16:25:29 +00001235#endif
1236
1237
Guido van Rossumc89705d1992-11-26 08:54:07 +00001238/* s.getsockname() method */
1239
Guido van Rossum73624e91994-10-10 17:59:00 +00001240static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001241PySocketSock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001242{
1243 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001244 int res;
1245 socklen_t addrlen;
1246
Guido van Rossumc89705d1992-11-26 08:54:07 +00001247 if (!getsockaddrlen(s, &addrlen))
1248 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001249 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001250 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001251 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001252 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001253 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001254 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001255 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001256}
1257
Guido van Rossum82a5c661998-07-07 20:45:43 +00001258static char getsockname_doc[] =
1259"getsockname() -> address info\n\
1260\n\
1261Return the address of the local endpoint. For IP sockets, the address\n\
1262info is a pair (hostaddr, port).";
1263
Guido van Rossumc89705d1992-11-26 08:54:07 +00001264
Guido van Rossumb6775db1994-08-01 11:34:53 +00001265#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001266/* s.getpeername() method */
1267
Guido van Rossum73624e91994-10-10 17:59:00 +00001268static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001269PySocketSock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001270{
1271 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001272 int res;
1273 socklen_t addrlen;
1274
Guido van Rossumc89705d1992-11-26 08:54:07 +00001275 if (!getsockaddrlen(s, &addrlen))
1276 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001277 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001278 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001279 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001280 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001281 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001282 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001283 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001284}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001285
1286static char getpeername_doc[] =
1287"getpeername() -> address info\n\
1288\n\
1289Return the address of the remote endpoint. For IP sockets, the address\n\
1290info is a pair (hostaddr, port).";
1291
Guido van Rossumb6775db1994-08-01 11:34:53 +00001292#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001293
1294
Guido van Rossum30a685f1991-06-27 15:51:29 +00001295/* s.listen(n) method */
1296
Guido van Rossum73624e91994-10-10 17:59:00 +00001297static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001298PySocketSock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001299{
1300 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001301 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001302
1303 backlog = PyInt_AsLong(arg);
1304 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001305 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001306 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001307 if (backlog < 1)
1308 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001309 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001310 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001311 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001312 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001313 Py_INCREF(Py_None);
1314 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001315}
1316
Guido van Rossum82a5c661998-07-07 20:45:43 +00001317static char listen_doc[] =
1318"listen(backlog)\n\
1319\n\
1320Enable a server to accept connections. The backlog argument must be at\n\
1321least 1; it specifies the number of unaccepted connection that the system\n\
1322will allow before refusing new connections.";
1323
1324
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001325#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001326/* s.makefile(mode) method.
1327 Create a new open file object referring to a dupped version of
1328 the socket's file descriptor. (The dup() call is necessary so
1329 that the open file and socket objects may be closed independent
1330 of each other.)
1331 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1332
Guido van Rossum73624e91994-10-10 17:59:00 +00001333static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001334PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001335{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001336 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001337 char *mode = "r";
1338 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001339#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001340 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001341#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001342 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001343#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001344 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001345 PyObject *f;
1346
Guido van Rossum43713e52000-02-29 13:59:29 +00001347 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001348 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001349#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001350 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1351 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001352#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001353 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001354#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001355 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001356 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001357 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001358 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001359 }
1360 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1361 if (f != NULL)
1362 PyFile_SetBufSize(f, bufsize);
1363 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001364}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001365
1366static char makefile_doc[] =
1367"makefile([mode[, buffersize]]) -> file object\n\
1368\n\
1369Return a regular file object corresponding to the socket.\n\
1370The mode and buffersize arguments are as for the built-in open() function.";
1371
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001372#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001373
Guido van Rossum48a680c2001-03-02 06:34:14 +00001374
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001375/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001376
Guido van Rossum73624e91994-10-10 17:59:00 +00001377static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001378PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001379{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001380 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001381 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001382 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001383 return NULL;
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001384 if (len < 0) {
1385 PyErr_SetString(PyExc_ValueError,
1386 "negative buffersize in connect");
1387 return NULL;
1388 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001389 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001390 if (buf == NULL)
1391 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001392 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001393 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001394 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001395 if (n < 0) {
1396 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001397 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001398 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001399 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001400 return NULL;
1401 return buf;
1402}
1403
Guido van Rossum82a5c661998-07-07 20:45:43 +00001404static char recv_doc[] =
1405"recv(buffersize[, flags]) -> data\n\
1406\n\
1407Receive up to buffersize bytes from the socket. For the optional flags\n\
1408argument, see the Unix manual. When no data is available, block until\n\
1409at least one byte is available or until the remote end is closed. When\n\
1410the remote end is closed and all data is read, return the empty string.";
1411
Guido van Rossum30a685f1991-06-27 15:51:29 +00001412
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001413/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001414
Guido van Rossum73624e91994-10-10 17:59:00 +00001415static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001416PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001417{
1418 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001419 PyObject *buf = NULL;
1420 PyObject *addr = NULL;
1421 PyObject *ret = NULL;
1422
Guido van Rossumff3ab422000-04-24 15:16:03 +00001423 int len, n, flags = 0;
1424 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001425 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001426 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001427 if (!getsockaddrlen(s, &addrlen))
1428 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001429 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001430 if (buf == NULL)
1431 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001432 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001433 memset(addrbuf, 0, addrlen);
1434 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001435#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001436#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001437 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001438#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001439 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001440#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001441#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001442 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001443#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001444 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001445 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001446 if (n < 0) {
1447 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001448 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001449 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001450 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001451 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001452
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001453 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001454 goto finally;
1455
Guido van Rossum73624e91994-10-10 17:59:00 +00001456 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001457 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001458 Py_XDECREF(addr);
1459 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001460 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001461}
1462
Guido van Rossum82a5c661998-07-07 20:45:43 +00001463static char recvfrom_doc[] =
1464"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1465\n\
1466Like recv(buffersize, flags) but also return the sender's address info.";
1467
Guido van Rossum30a685f1991-06-27 15:51:29 +00001468
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001469/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001470
Guido van Rossum73624e91994-10-10 17:59:00 +00001471static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001472PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001473{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001474 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001475 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001476 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001477 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001478 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001479 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001480 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001481 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001482 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001483 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001484}
1485
Guido van Rossum82a5c661998-07-07 20:45:43 +00001486static char send_doc[] =
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001487"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001488\n\
1489Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001490argument, see the Unix manual. Return the number of bytes\n\
1491sent; this may be less than len(data) if the network is busy.";
1492
1493
1494/* s.sendall(data [,flags]) method */
1495
1496static PyObject *
1497PySocketSock_sendall(PySocketSockObject *s, PyObject *args)
1498{
1499 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001500 int len, n, flags = 0;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001501 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1502 return NULL;
1503 Py_BEGIN_ALLOW_THREADS
1504 do {
1505 n = send(s->sock_fd, buf, len, flags);
1506 if (n < 0)
1507 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001508 buf += n;
1509 len -= n;
1510 } while (len > 0);
1511 Py_END_ALLOW_THREADS
1512 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001513 return s->errorhandler();
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001514 Py_INCREF(Py_None);
1515 return Py_None;
1516}
1517
1518static char sendall_doc[] =
1519"sendall(data[, flags])\n\
1520\n\
1521Send a data string to the socket. For the optional flags\n\
1522argument, see the Unix manual. This calls send() repeatedly\n\
1523until all data is sent. If an error occurs, it's impossible\n\
1524to tell how much data has been sent.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001525
Guido van Rossum30a685f1991-06-27 15:51:29 +00001526
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001527/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001528
Guido van Rossum73624e91994-10-10 17:59:00 +00001529static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001530PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001531{
Guido van Rossum73624e91994-10-10 17:59:00 +00001532 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001533 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001534 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001535 int addrlen, len, n, flags;
1536 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001537 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001538 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001539 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1540 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001541 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001542 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001543 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001544 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001545 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001546 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001547 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001548 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001549 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001550 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001551}
1552
Guido van Rossum82a5c661998-07-07 20:45:43 +00001553static char sendto_doc[] =
1554"sendto(data[, flags], address)\n\
1555\n\
1556Like send(data, flags) but allows specifying the destination address.\n\
1557For IP sockets, the address is a pair (hostaddr, port).";
1558
Guido van Rossum30a685f1991-06-27 15:51:29 +00001559
1560/* s.shutdown(how) method */
1561
Guido van Rossum73624e91994-10-10 17:59:00 +00001562static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001563PySocketSock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001564{
1565 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001566 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001567
1568 how = PyInt_AsLong(arg);
1569 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001570 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001571 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001572 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001573 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001574 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001575 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001576 Py_INCREF(Py_None);
1577 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001578}
1579
Guido van Rossum82a5c661998-07-07 20:45:43 +00001580static char shutdown_doc[] =
1581"shutdown(flag)\n\
1582\n\
1583Shut down the reading side of the socket (flag == 0), the writing side\n\
1584of the socket (flag == 1), or both ends (flag == 2).";
1585
Guido van Rossum30a685f1991-06-27 15:51:29 +00001586
1587/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001588
Guido van Rossum73624e91994-10-10 17:59:00 +00001589static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum17209fc2001-10-15 21:12:54 +00001590 {"accept", (PyCFunction)PySocketSock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001591 accept_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001592 {"bind", (PyCFunction)PySocketSock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001593 bind_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00001594 {"close", (PyCFunction)PySocketSock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001595 close_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001596 {"connect", (PyCFunction)PySocketSock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001597 connect_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001598 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001599 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001600#ifndef NO_DUP
Guido van Rossum17209fc2001-10-15 21:12:54 +00001601 {"dup", (PyCFunction)PySocketSock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001602 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001603#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001604 {"fileno", (PyCFunction)PySocketSock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001605 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001606#ifdef HAVE_GETPEERNAME
Guido van Rossum17209fc2001-10-15 21:12:54 +00001607 {"getpeername", (PyCFunction)PySocketSock_getpeername,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001608 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001609#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001610 {"getsockname", (PyCFunction)PySocketSock_getsockname,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001611 METH_NOARGS, getsockname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001612 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1613 getsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001614 {"listen", (PyCFunction)PySocketSock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001615 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001616#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001617 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1618 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001619#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001620 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1621 recv_doc},
1622 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1623 recvfrom_doc},
1624 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1625 send_doc},
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001626 {"sendall", (PyCFunction)PySocketSock_sendall, METH_VARARGS,
1627 sendall_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001628 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1629 sendto_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001630 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001631 setblocking_doc},
1632 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1633 setsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001634 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001635 shutdown_doc},
1636#ifdef RISCOS
1637 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1638 sleeptaskw_doc},
1639#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001640 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001641};
1642
Guido van Rossum30a685f1991-06-27 15:51:29 +00001643
Guido van Rossum73624e91994-10-10 17:59:00 +00001644/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001645 First close the file description. */
1646
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001647static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001648PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001649{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001650 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001651 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001652 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001653}
1654
Guido van Rossum30a685f1991-06-27 15:51:29 +00001655
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001656static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001657PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001658{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001659 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001660#if SIZEOF_SOCKET_T > SIZEOF_LONG
1661 if (s->sock_fd > LONG_MAX) {
1662 /* this can occur on Win64, and actually there is a special
1663 ugly printf formatter for decimal pointer length integer
1664 printing, only bother if necessary*/
1665 PyErr_SetString(PyExc_OverflowError,
1666 "no printf formatter to display the socket descriptor in decimal");
1667 return NULL;
1668 }
1669#endif
Tim Peters885d4572001-11-28 20:27:42 +00001670 PyOS_snprintf(buf, sizeof(buf),
1671 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1672 (long)s->sock_fd, s->sock_family,
1673 s->sock_type,
1674 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001675 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001676}
1677
1678
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001679/* Create a new, uninitialized socket object. */
1680
1681static PyObject *
1682PySocketSock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1683{
1684 PyObject *new;
1685
1686 new = type->tp_alloc(type, 0);
1687 if (new != NULL)
1688 ((PySocketSockObject *)new)->sock_fd = -1;
1689 return new;
1690}
1691
1692
1693/* Initialize a new socket object. */
1694
1695/*ARGSUSED*/
1696static int
1697PySocketSock_init(PyObject *self, PyObject *args, PyObject *kwds)
1698{
1699 PySocketSockObject *s = (PySocketSockObject *)self;
1700 SOCKET_T fd;
1701 int family = AF_INET, type = SOCK_STREAM, proto = 0;
1702 static char *keywords[] = {"family", "type", "proto", 0};
1703
1704 if (!PyArg_ParseTupleAndKeywords(args, kwds,
1705 "|iii:socket", keywords,
1706 &family, &type, &proto))
1707 return -1;
1708 Py_BEGIN_ALLOW_THREADS
1709 fd = socket(family, type, proto);
1710 Py_END_ALLOW_THREADS
1711#ifdef MS_WINDOWS
1712 if (fd == INVALID_SOCKET)
1713#else
1714 if (fd < 0)
1715#endif
1716 {
1717 PySocket_Err();
1718 return -1;
1719 }
1720 init_sockobject(s, fd, family, type, proto);
1721 /* From now on, ignore SIGPIPE and let the error checking
1722 do the work. */
1723#ifdef SIGPIPE
1724 (void) signal(SIGPIPE, SIG_IGN);
1725#endif
1726 return 0;
1727}
1728
1729
Guido van Rossumb6775db1994-08-01 11:34:53 +00001730/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001731
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001732static char socket_doc[] =
1733"socket([family[, type[, proto]]]) -> socket object\n\
1734\n\
1735Open a socket of the given type. The family argument specifies the\n\
1736address family; it defaults to AF_INET. The type argument specifies\n\
1737whether this is a stream (SOCK_STREAM, this is the default)\n\
1738or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1739specifying the default protocol.\n\
1740\n\
1741A socket represents one endpoint of a network connection.\n\
1742\n\
1743Methods:\n\
1744\n\
1745accept() -- accept a connection, returning new socket and client address\n\
1746bind() -- bind the socket to a local address\n\
1747close() -- close the socket\n\
1748connect() -- connect the socket to a remote address\n\
1749connect_ex() -- connect, return an error code instead of an exception \n\
1750dup() -- return a new socket object identical to the current one (*)\n\
1751fileno() -- return underlying file descriptor\n\
1752getpeername() -- return remote address (*)\n\
1753getsockname() -- return local address\n\
1754getsockopt() -- get socket options\n\
1755listen() -- start listening for incoming connections\n\
Andrew M. Kuchling3072ecd2001-11-28 04:28:31 +00001756makefile() -- return a file object corresponding to the socket (*)\n\
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001757recv() -- receive data\n\
1758recvfrom() -- receive data and sender's address\n\
1759send() -- send data, may not send all of it\n\
1760sendall() -- send all data\n\
1761sendto() -- send data to a given address\n\
1762setblocking() -- set or clear the blocking I/O flag\n\
1763setsockopt() -- set socket options\n\
1764shutdown() -- shut down traffic in one or both directions\n\
1765\n\
1766(*) not available on all platforms!)";
1767
Guido van Rossum73624e91994-10-10 17:59:00 +00001768static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001769 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001770 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00001771 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001772 sizeof(PySocketSockObject), /* tp_basicsize */
1773 0, /* tp_itemsize */
1774 (destructor)PySocketSock_dealloc, /* tp_dealloc */
1775 0, /* tp_print */
1776 0, /* tp_getattr */
1777 0, /* tp_setattr */
1778 0, /* tp_compare */
1779 (reprfunc)PySocketSock_repr, /* tp_repr */
1780 0, /* tp_as_number */
1781 0, /* tp_as_sequence */
1782 0, /* tp_as_mapping */
1783 0, /* tp_hash */
1784 0, /* tp_call */
1785 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001786 0, /* set below */ /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001787 0, /* tp_setattro */
1788 0, /* tp_as_buffer */
1789 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1790 socket_doc, /* tp_doc */
1791 0, /* tp_traverse */
1792 0, /* tp_clear */
1793 0, /* tp_richcompare */
1794 0, /* tp_weaklistoffset */
1795 0, /* tp_iter */
1796 0, /* tp_iternext */
1797 PySocketSock_methods, /* tp_methods */
1798 0, /* tp_members */
1799 0, /* tp_getset */
1800 0, /* tp_base */
1801 0, /* tp_dict */
1802 0, /* tp_descr_get */
1803 0, /* tp_descr_set */
1804 0, /* tp_dictoffset */
1805 PySocketSock_init, /* tp_init */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001806 0, /* set below */ /* tp_alloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001807 PySocketSock_new, /* tp_new */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001808 0, /* set below */ /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001809};
1810
Guido van Rossum30a685f1991-06-27 15:51:29 +00001811
Guido van Rossum81194471991-07-27 21:42:02 +00001812/* Python interface to gethostname(). */
1813
1814/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001815static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001816PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001817{
1818 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001819 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001820 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001821 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001822 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001823 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001824 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001825 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001826 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001827 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001828 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001829}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001830
Guido van Rossum82a5c661998-07-07 20:45:43 +00001831static char gethostname_doc[] =
1832"gethostname() -> string\n\
1833\n\
1834Return the current host name.";
1835
Guido van Rossumff4949e1992-08-05 19:58:53 +00001836
Guido van Rossum30a685f1991-06-27 15:51:29 +00001837/* Python interface to gethostbyname(name). */
1838
1839/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001840static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001841PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001842{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001843 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001844 struct sockaddr_storage addrbuf;
1845
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001846 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001847 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001848 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001849 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001850 return makeipaddr((struct sockaddr *)&addrbuf,
1851 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001852}
1853
Guido van Rossum82a5c661998-07-07 20:45:43 +00001854static char gethostbyname_doc[] =
1855"gethostbyname(host) -> address\n\
1856\n\
1857Return the IP address (a string of the form '255.255.255.255') for a host.";
1858
1859
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001860/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1861
1862static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001863gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001864{
1865 char **pch;
1866 PyObject *rtn_tuple = (PyObject *)NULL;
1867 PyObject *name_list = (PyObject *)NULL;
1868 PyObject *addr_list = (PyObject *)NULL;
1869 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001870
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001871 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001872 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001873#ifndef RISCOS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001874 PyH_Err(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001875#else
1876 PyErr_SetString(PySocket_Error, "host not found");
1877#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001878 return NULL;
1879 }
1880 if (h->h_addrtype != af) {
1881#ifdef HAVE_STRERROR
1882 /* Let's get real error message to return */
1883 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001884#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001885 PyErr_SetString(PySocket_Error,
1886 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001887#endif
1888 return NULL;
1889 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001890 switch (af) {
1891 case AF_INET:
1892 if (alen < sizeof(struct sockaddr_in))
1893 return NULL;
1894 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001895#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001896 case AF_INET6:
1897 if (alen < sizeof(struct sockaddr_in6))
1898 return NULL;
1899 break;
1900#endif
1901 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001902 if ((name_list = PyList_New(0)) == NULL)
1903 goto err;
1904 if ((addr_list = PyList_New(0)) == NULL)
1905 goto err;
1906 for (pch = h->h_aliases; *pch != NULL; pch++) {
1907 int status;
1908 tmp = PyString_FromString(*pch);
1909 if (tmp == NULL)
1910 goto err;
1911 status = PyList_Append(name_list, tmp);
1912 Py_DECREF(tmp);
1913 if (status)
1914 goto err;
1915 }
1916 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1917 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001918 switch (af) {
1919 case AF_INET:
1920 {
1921 struct sockaddr_in sin;
1922 memset(&sin, 0, sizeof(sin));
1923 sin.sin_family = af;
1924#ifdef HAVE_SOCKADDR_SA_LEN
1925 sin.sin_len = sizeof(sin);
1926#endif
1927 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
1928 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
1929 if (pch == h->h_addr_list && alen >= sizeof(sin))
1930 memcpy((char *) addr, &sin, sizeof(sin));
1931 break;
1932 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001933#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001934 case AF_INET6:
1935 {
1936 struct sockaddr_in6 sin6;
1937 memset(&sin6, 0, sizeof(sin6));
1938 sin6.sin6_family = af;
1939#ifdef HAVE_SOCKADDR_SA_LEN
1940 sin6.sin6_len = sizeof(sin6);
1941#endif
1942 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
1943 tmp = makeipaddr((struct sockaddr *)&sin6,
1944 sizeof(sin6));
1945 if (pch == h->h_addr_list && alen >= sizeof(sin6))
1946 memcpy((char *) addr, &sin6, sizeof(sin6));
1947 break;
1948 }
1949#endif
1950 default: /* can't happen */
1951 PyErr_SetString(PySocket_Error,
1952 "unsupported address family");
1953 return NULL;
1954 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001955 if (tmp == NULL)
1956 goto err;
1957 status = PyList_Append(addr_list, tmp);
1958 Py_DECREF(tmp);
1959 if (status)
1960 goto err;
1961 }
1962 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1963 err:
1964 Py_XDECREF(name_list);
1965 Py_XDECREF(addr_list);
1966 return rtn_tuple;
1967}
1968
1969
1970/* Python interface to gethostbyname_ex(name). */
1971
1972/*ARGSUSED*/
1973static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001974PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001975{
1976 char *name;
1977 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001978 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001979 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00001980 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001981#ifdef HAVE_GETHOSTBYNAME_R
1982 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001983#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1984 struct hostent_data data;
1985#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001986 char buf[16384];
1987 int buf_len = (sizeof buf) - 1;
1988 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001989#endif
1990#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001991 int result;
1992#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001993#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001994
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001995 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001996 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001997 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001998 return NULL;
1999 Py_BEGIN_ALLOW_THREADS
2000#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002001#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002002 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002003#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002004 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002005#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002006 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002007 result = gethostbyname_r(name, &hp_allocated, &data);
2008 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002009#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002010#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002011#ifdef USE_GETHOSTBYNAME_LOCK
2012 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002013#endif
2014 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002015#endif /* HAVE_GETHOSTBYNAME_R */
2016 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002017 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
2018 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
2019 sa = (struct sockaddr*)&addr;
2020 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002021#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002022 PyThread_release_lock(gethostbyname_lock);
2023#endif
2024 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002025}
2026
2027static char ghbn_ex_doc[] =
2028"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2029\n\
2030Return the true host name, a list of aliases, and a list of IP addresses,\n\
2031for a host. The host argument is a string giving a host name or IP number.";
2032
2033
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002034/* Python interface to gethostbyaddr(IP). */
2035
2036/*ARGSUSED*/
2037static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002038PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002039{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002040#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002041 struct sockaddr_storage addr;
2042#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002043 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002044#endif
2045 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002046 char *ip_num;
2047 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002048 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002049#ifdef HAVE_GETHOSTBYNAME_R
2050 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002051#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2052 struct hostent_data data;
2053#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002054 char buf[16384];
2055 int buf_len = (sizeof buf) - 1;
2056 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002057#endif
2058#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002059 int result;
2060#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002061#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002062 char *ap;
2063 int al;
2064 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002065
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002066 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002067 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002068 af = PF_UNSPEC;
2069 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002070 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002071 af = sa->sa_family;
2072 ap = NULL;
2073 al = 0;
2074 switch (af) {
2075 case AF_INET:
2076 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2077 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2078 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002079#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002080 case AF_INET6:
2081 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2082 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2083 break;
2084#endif
2085 default:
2086 PyErr_SetString(PySocket_Error, "unsupported address family");
2087 return NULL;
2088 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002089 Py_BEGIN_ALLOW_THREADS
2090#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002091#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002092 result = gethostbyaddr_r(ap, al, af,
2093 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002094 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002095#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002096 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002097 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002098#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002099 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002100 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002101 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002102#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002103#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002104#ifdef USE_GETHOSTBYNAME_LOCK
2105 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002106#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002107 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002108#endif /* HAVE_GETHOSTBYNAME_R */
2109 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002110 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002111#ifdef USE_GETHOSTBYNAME_LOCK
2112 PyThread_release_lock(gethostbyname_lock);
2113#endif
2114 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002115}
2116
Guido van Rossum82a5c661998-07-07 20:45:43 +00002117static char gethostbyaddr_doc[] =
2118"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2119\n\
2120Return the true host name, a list of aliases, and a list of IP addresses,\n\
2121for a host. The host argument is a string giving a host name or IP number.";
2122
Guido van Rossum30a685f1991-06-27 15:51:29 +00002123
2124/* Python interface to getservbyname(name).
2125 This only returns the port number, since the other info is already
2126 known or not useful (like the list of aliases). */
2127
2128/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002129static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002130PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002131{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002132 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002133 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002134 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002135 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002136 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002137 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002138 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002139 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002140 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002141 return NULL;
2142 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002143 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002144}
2145
Guido van Rossum82a5c661998-07-07 20:45:43 +00002146static char getservbyname_doc[] =
2147"getservbyname(servicename, protocolname) -> integer\n\
2148\n\
2149Return a port number from a service name and protocol name.\n\
2150The protocol name should be 'tcp' or 'udp'.";
2151
Guido van Rossum30a685f1991-06-27 15:51:29 +00002152
Guido van Rossum3901d851996-12-19 16:35:04 +00002153/* Python interface to getprotobyname(name).
2154 This only returns the protocol number, since the other info is
2155 already known or not useful (like the list of aliases). */
2156
2157/*ARGSUSED*/
2158static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002159PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002160{
2161 char *name;
2162 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002163#ifdef __BEOS__
2164/* Not available in BeOS yet. - [cjh] */
2165 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2166 return NULL;
2167#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002168 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002169 return NULL;
2170 Py_BEGIN_ALLOW_THREADS
2171 sp = getprotobyname(name);
2172 Py_END_ALLOW_THREADS
2173 if (sp == NULL) {
2174 PyErr_SetString(PySocket_Error, "protocol not found");
2175 return NULL;
2176 }
2177 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002178#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002179}
2180
Guido van Rossum82a5c661998-07-07 20:45:43 +00002181static char getprotobyname_doc[] =
2182"getprotobyname(name) -> integer\n\
2183\n\
2184Return the protocol number for the named protocol. (Rarely used.)";
2185
Guido van Rossum3901d851996-12-19 16:35:04 +00002186
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002187#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002188/* Create a socket object from a numeric file description.
2189 Useful e.g. if stdin is a socket.
2190 Additional arguments as for socket(). */
2191
2192/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002193static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002194PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002195{
Guido van Rossum73624e91994-10-10 17:59:00 +00002196 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002197 SOCKET_T fd;
2198 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002199 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2200 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002201 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002202 /* Dup the fd so it and the socket can be closed independently */
2203 fd = dup(fd);
2204 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002205 return PySocket_Err();
2206 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002207 /* From now on, ignore SIGPIPE and let the error checking
2208 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002209#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002210 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002211#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002212 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002213}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002214
2215static char fromfd_doc[] =
2216"fromfd(fd, family, type[, proto]) -> socket object\n\
2217\n\
2218Create a socket object from the given file descriptor.\n\
2219The remaining arguments are the same as for socket().";
2220
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002221#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002222
Guido van Rossum82a5c661998-07-07 20:45:43 +00002223
Guido van Rossum006bf911996-06-12 04:04:55 +00002224static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002225PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002226{
2227 int x1, x2;
2228
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002229 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002230 return NULL;
2231 }
2232 x2 = (int)ntohs((short)x1);
2233 return PyInt_FromLong(x2);
2234}
2235
Guido van Rossum82a5c661998-07-07 20:45:43 +00002236static char ntohs_doc[] =
2237"ntohs(integer) -> integer\n\
2238\n\
2239Convert a 16-bit integer from network to host byte order.";
2240
2241
Guido van Rossum006bf911996-06-12 04:04:55 +00002242static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002243PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002244{
2245 int x1, x2;
2246
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002247 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002248 return NULL;
2249 }
2250 x2 = ntohl(x1);
2251 return PyInt_FromLong(x2);
2252}
2253
Guido van Rossum82a5c661998-07-07 20:45:43 +00002254static char ntohl_doc[] =
2255"ntohl(integer) -> integer\n\
2256\n\
2257Convert a 32-bit integer from network to host byte order.";
2258
2259
Guido van Rossum006bf911996-06-12 04:04:55 +00002260static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002261PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002262{
2263 int x1, x2;
2264
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002265 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002266 return NULL;
2267 }
2268 x2 = (int)htons((short)x1);
2269 return PyInt_FromLong(x2);
2270}
2271
Guido van Rossum82a5c661998-07-07 20:45:43 +00002272static char htons_doc[] =
2273"htons(integer) -> integer\n\
2274\n\
2275Convert a 16-bit integer from host to network byte order.";
2276
2277
Guido van Rossum006bf911996-06-12 04:04:55 +00002278static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002279PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002280{
2281 int x1, x2;
2282
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002283 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002284 return NULL;
2285 }
2286 x2 = htonl(x1);
2287 return PyInt_FromLong(x2);
2288}
2289
Guido van Rossum82a5c661998-07-07 20:45:43 +00002290static char htonl_doc[] =
2291"htonl(integer) -> integer\n\
2292\n\
2293Convert a 32-bit integer from host to network byte order.";
2294
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002295/*
2296 * socket.inet_aton() and socket.inet_ntoa() functions
2297 *
2298 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2299 *
2300 */
2301
Guido van Rossum48a680c2001-03-02 06:34:14 +00002302static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002303"inet_aton(string) -> packed 32-bit IP representation\n\
2304\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002305Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002306binary format used in low-level network functions.";
2307
2308static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002309PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002310{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002311#ifndef INADDR_NONE
2312#define INADDR_NONE (-1)
2313#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002314
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002315 /* Have to use inet_addr() instead */
2316 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002317 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002318
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002319 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002320 return NULL;
2321 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002322#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002323 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002324#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002325 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002326#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002327
2328 if (packed_addr == INADDR_NONE) { /* invalid address */
2329 PyErr_SetString(PySocket_Error,
2330 "illegal IP address string passed to inet_aton");
2331 return NULL;
2332 }
2333
2334 return PyString_FromStringAndSize((char *) &packed_addr,
2335 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002336}
2337
Guido van Rossum48a680c2001-03-02 06:34:14 +00002338static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002339"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002340\n\
2341Convert an IP address from 32-bit packed binary format to string format";
2342
2343static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002344PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002345{
2346 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002347 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002348 struct in_addr packed_addr;
2349
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002350 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002351 return NULL;
2352 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002353
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002354 if (addr_len != sizeof(packed_addr)) {
2355 PyErr_SetString(PySocket_Error,
2356 "packed IP wrong length for inet_ntoa");
2357 return NULL;
2358 }
2359
2360 memcpy(&packed_addr, packed_str, addr_len);
2361
2362 return PyString_FromString(inet_ntoa(packed_addr));
2363}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002364
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002365/* Python interface to getaddrinfo(host, port). */
2366
2367/*ARGSUSED*/
2368static PyObject *
2369PySocket_getaddrinfo(PyObject *self, PyObject *args)
2370{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002371 struct addrinfo hints, *res;
2372 struct addrinfo *res0 = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002373 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002374 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002375 char *hptr, *pptr;
2376 int family, socktype, protocol, flags;
2377 int error;
2378 PyObject *all = (PyObject *)NULL;
2379 PyObject *single = (PyObject *)NULL;
2380
2381 family = socktype = protocol = flags = 0;
2382 family = PF_UNSPEC;
2383 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2384 &hptr, &pobj, &family, &socktype,
2385 &protocol, &flags)) {
2386 return NULL;
2387 }
2388 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002389 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002390 pptr = pbuf;
2391 } else if (PyString_Check(pobj)) {
2392 pptr = PyString_AsString(pobj);
2393 } else if (pobj == Py_None) {
2394 pptr = (char *)NULL;
2395 } else {
2396 PyErr_SetString(PySocket_Error, "Int or String expected");
2397 return NULL;
2398 }
2399 memset(&hints, 0, sizeof(hints));
2400 hints.ai_family = family;
2401 hints.ai_socktype = socktype;
2402 hints.ai_protocol = protocol;
2403 hints.ai_flags = flags;
2404 error = getaddrinfo(hptr, pptr, &hints, &res0);
2405 if (error) {
2406 PyGAI_Err(error);
2407 return NULL;
2408 }
2409
2410 if ((all = PyList_New(0)) == NULL)
2411 goto err;
2412 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002413 PyObject *addr =
2414 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2415 if (addr == NULL)
2416 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002417 single = Py_BuildValue("iiisO", res->ai_family,
2418 res->ai_socktype, res->ai_protocol,
2419 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002420 addr);
2421 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002422 if (single == NULL)
2423 goto err;
2424
2425 if (PyList_Append(all, single))
2426 goto err;
2427 Py_XDECREF(single);
2428 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002429 return all;
2430 err:
2431 Py_XDECREF(single);
2432 Py_XDECREF(all);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002433 if (res0)
2434 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002435 return (PyObject *)NULL;
2436}
2437
2438static char getaddrinfo_doc[] =
2439"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2440 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2441\n\
2442Resolve host and port into addrinfo struct.";
2443
2444/* Python interface to getnameinfo(sa, flags). */
2445
2446/*ARGSUSED*/
2447static PyObject *
2448PySocket_getnameinfo(PyObject *self, PyObject *args)
2449{
2450 PyObject *sa = (PyObject *)NULL;
2451 int flags;
2452 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002453 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002454 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2455 struct addrinfo hints, *res = NULL;
2456 int error;
2457 PyObject *ret = (PyObject *)NULL;
2458
2459 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002460 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002461 return NULL;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002462 if (!PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, &scope_id))
2463 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002464 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002465 memset(&hints, 0, sizeof(hints));
2466 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002467 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002468 error = getaddrinfo(hostp, pbuf, &hints, &res);
2469 if (error) {
2470 PyGAI_Err(error);
2471 goto fail;
2472 }
2473 if (res->ai_next) {
2474 PyErr_SetString(PySocket_Error,
2475 "sockaddr resolved to multiple addresses");
2476 goto fail;
2477 }
2478 switch (res->ai_family) {
2479 case AF_INET:
2480 {
2481 char *t1;
2482 int t2;
2483 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2484 PyErr_SetString(PySocket_Error,
2485 "IPv4 sockaddr must be 2 tuple");
2486 goto fail;
2487 }
2488 break;
2489 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002490#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002491 case AF_INET6:
2492 {
2493 struct sockaddr_in6 *sin6;
2494 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2495 sin6->sin6_flowinfo = flowinfo;
2496 sin6->sin6_scope_id = scope_id;
2497 break;
2498 }
2499#endif
2500 }
2501 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2502 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2503 if (error) {
2504 PyGAI_Err(error);
2505 goto fail;
2506 }
2507 ret = Py_BuildValue("ss", hbuf, pbuf);
2508
2509fail:
2510 if (res)
2511 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002512 return ret;
2513}
2514
2515static char getnameinfo_doc[] =
2516"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2517\n\
2518Get host and port for a sockaddr.";
2519
Guido van Rossum30a685f1991-06-27 15:51:29 +00002520/* List of functions exported by this module. */
2521
Guido van Rossum73624e91994-10-10 17:59:00 +00002522static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002523 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002524 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002525 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002526 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002527 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002528 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002529 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002530 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002531 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002532 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002533 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002534 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002535#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002536 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002537 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002538#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002539 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002540 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002541 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002542 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002543 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002544 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002545 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002546 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002547 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002548 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002549 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002550 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002551 {"getaddrinfo", PySocket_getaddrinfo,
2552 METH_VARARGS, getaddrinfo_doc},
2553 {"getnameinfo", PySocket_getnameinfo,
2554 METH_VARARGS, getnameinfo_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00002555 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002556};
2557
Guido van Rossum30a685f1991-06-27 15:51:29 +00002558
2559/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002560 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002561 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002562 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002563static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002564insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002565{
Guido van Rossum73624e91994-10-10 17:59:00 +00002566 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002567 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002568 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002569
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002570 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002571}
2572
Guido van Rossum30a685f1991-06-27 15:51:29 +00002573
Guido van Rossum8d665e61996-06-26 18:22:49 +00002574#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002575
2576/* Additional initialization and cleanup for NT/Windows */
2577
2578static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002579NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002580{
2581 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002582}
2583
2584static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002585NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002586{
2587 WSADATA WSAData;
2588 int ret;
2589 char buf[100];
2590 ret = WSAStartup(0x0101, &WSAData);
2591 switch (ret) {
2592 case 0: /* no error */
2593 atexit(NTcleanup);
2594 return 1;
2595 case WSASYSNOTREADY:
2596 PyErr_SetString(PyExc_ImportError,
2597 "WSAStartup failed: network not ready");
2598 break;
2599 case WSAVERNOTSUPPORTED:
2600 case WSAEINVAL:
2601 PyErr_SetString(PyExc_ImportError,
2602 "WSAStartup failed: requested version not supported");
2603 break;
2604 default:
Tim Peters885d4572001-11-28 20:27:42 +00002605 PyOS_snprintf(buf, sizeof(buf),
2606 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002607 PyErr_SetString(PyExc_ImportError, buf);
2608 break;
2609 }
2610 return 0;
2611}
2612
Guido van Rossum8d665e61996-06-26 18:22:49 +00002613#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002614
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002615#if defined(PYOS_OS2)
2616
2617/* Additional initialization and cleanup for OS/2 */
2618
2619static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002620OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002621{
2622 /* No cleanup is necessary for OS/2 Sockets */
2623}
2624
2625static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002626OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002627{
2628 char reason[64];
2629 int rc = sock_init();
2630
2631 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002632 atexit(OS2cleanup);
2633 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002634 }
2635
Tim Peters75cdad52001-11-28 22:07:30 +00002636 PyOS_snprintf(reason, sizeof(reason),
2637 "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002638 PyErr_SetString(PyExc_ImportError, reason);
2639
Guido van Rossum32c575d1997-12-02 20:37:32 +00002640 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002641}
2642
2643#endif /* PYOS_OS2 */
2644
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002645/* C API table - always add new things to the end for binary
2646 compatibility. */
2647static
2648PySocketModule_APIObject PySocketModuleAPI =
2649{
2650 &PySocketSock_Type,
2651};
2652
Guido van Rossum30a685f1991-06-27 15:51:29 +00002653/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002654 * This is called when the first 'import socket' is done,
2655 * via a table in config.c, if config.c is compiled with USE_SOCKET
2656 * defined.
2657 *
2658 * For MS_WINDOWS (which means any Windows variant), this module
2659 * is actually called "_socket", and there's a wrapper "socket.py"
2660 * which implements some missing functionality (such as makefile(),
2661 * dup() and fromfd()). The import of "_socket" may fail with an
2662 * ImportError exception if initialization of WINSOCK fails. When
2663 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2664 * scheduled to be made at exit time.
2665 *
2666 * For OS/2, this module is also called "_socket" and uses a wrapper
2667 * "socket.py" which implements that functionality that is missing
2668 * when PC operating systems don't put socket descriptors in the
2669 * operating system's filesystem layer.
2670 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002671
Guido van Rossum82a5c661998-07-07 20:45:43 +00002672static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002673"Implementation module for socket operations. See the socket module\n\
2674for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002675
Guido van Rossum3886bb61998-12-04 18:50:17 +00002676DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002677init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002678{
Guido van Rossum73624e91994-10-10 17:59:00 +00002679 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002680#ifdef RISCOS
2681 _kernel_swi_regs r;
2682 r.r[0]=0;
2683 _kernel_swi(0x43380, &r, &r);
2684 taskwindow = r.r[0];
2685#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002686#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002687 if (!NTinit())
2688 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002689#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002690#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002691 if (!OS2init())
2692 return;
Fred Drakea136d492000-08-16 14:18:30 +00002693#endif /* __TOS_OS2__ */
2694#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002695#endif /* RISCOS */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002696 PySocketSock_Type.ob_type = &PyType_Type;
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002697 PySocketSock_Type.tp_getattro = PyObject_GenericGetAttr;
2698 PySocketSock_Type.tp_alloc = PyType_GenericAlloc;
2699 PySocketSock_Type.tp_free = _PyObject_Del;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002700 m = Py_InitModule3(PySocket_MODULE_NAME,
2701 PySocket_methods,
2702 module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00002703 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002704 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2705 if (PySocket_Error == NULL)
2706 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002707 PyDict_SetItemString(d, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002708 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
2709 if (PyH_Error == NULL)
2710 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002711 PyDict_SetItemString(d, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002712 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
2713 NULL);
2714 if (PyGAI_Error == NULL)
2715 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002716 PyDict_SetItemString(d, "gaierror", PyGAI_Error);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002717 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002718 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002719 return;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002720 if (PyDict_SetItemString(d, "socket",
2721 (PyObject *)&PySocketSock_Type) != 0)
2722 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002723
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002724 /* Export C API */
2725 if (PyDict_SetItemString(d, PySocket_CAPI_NAME,
2726 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
2727 ) != 0)
2728 return;
2729
Guido van Rossum09be4091999-08-09 14:40:40 +00002730 /* Address families (we only support AF_INET and AF_UNIX) */
2731#ifdef AF_UNSPEC
2732 insint(d, "AF_UNSPEC", AF_UNSPEC);
2733#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002734 insint(d, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002735#ifdef AF_INET6
2736 insint(d, "AF_INET6", AF_INET6);
2737#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002738#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002739 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002740#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002741#ifdef AF_AX25
2742 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2743#endif
2744#ifdef AF_IPX
2745 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2746#endif
2747#ifdef AF_APPLETALK
2748 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2749#endif
2750#ifdef AF_NETROM
2751 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2752#endif
2753#ifdef AF_BRIDGE
2754 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2755#endif
2756#ifdef AF_AAL5
2757 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2758#endif
2759#ifdef AF_X25
2760 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2761#endif
2762#ifdef AF_INET6
2763 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2764#endif
2765#ifdef AF_ROSE
2766 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2767#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002768#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00002769 insint(d, "AF_PACKET", AF_PACKET);
2770 insint(d, "PF_PACKET", PF_PACKET);
2771 insint(d, "PACKET_HOST", PACKET_HOST);
2772 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
2773 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
2774 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
2775 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
2776 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
2777 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002778#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002779
2780 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002781 insint(d, "SOCK_STREAM", SOCK_STREAM);
2782 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002783#ifndef __BEOS__
2784/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002785 insint(d, "SOCK_RAW", SOCK_RAW);
2786 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2787 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002788#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002789
2790#ifdef SO_DEBUG
2791 insint(d, "SO_DEBUG", SO_DEBUG);
2792#endif
2793#ifdef SO_ACCEPTCONN
2794 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2795#endif
2796#ifdef SO_REUSEADDR
2797 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2798#endif
2799#ifdef SO_KEEPALIVE
2800 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2801#endif
2802#ifdef SO_DONTROUTE
2803 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2804#endif
2805#ifdef SO_BROADCAST
2806 insint(d, "SO_BROADCAST", SO_BROADCAST);
2807#endif
2808#ifdef SO_USELOOPBACK
2809 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2810#endif
2811#ifdef SO_LINGER
2812 insint(d, "SO_LINGER", SO_LINGER);
2813#endif
2814#ifdef SO_OOBINLINE
2815 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2816#endif
2817#ifdef SO_REUSEPORT
2818 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2819#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002820#ifdef SO_SNDBUF
2821 insint(d, "SO_SNDBUF", SO_SNDBUF);
2822#endif
2823#ifdef SO_RCVBUF
2824 insint(d, "SO_RCVBUF", SO_RCVBUF);
2825#endif
2826#ifdef SO_SNDLOWAT
2827 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2828#endif
2829#ifdef SO_RCVLOWAT
2830 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2831#endif
2832#ifdef SO_SNDTIMEO
2833 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2834#endif
2835#ifdef SO_RCVTIMEO
2836 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2837#endif
2838#ifdef SO_ERROR
2839 insint(d, "SO_ERROR", SO_ERROR);
2840#endif
2841#ifdef SO_TYPE
2842 insint(d, "SO_TYPE", SO_TYPE);
2843#endif
2844
2845 /* Maximum number of connections for "listen" */
2846#ifdef SOMAXCONN
2847 insint(d, "SOMAXCONN", SOMAXCONN);
2848#else
2849 insint(d, "SOMAXCONN", 5); /* Common value */
2850#endif
2851
2852 /* Flags for send, recv */
2853#ifdef MSG_OOB
2854 insint(d, "MSG_OOB", MSG_OOB);
2855#endif
2856#ifdef MSG_PEEK
2857 insint(d, "MSG_PEEK", MSG_PEEK);
2858#endif
2859#ifdef MSG_DONTROUTE
2860 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2861#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002862#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00002863 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002864#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002865#ifdef MSG_EOR
2866 insint(d, "MSG_EOR", MSG_EOR);
2867#endif
2868#ifdef MSG_TRUNC
2869 insint(d, "MSG_TRUNC", MSG_TRUNC);
2870#endif
2871#ifdef MSG_CTRUNC
2872 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2873#endif
2874#ifdef MSG_WAITALL
2875 insint(d, "MSG_WAITALL", MSG_WAITALL);
2876#endif
2877#ifdef MSG_BTAG
2878 insint(d, "MSG_BTAG", MSG_BTAG);
2879#endif
2880#ifdef MSG_ETAG
2881 insint(d, "MSG_ETAG", MSG_ETAG);
2882#endif
2883
2884 /* Protocol level and numbers, usable for [gs]etsockopt */
2885#ifdef SOL_SOCKET
2886 insint(d, "SOL_SOCKET", SOL_SOCKET);
2887#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002888#ifdef SOL_IP
2889 insint(d, "SOL_IP", SOL_IP);
2890#else
2891 insint(d, "SOL_IP", 0);
2892#endif
2893#ifdef SOL_IPX
2894 insint(d, "SOL_IPX", SOL_IPX);
2895#endif
2896#ifdef SOL_AX25
2897 insint(d, "SOL_AX25", SOL_AX25);
2898#endif
2899#ifdef SOL_ATALK
2900 insint(d, "SOL_ATALK", SOL_ATALK);
2901#endif
2902#ifdef SOL_NETROM
2903 insint(d, "SOL_NETROM", SOL_NETROM);
2904#endif
2905#ifdef SOL_ROSE
2906 insint(d, "SOL_ROSE", SOL_ROSE);
2907#endif
2908#ifdef SOL_TCP
2909 insint(d, "SOL_TCP", SOL_TCP);
2910#else
2911 insint(d, "SOL_TCP", 6);
2912#endif
2913#ifdef SOL_UDP
2914 insint(d, "SOL_UDP", SOL_UDP);
2915#else
2916 insint(d, "SOL_UDP", 17);
2917#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002918#ifdef IPPROTO_IP
2919 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002920#else
2921 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002922#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002923#ifdef IPPROTO_HOPOPTS
2924 insint(d, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
2925#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002926#ifdef IPPROTO_ICMP
2927 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002928#else
2929 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002930#endif
2931#ifdef IPPROTO_IGMP
2932 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2933#endif
2934#ifdef IPPROTO_GGP
2935 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2936#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002937#ifdef IPPROTO_IPV4
2938 insint(d, "IPPROTO_IPV4", IPPROTO_IPV4);
2939#endif
2940#ifdef IPPROTO_IPIP
2941 insint(d, "IPPROTO_IPIP", IPPROTO_IPIP);
2942#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002943#ifdef IPPROTO_TCP
2944 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002945#else
2946 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002947#endif
2948#ifdef IPPROTO_EGP
2949 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2950#endif
2951#ifdef IPPROTO_PUP
2952 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2953#endif
2954#ifdef IPPROTO_UDP
2955 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002956#else
2957 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002958#endif
2959#ifdef IPPROTO_IDP
2960 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2961#endif
2962#ifdef IPPROTO_HELLO
2963 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2964#endif
2965#ifdef IPPROTO_ND
2966 insint(d, "IPPROTO_ND", IPPROTO_ND);
2967#endif
2968#ifdef IPPROTO_TP
2969 insint(d, "IPPROTO_TP", IPPROTO_TP);
2970#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002971#ifdef IPPROTO_IPV6
2972 insint(d, "IPPROTO_IPV6", IPPROTO_IPV6);
2973#endif
2974#ifdef IPPROTO_ROUTING
2975 insint(d, "IPPROTO_ROUTING", IPPROTO_ROUTING);
2976#endif
2977#ifdef IPPROTO_FRAGMENT
2978 insint(d, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
2979#endif
2980#ifdef IPPROTO_RSVP
2981 insint(d, "IPPROTO_RSVP", IPPROTO_RSVP);
2982#endif
2983#ifdef IPPROTO_GRE
2984 insint(d, "IPPROTO_GRE", IPPROTO_GRE);
2985#endif
2986#ifdef IPPROTO_ESP
2987 insint(d, "IPPROTO_ESP", IPPROTO_ESP);
2988#endif
2989#ifdef IPPROTO_AH
2990 insint(d, "IPPROTO_AH", IPPROTO_AH);
2991#endif
2992#ifdef IPPROTO_MOBILE
2993 insint(d, "IPPROTO_MOBILE", IPPROTO_MOBILE);
2994#endif
2995#ifdef IPPROTO_ICMPV6
2996 insint(d, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
2997#endif
2998#ifdef IPPROTO_NONE
2999 insint(d, "IPPROTO_NONE", IPPROTO_NONE);
3000#endif
3001#ifdef IPPROTO_DSTOPTS
3002 insint(d, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
3003#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003004#ifdef IPPROTO_XTP
3005 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
3006#endif
3007#ifdef IPPROTO_EON
3008 insint(d, "IPPROTO_EON", IPPROTO_EON);
3009#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003010#ifdef IPPROTO_PIM
3011 insint(d, "IPPROTO_PIM", IPPROTO_PIM);
3012#endif
3013#ifdef IPPROTO_IPCOMP
3014 insint(d, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
3015#endif
3016#ifdef IPPROTO_VRRP
3017 insint(d, "IPPROTO_VRRP", IPPROTO_VRRP);
3018#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003019#ifdef IPPROTO_BIP
3020 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
3021#endif
3022/**/
3023#ifdef IPPROTO_RAW
3024 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003025#else
3026 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003027#endif
3028#ifdef IPPROTO_MAX
3029 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
3030#endif
3031
3032 /* Some port configuration */
3033#ifdef IPPORT_RESERVED
3034 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
3035#else
3036 insint(d, "IPPORT_RESERVED", 1024);
3037#endif
3038#ifdef IPPORT_USERRESERVED
3039 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
3040#else
3041 insint(d, "IPPORT_USERRESERVED", 5000);
3042#endif
3043
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003044 /* Some reserved IP v.4 addresses */
3045#ifdef INADDR_ANY
3046 insint(d, "INADDR_ANY", INADDR_ANY);
3047#else
3048 insint(d, "INADDR_ANY", 0x00000000);
3049#endif
3050#ifdef INADDR_BROADCAST
3051 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
3052#else
3053 insint(d, "INADDR_BROADCAST", 0xffffffff);
3054#endif
3055#ifdef INADDR_LOOPBACK
3056 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
3057#else
3058 insint(d, "INADDR_LOOPBACK", 0x7F000001);
3059#endif
3060#ifdef INADDR_UNSPEC_GROUP
3061 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
3062#else
3063 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
3064#endif
3065#ifdef INADDR_ALLHOSTS_GROUP
3066 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
3067#else
3068 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
3069#endif
3070#ifdef INADDR_MAX_LOCAL_GROUP
3071 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
3072#else
3073 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
3074#endif
3075#ifdef INADDR_NONE
3076 insint(d, "INADDR_NONE", INADDR_NONE);
3077#else
3078 insint(d, "INADDR_NONE", 0xffffffff);
3079#endif
3080
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003081 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003082#ifdef IP_OPTIONS
3083 insint(d, "IP_OPTIONS", IP_OPTIONS);
3084#endif
3085#ifdef IP_HDRINCL
3086 insint(d, "IP_HDRINCL", IP_HDRINCL);
3087#endif
3088#ifdef IP_TOS
3089 insint(d, "IP_TOS", IP_TOS);
3090#endif
3091#ifdef IP_TTL
3092 insint(d, "IP_TTL", IP_TTL);
3093#endif
3094#ifdef IP_RECVOPTS
3095 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
3096#endif
3097#ifdef IP_RECVRETOPTS
3098 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
3099#endif
3100#ifdef IP_RECVDSTADDR
3101 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
3102#endif
3103#ifdef IP_RETOPTS
3104 insint(d, "IP_RETOPTS", IP_RETOPTS);
3105#endif
3106#ifdef IP_MULTICAST_IF
3107 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
3108#endif
3109#ifdef IP_MULTICAST_TTL
3110 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
3111#endif
3112#ifdef IP_MULTICAST_LOOP
3113 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
3114#endif
3115#ifdef IP_ADD_MEMBERSHIP
3116 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
3117#endif
3118#ifdef IP_DROP_MEMBERSHIP
3119 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
3120#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003121#ifdef IP_DEFAULT_MULTICAST_TTL
3122 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
3123#endif
3124#ifdef IP_DEFAULT_MULTICAST_LOOP
3125 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
3126#endif
3127#ifdef IP_MAX_MEMBERSHIPS
3128 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
3129#endif
3130
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003131 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3132#ifdef IPV6_JOIN_GROUP
3133 insint(d, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
3134#endif
3135#ifdef IPV6_LEAVE_GROUP
3136 insint(d, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
3137#endif
3138#ifdef IPV6_MULTICAST_HOPS
3139 insint(d, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
3140#endif
3141#ifdef IPV6_MULTICAST_IF
3142 insint(d, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
3143#endif
3144#ifdef IPV6_MULTICAST_LOOP
3145 insint(d, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
3146#endif
3147#ifdef IPV6_UNICAST_HOPS
3148 insint(d, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
3149#endif
3150
Guido van Rossum09be4091999-08-09 14:40:40 +00003151 /* TCP options */
3152#ifdef TCP_NODELAY
3153 insint(d, "TCP_NODELAY", TCP_NODELAY);
3154#endif
3155#ifdef TCP_MAXSEG
3156 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
3157#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003158#ifdef TCP_CORK
3159 insint(d, "TCP_CORK", TCP_CORK);
3160#endif
3161#ifdef TCP_KEEPIDLE
3162 insint(d, "TCP_KEEPIDLE", TCP_KEEPIDLE);
3163#endif
3164#ifdef TCP_KEEPINTVL
3165 insint(d, "TCP_KEEPINTVL", TCP_KEEPINTVL);
3166#endif
3167#ifdef TCP_KEEPCNT
3168 insint(d, "TCP_KEEPCNT", TCP_KEEPCNT);
3169#endif
3170#ifdef TCP_SYNCNT
3171 insint(d, "TCP_SYNCNT", TCP_SYNCNT);
3172#endif
3173#ifdef TCP_LINGER2
3174 insint(d, "TCP_LINGER2", TCP_LINGER2);
3175#endif
3176#ifdef TCP_DEFER_ACCEPT
3177 insint(d, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
3178#endif
3179#ifdef TCP_WINDOW_CLAMP
3180 insint(d, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
3181#endif
3182#ifdef TCP_INFO
3183 insint(d, "TCP_INFO", TCP_INFO);
3184#endif
3185#ifdef TCP_QUICKACK
3186 insint(d, "TCP_QUICKACK", TCP_QUICKACK);
3187#endif
3188
Guido van Rossum09be4091999-08-09 14:40:40 +00003189
3190 /* IPX options */
3191#ifdef IPX_TYPE
3192 insint(d, "IPX_TYPE", IPX_TYPE);
3193#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003194
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003195 /* get{addr,name}info parameters */
3196#ifdef EAI_ADDRFAMILY
3197 insint(d, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
3198#endif
3199#ifdef EAI_AGAIN
3200 insint(d, "EAI_AGAIN", EAI_AGAIN);
3201#endif
3202#ifdef EAI_BADFLAGS
3203 insint(d, "EAI_BADFLAGS", EAI_BADFLAGS);
3204#endif
3205#ifdef EAI_FAIL
3206 insint(d, "EAI_FAIL", EAI_FAIL);
3207#endif
3208#ifdef EAI_FAMILY
3209 insint(d, "EAI_FAMILY", EAI_FAMILY);
3210#endif
3211#ifdef EAI_MEMORY
3212 insint(d, "EAI_MEMORY", EAI_MEMORY);
3213#endif
3214#ifdef EAI_NODATA
3215 insint(d, "EAI_NODATA", EAI_NODATA);
3216#endif
3217#ifdef EAI_NONAME
3218 insint(d, "EAI_NONAME", EAI_NONAME);
3219#endif
3220#ifdef EAI_SERVICE
3221 insint(d, "EAI_SERVICE", EAI_SERVICE);
3222#endif
3223#ifdef EAI_SOCKTYPE
3224 insint(d, "EAI_SOCKTYPE", EAI_SOCKTYPE);
3225#endif
3226#ifdef EAI_SYSTEM
3227 insint(d, "EAI_SYSTEM", EAI_SYSTEM);
3228#endif
3229#ifdef EAI_BADHINTS
3230 insint(d, "EAI_BADHINTS", EAI_BADHINTS);
3231#endif
3232#ifdef EAI_PROTOCOL
3233 insint(d, "EAI_PROTOCOL", EAI_PROTOCOL);
3234#endif
3235#ifdef EAI_MAX
3236 insint(d, "EAI_MAX", EAI_MAX);
3237#endif
3238#ifdef AI_PASSIVE
3239 insint(d, "AI_PASSIVE", AI_PASSIVE);
3240#endif
3241#ifdef AI_CANONNAME
3242 insint(d, "AI_CANONNAME", AI_CANONNAME);
3243#endif
3244#ifdef AI_NUMERICHOST
3245 insint(d, "AI_NUMERICHOST", AI_NUMERICHOST);
3246#endif
3247#ifdef AI_MASK
3248 insint(d, "AI_MASK", AI_MASK);
3249#endif
3250#ifdef AI_ALL
3251 insint(d, "AI_ALL", AI_ALL);
3252#endif
3253#ifdef AI_V4MAPPED_CFG
3254 insint(d, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
3255#endif
3256#ifdef AI_ADDRCONFIG
3257 insint(d, "AI_ADDRCONFIG", AI_ADDRCONFIG);
3258#endif
3259#ifdef AI_V4MAPPED
3260 insint(d, "AI_V4MAPPED", AI_V4MAPPED);
3261#endif
3262#ifdef AI_DEFAULT
3263 insint(d, "AI_DEFAULT", AI_DEFAULT);
3264#endif
3265#ifdef NI_MAXHOST
3266 insint(d, "NI_MAXHOST", NI_MAXHOST);
3267#endif
3268#ifdef NI_MAXSERV
3269 insint(d, "NI_MAXSERV", NI_MAXSERV);
3270#endif
3271#ifdef NI_NOFQDN
3272 insint(d, "NI_NOFQDN", NI_NOFQDN);
3273#endif
3274#ifdef NI_NUMERICHOST
3275 insint(d, "NI_NUMERICHOST", NI_NUMERICHOST);
3276#endif
3277#ifdef NI_NAMEREQD
3278 insint(d, "NI_NAMEREQD", NI_NAMEREQD);
3279#endif
3280#ifdef NI_NUMERICSERV
3281 insint(d, "NI_NUMERICSERV", NI_NUMERICSERV);
3282#endif
3283#ifdef NI_DGRAM
3284 insint(d, "NI_DGRAM", NI_DGRAM);
3285#endif
3286
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003287 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003288#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003289 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003290#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003291}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003292
3293/* Simplistic emulation code for inet_pton that only works for IPv4 */
3294#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003295int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003296inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003297{
3298 if(af == AF_INET){
3299 long packed_addr;
3300#ifdef USE_GUSI1
3301 packed_addr = (long)inet_addr(src).s_addr;
3302#else
3303 packed_addr = inet_addr(src);
3304#endif
3305 if (packed_addr == INADDR_NONE)
3306 return 0;
3307 memcpy(dst, &packed_addr, 4);
3308 return 1;
3309 }
3310 /* Should set errno to EAFNOSUPPORT */
3311 return -1;
3312}
3313
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003314const char *
3315inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003316{
3317 if (af == AF_INET) {
3318 struct in_addr packed_addr;
3319 if (size < 16)
3320 /* Should set errno to ENOSPC. */
3321 return NULL;
3322 memcpy(&packed_addr, src, sizeof(packed_addr));
3323 return strncpy(dst, inet_ntoa(packed_addr), size);
3324 }
3325 /* Should set errno to EAFNOSUPPORT */
3326 return NULL;
3327}
3328#endif