blob: 56378acf692bde3b284efe1bb0efee720fce9642 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum6574b3e1991-06-25 21:36:08 +00009******************************************************************/
10
11/* Socket module */
12
Guido van Rossum09c8b6c1999-12-07 21:37:17 +000013/* SSL support based on patches by Brian E Gallew and Laszlo Kovacs */
14
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015/*
16This module provides an interface to Berkeley socket IPC.
17
18Limitations:
19
Guido van Rossum30a685f1991-06-27 15:51:29 +000020- only AF_INET and AF_UNIX address families are supported
Guido van Rossum81194471991-07-27 21:42:02 +000021- no read/write operations (use send/recv or makefile instead)
Guido van Rossumbe32c891996-06-20 16:25:29 +000022- additional restrictions apply on Windows
Guido van Rossum6574b3e1991-06-25 21:36:08 +000023
Guido van Rossum27e177d1995-03-16 15:43:47 +000024Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000025
Guido van Rossum27e177d1995-03-16 15:43:47 +000026- socket.error: exception raised for socket specific errors
Guido van Rossum30a685f1991-06-27 15:51:29 +000027- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000028- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000029- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000030- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000031- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000032- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000033- socket.ntohs(16 bit value) --> new int object
34- socket.ntohl(32 bit value) --> new int object
35- socket.htons(16 bit value) --> new int object
36- socket.htonl(32 bit value) --> new int object
Guido van Rossum27e177d1995-03-16 15:43:47 +000037- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +000038- socket.inet_aton(IP address) -> 32-bit packed IP representation
39- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum09c8b6c1999-12-07 21:37:17 +000040- socket.ssl(socket, keyfile, certfile) -> new ssl object
Guido van Rossum6574b3e1991-06-25 21:36:08 +000041- an Internet socket address is a pair (hostname, port)
42 where hostname can be anything recognized by gethostbyname()
43 (including the dd.dd.dd.dd notation) and port is in host byte order
44- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000045- a UNIX domain socket address is a string specifying the pathname
Guido van Rossum6574b3e1991-06-25 21:36:08 +000046
Guido van Rossum30a685f1991-06-27 15:51:29 +000047Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048
Guido van Rossum81194471991-07-27 21:42:02 +000049- s.accept() --> new socket object, sockaddr
Fred Drake728819a2000-07-01 03:40:12 +000050- s.bind(sockaddr) --> None
Guido van Rossum27e177d1995-03-16 15:43:47 +000051- s.close() --> None
Fred Drake728819a2000-07-01 03:40:12 +000052- s.connect(sockaddr) --> None
53- s.connect_ex(sockaddr) --> 0 or errno (handy for e.g. async connect)
Guido van Rossum27e177d1995-03-16 15:43:47 +000054- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000055- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000056- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000057- s.getsockname() --> sockaddr
58- s.getsockopt(level, optname[, buflen]) --> int or string
59- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000060- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000061- s.recv(buflen [,flags]) --> string
62- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000063- s.send(string [,flags]) --> nbytes
64- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000065- s.setblocking(0 | 1) --> None
66- s.setsockopt(level, optname, value) --> None
67- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000068- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000069
Guido van Rossum6574b3e1991-06-25 21:36:08 +000070*/
71
Guido van Rossum73624e91994-10-10 17:59:00 +000072#include "Python.h"
Guido van Rossum3baaa131999-03-22 21:44:51 +000073
Guido van Rossum9376b741999-09-15 22:01:40 +000074/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
75 script doesn't get this right, so we hardcode some platform checks below.
76 On the other hand, not all Linux versions agree, so there the settings
77 computed by the configure script are needed! */
78
79#ifndef linux
Guido van Rossume7de2061999-03-24 17:24:33 +000080#undef HAVE_GETHOSTBYNAME_R_3_ARG
81#undef HAVE_GETHOSTBYNAME_R_5_ARG
82#undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +000083#endif
Guido van Rossume7de2061999-03-24 17:24:33 +000084
Guido van Rossum7a122991999-04-13 04:07:32 +000085#ifndef WITH_THREAD
86#undef HAVE_GETHOSTBYNAME_R
87#endif
88
Guido van Rossume7de2061999-03-24 17:24:33 +000089#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +000090#if defined(_AIX) || defined(__osf__)
Guido van Rossume7de2061999-03-24 17:24:33 +000091#define HAVE_GETHOSTBYNAME_R_3_ARG
92#elif defined(__sun__) || defined(__sgi)
93#define HAVE_GETHOSTBYNAME_R_5_ARG
94#elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +000095/* Rely on the configure script */
Guido van Rossume7de2061999-03-24 17:24:33 +000096#else
97#undef HAVE_GETHOSTBYNAME_R
98#endif
99#endif
100
Guido van Rossum3baaa131999-03-22 21:44:51 +0000101#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
102#define USE_GETHOSTBYNAME_LOCK
103#endif
104
105#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum49b56061998-10-01 20:42:43 +0000106#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000107#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000108
Guido van Rossuma376cc51996-12-05 23:43:35 +0000109#ifdef HAVE_UNISTD_H
110#include <unistd.h>
111#endif
112
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000113#if defined(PYCC_VACPP)
114#include <types.h>
115#include <io.h>
116#include <sys/ioctl.h>
117#include <utils.h>
118#include <ctype.h>
119#endif
120
121#if defined(PYOS_OS2)
122#define INCL_DOS
123#define INCL_DOSERRORS
124#define INCL_NOPMAPI
125#include <os2.h>
126#endif
127
Guido van Rossumb6775db1994-08-01 11:34:53 +0000128#include <sys/types.h>
Guido van Rossumed233a51992-06-23 09:07:03 +0000129
Guido van Rossum81194471991-07-27 21:42:02 +0000130#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000131#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000132#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000133#include <sys/socket.h>
134#include <netinet/in.h>
Fred Drake11b09362000-05-16 13:30:12 +0000135#ifndef __BEOS__
Andrew M. Kuchling52a644c2000-03-31 17:24:30 +0000136#include <netinet/tcp.h>
Fred Drake11b09362000-05-16 13:30:12 +0000137#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000138
Guido van Rossum9376b741999-09-15 22:01:40 +0000139/* Headers needed for inet_ntoa() and inet_addr() */
140#ifdef __BEOS__
141#include <net/netdb.h>
142#else
Guido van Rossumff3ab422000-04-24 15:16:03 +0000143#ifndef USE_GUSI1
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000144#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000145#endif
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000146#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000147
Guido van Rossume4485b01994-09-07 14:32:49 +0000148#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000149#else
150#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000151#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000152#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000153#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000154#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000155#else
156#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000157#endif
158
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000159#ifndef O_NDELAY
160#define O_NDELAY O_NONBLOCK /* For QNX only? */
161#endif
162
Guido van Rossumff3ab422000-04-24 15:16:03 +0000163#ifdef USE_GUSI1
Jack Jansen508537b1996-02-14 15:57:45 +0000164/* fdopen() isn't declared in stdio.h (sigh) */
165#include <GUSI.h>
166#endif
167
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000168#ifdef USE_SSL
169#include "rsa.h"
170#include "crypto.h"
171#include "x509.h"
172#include "pem.h"
173#include "ssl.h"
174#include "err.h"
175#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000176
Guido van Rossumbcc20741998-08-04 22:53:56 +0000177#if defined(MS_WINDOWS) || defined(__BEOS__)
178/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000179/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000180#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000181#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000182#endif
183
Fred Drakea04eaad2000-06-30 02:46:07 +0000184/* abstract the socket file descriptor type */
185#ifdef MS_WINDOWS
186typedef SOCKET SOCKET_T;
187# ifdef MS_WIN64
188# define SIZEOF_SOCKET_T 8
189# else
190# define SIZEOF_SOCKET_T 4
191# endif
192#else
193typedef int SOCKET_T;
194# define SIZEOF_SOCKET_T SIZEOF_INT
195#endif
196
197
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000198#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000199#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000200#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000201#endif
202
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000203#ifndef SOCKETCLOSE
204#define SOCKETCLOSE close
205#endif
206
Guido van Rossum30a685f1991-06-27 15:51:29 +0000207/* Global variable holding the exception type for errors detected
208 by this module (but not argument type or memory errors, etc.). */
209
Guido van Rossum73624e91994-10-10 17:59:00 +0000210static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000211
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000212#ifdef USE_SSL
213static PyObject *SSLErrorObject;
214#endif /* USE_SSL */
215
Guido van Rossum30a685f1991-06-27 15:51:29 +0000216
217/* Convenience function to raise an error according to errno
218 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000219
Guido van Rossum73624e91994-10-10 17:59:00 +0000220static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000221PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000222{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000223#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000224 int err_no = WSAGetLastError();
225 if (err_no) {
226 static struct { int no; const char *msg; } *msgp, msgs[] = {
227 { WSAEINTR, "Interrupted system call" },
228 { WSAEBADF, "Bad file descriptor" },
229 { WSAEACCES, "Permission denied" },
230 { WSAEFAULT, "Bad address" },
231 { WSAEINVAL, "Invalid argument" },
232 { WSAEMFILE, "Too many open files" },
233 { WSAEWOULDBLOCK,
234 "The socket operation could not complete "
235 "without blocking" },
236 { WSAEINPROGRESS, "Operation now in progress" },
237 { WSAEALREADY, "Operation already in progress" },
238 { WSAENOTSOCK, "Socket operation on non-socket" },
239 { WSAEDESTADDRREQ, "Destination address required" },
240 { WSAEMSGSIZE, "Message too long" },
241 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
242 { WSAENOPROTOOPT, "Protocol not available" },
243 { WSAEPROTONOSUPPORT, "Protocol not supported" },
244 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
245 { WSAEOPNOTSUPP, "Operation not supported" },
246 { WSAEPFNOSUPPORT, "Protocol family not supported" },
247 { WSAEAFNOSUPPORT, "Address family not supported" },
248 { WSAEADDRINUSE, "Address already in use" },
249 { WSAEADDRNOTAVAIL,
250 "Can't assign requested address" },
251 { WSAENETDOWN, "Network is down" },
252 { WSAENETUNREACH, "Network is unreachable" },
253 { WSAENETRESET,
254 "Network dropped connection on reset" },
255 { WSAECONNABORTED,
256 "Software caused connection abort" },
257 { WSAECONNRESET, "Connection reset by peer" },
258 { WSAENOBUFS, "No buffer space available" },
259 { WSAEISCONN, "Socket is already connected" },
260 { WSAENOTCONN, "Socket is not connected" },
261 { WSAESHUTDOWN, "Can't send after socket shutdown" },
262 { WSAETOOMANYREFS,
263 "Too many references: can't splice" },
264 { WSAETIMEDOUT, "Operation timed out" },
265 { WSAECONNREFUSED, "Connection refused" },
266 { WSAELOOP, "Too many levels of symbolic links" },
267 { WSAENAMETOOLONG, "File name too long" },
268 { WSAEHOSTDOWN, "Host is down" },
269 { WSAEHOSTUNREACH, "No route to host" },
270 { WSAENOTEMPTY, "Directory not empty" },
271 { WSAEPROCLIM, "Too many processes" },
272 { WSAEUSERS, "Too many users" },
273 { WSAEDQUOT, "Disc quota exceeded" },
274 { WSAESTALE, "Stale NFS file handle" },
275 { WSAEREMOTE, "Too many levels of remote in path" },
276 { WSASYSNOTREADY,
277 "Network subsystem is unvailable" },
278 { WSAVERNOTSUPPORTED,
279 "WinSock version is not supported" },
280 { WSANOTINITIALISED,
281 "Successful WSAStartup() not yet performed" },
282 { WSAEDISCON, "Graceful shutdown in progress" },
283 /* Resolver errors */
284 { WSAHOST_NOT_FOUND, "No such host is known" },
285 { WSATRY_AGAIN, "Host not found, or server failed" },
286 { WSANO_RECOVERY,
287 "Unexpected server error encountered" },
288 { WSANO_DATA, "Valid name without requested data" },
289 { WSANO_ADDRESS, "No address, look for MX record" },
290 { 0, NULL }
291 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000292 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000293 const char *msg = "winsock error";
294
295 for (msgp = msgs; msgp->msg; msgp++) {
296 if (err_no == msgp->no) {
297 msg = msgp->msg;
298 break;
299 }
300 }
301
302 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000303 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000304 PyErr_SetObject(PySocket_Error, v);
305 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000306 }
307 return NULL;
308 }
309 else
310#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000311
312#if defined(PYOS_OS2)
313 if (sock_errno() != NO_ERROR) {
314 APIRET rc;
315 ULONG msglen;
316 char outbuf[100];
317 int myerrorcode = sock_errno();
318
319 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
320 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
321 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
322 if (rc == NO_ERROR) {
323 PyObject *v;
324
325 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
326 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
327 char *lastc = &outbuf[ strlen(outbuf)-1 ];
328 while (lastc > outbuf && isspace(*lastc))
329 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
330 }
331 v = Py_BuildValue("(is)", myerrorcode, outbuf);
332 if (v != NULL) {
333 PyErr_SetObject(PySocket_Error, v);
334 Py_DECREF(v);
335 }
336 return NULL;
337 }
338 }
339#endif
340
Guido van Rossum73624e91994-10-10 17:59:00 +0000341 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000342}
343
Guido van Rossum30a685f1991-06-27 15:51:29 +0000344
345/* The object holding a socket. It holds some extra information,
346 like the address family, which is used to decode socket address
347 arguments properly. */
348
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000349typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000350 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000351 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000352 int sock_family; /* Address family, e.g., AF_INET */
353 int sock_type; /* Socket type, e.g., SOCK_STREAM */
354 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000355 union sock_addr {
356 struct sockaddr_in in;
357#ifdef AF_UNIX
358 struct sockaddr_un un;
359#endif
360 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000361} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000362
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000363#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000364
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000365typedef struct {
366 PyObject_HEAD
367 PySocketSockObject *Socket; /* Socket on which we're layered */
368 PyObject *x_attr; /* Attributes dictionary */
369 SSL_CTX* ctx;
370 SSL* ssl;
371 X509* server_cert;
372 BIO* sbio;
373 char server[256];
374 char issuer[256];
375
376} SSLObject;
377
378staticforward PyTypeObject SSL_Type;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000379staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
380staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
381
382#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
383
384#endif /* USE_SSL */
385
Guido van Rossum30a685f1991-06-27 15:51:29 +0000386/* A forward reference to the Socktype type object.
387 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000388 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000389 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000390
Guido van Rossum73624e91994-10-10 17:59:00 +0000391staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000392
Guido van Rossum30a685f1991-06-27 15:51:29 +0000393
394/* Create a new socket object.
395 This just creates the object and initializes it.
396 If the creation fails, return NULL and set an exception (implicit
397 in NEWOBJ()). */
398
Guido van Rossum73624e91994-10-10 17:59:00 +0000399static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000400PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000401{
Guido van Rossum73624e91994-10-10 17:59:00 +0000402 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000403 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000404 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000405 if (s != NULL) {
406 s->sock_fd = fd;
407 s->sock_family = family;
408 s->sock_type = type;
409 s->sock_proto = proto;
410 }
411 return s;
412}
413
Guido van Rossum30a685f1991-06-27 15:51:29 +0000414
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000415/* Lock to allow python interpreter to continue, but only allow one
416 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000417#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000418PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000419#endif
420
421
Guido van Rossum30a685f1991-06-27 15:51:29 +0000422/* Convert a string specifying a host name or one of a few symbolic
423 names to a numeric IP address. This usually calls gethostbyname()
424 to do the work; the names "" and "<broadcast>" are special.
425 Return the length (should always be 4 bytes), or negative if
426 an error occurred; then an exception is raised. */
427
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000428static int
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000429setipaddr(char* name, struct sockaddr_in * addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000430{
431 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000432 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000433 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000434 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000435#ifdef HAVE_GETHOSTBYNAME_R
436 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000437#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
438 struct hostent_data data;
439#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000440 char buf[1001];
441 int buf_len = (sizeof buf) - 1;
442 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000443#endif
444#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000445 int result;
446#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000447#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000448
Guido van Rossuma376cc51996-12-05 23:43:35 +0000449 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000450 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000451 addr_ret->sin_addr.s_addr = INADDR_ANY;
452 return 4;
453 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000454 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000455 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
456 return 4;
457 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000458 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
459 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
460 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
461 addr_ret->sin_addr.s_addr = htonl(
462 ((long) d1 << 24) | ((long) d2 << 16) |
463 ((long) d3 << 8) | ((long) d4 << 0));
464 return 4;
465 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000466 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000467#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000468#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000469 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000470#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000471 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000472#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000473 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000474 result = gethostbyname_r(name, &hp_allocated, &data);
475 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000476#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000477#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000478#ifdef USE_GETHOSTBYNAME_LOCK
479 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000480#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000481 hp = gethostbyname(name);
482#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000483 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000484
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000485 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000486#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000487 /* Let's get real error message to return */
488 extern int h_errno;
489 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
490#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000491 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000492#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000493#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000494 PyThread_release_lock(gethostbyname_lock);
495#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000496 return -1;
497 }
498 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000499 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000500#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000501 PyThread_release_lock(gethostbyname_lock);
502#endif
503 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000504}
505
Guido van Rossum30a685f1991-06-27 15:51:29 +0000506
Guido van Rossum30a685f1991-06-27 15:51:29 +0000507/* Create a string object representing an IP address.
508 This is always a string of the form 'dd.dd.dd.dd' (with variable
509 size numbers). */
510
Guido van Rossum73624e91994-10-10 17:59:00 +0000511static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000512makeipaddr(struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000513{
514 long x = ntohl(addr->sin_addr.s_addr);
515 char buf[100];
516 sprintf(buf, "%d.%d.%d.%d",
517 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
518 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000519 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000520}
521
522
523/* Create an object representing the given socket address,
524 suitable for passing it back to bind(), connect() etc.
525 The family field of the sockaddr structure is inspected
526 to determine what kind of address it really is. */
527
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000528/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000529static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000530makesockaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000531{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000532 if (addrlen == 0) {
533 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000534 Py_INCREF(Py_None);
535 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000536 }
537
Guido van Rossumbcc20741998-08-04 22:53:56 +0000538#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000539 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000540 addr->sa_family = AF_INET;
541#endif
542
Guido van Rossum30a685f1991-06-27 15:51:29 +0000543 switch (addr->sa_family) {
544
545 case AF_INET:
546 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000547 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000548 PyObject *addrobj = makeipaddr(a);
549 PyObject *ret = NULL;
550 if (addrobj) {
551 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
552 Py_DECREF(addrobj);
553 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000554 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000555 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000556
Guido van Rossumb6775db1994-08-01 11:34:53 +0000557#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000558 case AF_UNIX:
559 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000560 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000561 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000562 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000563#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000564
565 /* More cases here... */
566
567 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000568 /* If we don't know the address family, don't raise an
569 exception -- return it as a tuple. */
570 return Py_BuildValue("is#",
571 addr->sa_family,
572 addr->sa_data,
573 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000574
Guido van Rossum30a685f1991-06-27 15:51:29 +0000575 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000576}
577
Guido van Rossum30a685f1991-06-27 15:51:29 +0000578
579/* Parse a socket address argument according to the socket object's
580 address family. Return 1 if the address was in the proper format,
581 0 of not. The address is returned through addr_ret, its length
582 through len_ret. */
583
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000584static int
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000585getsockaddrarg(PySocketSockObject *s, PyObject *args, struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000586{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000587 switch (s->sock_family) {
588
Guido van Rossumb6775db1994-08-01 11:34:53 +0000589#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000590 case AF_UNIX:
591 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000592 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000593 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000594 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000595 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000596 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000597 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000598 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000599 PyErr_SetString(PySocket_Error,
600 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000601 return 0;
602 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000603 addr->sun_family = AF_UNIX;
604 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000605 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000606 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000607 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000608 return 1;
609 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000610#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000611
Guido van Rossum30a685f1991-06-27 15:51:29 +0000612 case AF_INET:
613 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000614 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000615 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000616 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000617 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000618 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000619 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000620 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000621 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000622 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000623 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000624 *addr_ret = (struct sockaddr *) addr;
625 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000626 return 1;
627 }
628
Guido van Rossum30a685f1991-06-27 15:51:29 +0000629 /* More cases here... */
630
631 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000632 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000633 return 0;
634
635 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000636}
637
Guido van Rossum30a685f1991-06-27 15:51:29 +0000638
Guido van Rossum710e1df1992-06-12 10:39:36 +0000639/* Get the address length according to the socket object's address family.
640 Return 1 if the family is known, 0 otherwise. The length is returned
641 through len_ret. */
642
643static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000644getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000645{
646 switch (s->sock_family) {
647
Guido van Rossumb6775db1994-08-01 11:34:53 +0000648#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000649 case AF_UNIX:
650 {
651 *len_ret = sizeof (struct sockaddr_un);
652 return 1;
653 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000654#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000655
656 case AF_INET:
657 {
658 *len_ret = sizeof (struct sockaddr_in);
659 return 1;
660 }
661
662 /* More cases here... */
663
664 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000665 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000666 return 0;
667
668 }
669}
670
671
Guido van Rossum30a685f1991-06-27 15:51:29 +0000672/* s.accept() method */
673
Guido van Rossum73624e91994-10-10 17:59:00 +0000674static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000675PySocketSock_accept(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000676{
677 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000678 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000679 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000680 PyObject *sock = NULL;
681 PyObject *addr = NULL;
682 PyObject *res = NULL;
683
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000684 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000685 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000686 if (!getsockaddrlen(s, &addrlen))
687 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000688 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000689 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000690 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000691#ifdef MS_WINDOWS
692 if (newfd == INVALID_SOCKET)
693#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000694 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000695#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000696 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000697
Guido van Rossum30a685f1991-06-27 15:51:29 +0000698 /* Create the new object with unspecified family,
699 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000700 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000701 s->sock_family,
702 s->sock_type,
703 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000704 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000705 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000706 goto finally;
707 }
708 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
709 goto finally;
710
711 if (!(res = Py_BuildValue("OO", sock, addr)))
712 goto finally;
713
714 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000715 Py_XDECREF(sock);
716 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000717 return res;
718}
719
Guido van Rossum82a5c661998-07-07 20:45:43 +0000720static char accept_doc[] =
721"accept() -> (socket object, address info)\n\
722\n\
723Wait for an incoming connection. Return a new socket representing the\n\
724connection, and the address of the client. For IP sockets, the address\n\
725info is a pair (hostaddr, port).";
726
Guido van Rossum30a685f1991-06-27 15:51:29 +0000727
Guido van Rossume4485b01994-09-07 14:32:49 +0000728/* s.setblocking(1 | 0) method */
729
Guido van Rossum73624e91994-10-10 17:59:00 +0000730static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000731PySocketSock_setblocking(PySocketSockObject *s, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000732{
733 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000734#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000735 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000736#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000737 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000738 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000739 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000740#ifdef __BEOS__
741 block = !block;
742 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
743 (void *)(&block), sizeof( int ) );
744#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000745#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000746#ifdef PYOS_OS2
747 block = !block;
748 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
749#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000750 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
751 if (block)
752 delay_flag &= (~O_NDELAY);
753 else
754 delay_flag |= O_NDELAY;
755 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000756#endif /* !PYOS_OS2 */
757#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000758 block = !block;
759 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000760#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000761#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000762 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000763
Guido van Rossum73624e91994-10-10 17:59:00 +0000764 Py_INCREF(Py_None);
765 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000766}
Guido van Rossume4485b01994-09-07 14:32:49 +0000767
Guido van Rossum82a5c661998-07-07 20:45:43 +0000768static char setblocking_doc[] =
769"setblocking(flag)\n\
770\n\
771Set the socket to blocking (flag is true) or non-blocking (false).\n\
772This uses the FIONBIO ioctl with the O_NDELAY flag.";
773
Guido van Rossume4485b01994-09-07 14:32:49 +0000774
Guido van Rossumaee08791992-09-08 09:05:33 +0000775/* s.setsockopt() method.
776 With an integer third argument, sets an integer option.
777 With a string third argument, sets an option from a buffer;
778 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000779
Guido van Rossum73624e91994-10-10 17:59:00 +0000780static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000781PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000782{
783 int level;
784 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000785 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000786 char *buf;
787 int buflen;
788 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000789
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000790 if (PyArg_ParseTuple(args, "iii:setsockopt",
791 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000792 buf = (char *) &flag;
793 buflen = sizeof flag;
794 }
795 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000796 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000797 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
798 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000799 return NULL;
800 }
Thomas Wouters334fb892000-07-25 12:56:38 +0000801 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000802 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000803 return PySocket_Err();
804 Py_INCREF(Py_None);
805 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000806}
807
Guido van Rossum82a5c661998-07-07 20:45:43 +0000808static char setsockopt_doc[] =
809"setsockopt(level, option, value)\n\
810\n\
811Set a socket option. See the Unix manual for level and option.\n\
812The value argument can either be an integer or a string.";
813
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000814
Guido van Rossumaee08791992-09-08 09:05:33 +0000815/* s.getsockopt() method.
816 With two arguments, retrieves an integer option.
817 With a third integer argument, retrieves a string buffer of that size;
818 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000819
Guido van Rossum73624e91994-10-10 17:59:00 +0000820static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000821PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000822{
823 int level;
824 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000825 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000826 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000827 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000828
Guido van Rossumbcc20741998-08-04 22:53:56 +0000829#ifdef __BEOS__
830/* We have incomplete socket support. */
831 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
832 return NULL;
833#else
834
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000835 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
836 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000837 return NULL;
838
839 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000840 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000841 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000842 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +0000843 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000844 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000845 return PySocket_Err();
846 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000847 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000848 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000849 PyErr_SetString(PySocket_Error,
850 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000851 return NULL;
852 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000853 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000854 if (buf == NULL)
855 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000856 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +0000857 (void *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000858 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000859 Py_DECREF(buf);
860 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000861 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000862 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000863 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000864#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000865}
866
Guido van Rossum82a5c661998-07-07 20:45:43 +0000867static char getsockopt_doc[] =
868"getsockopt(level, option[, buffersize]) -> value\n\
869\n\
870Get a socket option. See the Unix manual for level and option.\n\
871If a nonzero buffersize argument is given, the return value is a\n\
872string of that length; otherwise it is an integer.";
873
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000874
Fred Drake728819a2000-07-01 03:40:12 +0000875/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000876
Guido van Rossum73624e91994-10-10 17:59:00 +0000877static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000878PySocketSock_bind(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000879{
880 struct sockaddr *addr;
881 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000882 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000883 PyObject *addro;
884 if (!PyArg_ParseTuple(args, "O:bind", &addro))
885 return NULL;
886 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000887 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000888 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000889 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000890 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000891 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000892 return PySocket_Err();
893 Py_INCREF(Py_None);
894 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000895}
896
Guido van Rossum82a5c661998-07-07 20:45:43 +0000897static char bind_doc[] =
898"bind(address)\n\
899\n\
900Bind the socket to a local address. For IP sockets, the address is a\n\
901pair (host, port); the host must refer to the local host.";
902
Guido van Rossum30a685f1991-06-27 15:51:29 +0000903
904/* s.close() method.
905 Set the file descriptor to -1 so operations tried subsequently
906 will surely fail. */
907
Guido van Rossum73624e91994-10-10 17:59:00 +0000908static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000909PySocketSock_close(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000910{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000911 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000912 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000913 if (s->sock_fd != -1) {
914 Py_BEGIN_ALLOW_THREADS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000915 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum08481461996-10-12 14:07:22 +0000916 Py_END_ALLOW_THREADS
917 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000918 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000919 Py_INCREF(Py_None);
920 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000921}
922
Guido van Rossum82a5c661998-07-07 20:45:43 +0000923static char close_doc[] =
924"close()\n\
925\n\
926Close the socket. It cannot be used after this call.";
927
Guido van Rossum30a685f1991-06-27 15:51:29 +0000928
Fred Drake728819a2000-07-01 03:40:12 +0000929/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000930
Guido van Rossum73624e91994-10-10 17:59:00 +0000931static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000932PySocketSock_connect(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000933{
934 struct sockaddr *addr;
935 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000936 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000937 PyObject *addro;
938 if (!PyArg_ParseTuple(args, "O:connect", &addro))
939 return NULL;
940 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000941 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000942 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000943 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000944 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000945 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000946 return PySocket_Err();
947 Py_INCREF(Py_None);
948 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000949}
950
Guido van Rossum82a5c661998-07-07 20:45:43 +0000951static char connect_doc[] =
952"connect(address)\n\
953\n\
954Connect the socket to a remote address. For IP sockets, the address\n\
955is a pair (host, port).";
956
Guido van Rossum30a685f1991-06-27 15:51:29 +0000957
Fred Drake728819a2000-07-01 03:40:12 +0000958/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000959
960static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000961PySocketSock_connect_ex(PySocketSockObject *s, PyObject *args)
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000962{
963 struct sockaddr *addr;
964 int addrlen;
965 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000966 PyObject *addro;
967 if (!PyArg_ParseTuple(args, "O:connect_ex", &addro))
968 return NULL;
969 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000970 return NULL;
971 Py_BEGIN_ALLOW_THREADS
972 res = connect(s->sock_fd, addr, addrlen);
973 Py_END_ALLOW_THREADS
974 if (res != 0)
975 res = errno;
976 return PyInt_FromLong((long) res);
977}
978
Guido van Rossum82a5c661998-07-07 20:45:43 +0000979static char connect_ex_doc[] =
980"connect_ex(address)\n\
981\n\
982This is like connect(address), but returns an error code (the errno value)\n\
983instead of raising an exception when an error occurs.";
984
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000985
Guido van Rossumed233a51992-06-23 09:07:03 +0000986/* s.fileno() method */
987
Guido van Rossum73624e91994-10-10 17:59:00 +0000988static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000989PySocketSock_fileno(PySocketSockObject *s, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000990{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000991 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +0000992 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +0000993#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +0000994 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +0000995#else
996 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
997#endif
Guido van Rossumed233a51992-06-23 09:07:03 +0000998}
999
Guido van Rossum82a5c661998-07-07 20:45:43 +00001000static char fileno_doc[] =
1001"fileno() -> integer\n\
1002\n\
1003Return the integer file descriptor of the socket.";
1004
Guido van Rossumed233a51992-06-23 09:07:03 +00001005
Guido van Rossumbe32c891996-06-20 16:25:29 +00001006#ifndef NO_DUP
1007/* s.dup() method */
1008
1009static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001010PySocketSock_dup(PySocketSockObject *s, PyObject *args)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001011{
Fred Drakea04eaad2000-06-30 02:46:07 +00001012 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001013 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001014 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001015 return NULL;
1016 newfd = dup(s->sock_fd);
1017 if (newfd < 0)
1018 return PySocket_Err();
1019 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001020 s->sock_family,
1021 s->sock_type,
1022 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001023 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001024 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001025 return sock;
1026}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001027
1028static char dup_doc[] =
1029"dup() -> socket object\n\
1030\n\
1031Return a new socket object connected to the same system resource.";
1032
Guido van Rossumbe32c891996-06-20 16:25:29 +00001033#endif
1034
1035
Guido van Rossumc89705d1992-11-26 08:54:07 +00001036/* s.getsockname() method */
1037
Guido van Rossum73624e91994-10-10 17:59:00 +00001038static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001039PySocketSock_getsockname(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001040{
1041 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001042 int res;
1043 socklen_t addrlen;
1044
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001045 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001046 return NULL;
1047 if (!getsockaddrlen(s, &addrlen))
1048 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001049 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001050 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001051 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001052 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001053 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001054 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001055 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1056}
1057
Guido van Rossum82a5c661998-07-07 20:45:43 +00001058static char getsockname_doc[] =
1059"getsockname() -> address info\n\
1060\n\
1061Return the address of the local endpoint. For IP sockets, the address\n\
1062info is a pair (hostaddr, port).";
1063
Guido van Rossumc89705d1992-11-26 08:54:07 +00001064
Guido van Rossumb6775db1994-08-01 11:34:53 +00001065#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001066/* s.getpeername() method */
1067
Guido van Rossum73624e91994-10-10 17:59:00 +00001068static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001069PySocketSock_getpeername(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001070{
1071 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001072 int res;
1073 socklen_t addrlen;
1074
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001075 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001076 return NULL;
1077 if (!getsockaddrlen(s, &addrlen))
1078 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001079 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001080 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001081 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001082 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001083 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001084 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1085}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001086
1087static char getpeername_doc[] =
1088"getpeername() -> address info\n\
1089\n\
1090Return the address of the remote endpoint. For IP sockets, the address\n\
1091info is a pair (hostaddr, port).";
1092
Guido van Rossumb6775db1994-08-01 11:34:53 +00001093#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001094
1095
Guido van Rossum30a685f1991-06-27 15:51:29 +00001096/* s.listen(n) method */
1097
Guido van Rossum73624e91994-10-10 17:59:00 +00001098static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001099PySocketSock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001100{
1101 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001102 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001103 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001104 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001105 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001106 if (backlog < 1)
1107 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001108 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001109 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001110 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001111 return PySocket_Err();
1112 Py_INCREF(Py_None);
1113 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001114}
1115
Guido van Rossum82a5c661998-07-07 20:45:43 +00001116static char listen_doc[] =
1117"listen(backlog)\n\
1118\n\
1119Enable a server to accept connections. The backlog argument must be at\n\
1120least 1; it specifies the number of unaccepted connection that the system\n\
1121will allow before refusing new connections.";
1122
1123
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001124#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001125/* s.makefile(mode) method.
1126 Create a new open file object referring to a dupped version of
1127 the socket's file descriptor. (The dup() call is necessary so
1128 that the open file and socket objects may be closed independent
1129 of each other.)
1130 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1131
Guido van Rossum73624e91994-10-10 17:59:00 +00001132static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001133PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001134{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001135 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001136 char *mode = "r";
1137 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001138#ifdef MS_WIN32
1139 intptr_t fd;
1140#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001141 int fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001142#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001143 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001144 PyObject *f;
1145
Guido van Rossum43713e52000-02-29 13:59:29 +00001146 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001147 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001148#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001149 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1150 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001151#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001152 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001153#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001154 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001155 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001156 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001157 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001158 }
1159 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1160 if (f != NULL)
1161 PyFile_SetBufSize(f, bufsize);
1162 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001163}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001164
1165static char makefile_doc[] =
1166"makefile([mode[, buffersize]]) -> file object\n\
1167\n\
1168Return a regular file object corresponding to the socket.\n\
1169The mode and buffersize arguments are as for the built-in open() function.";
1170
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001171#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001172
Guido van Rossum82a5c661998-07-07 20:45:43 +00001173
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001174/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001175
Guido van Rossum73624e91994-10-10 17:59:00 +00001176static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001177PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001178{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001179 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001180 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001181 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001182 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001183 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001184 if (buf == NULL)
1185 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001186 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001187 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001188 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001189 if (n < 0) {
1190 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001191 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001192 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001193 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001194 return NULL;
1195 return buf;
1196}
1197
Guido van Rossum82a5c661998-07-07 20:45:43 +00001198static char recv_doc[] =
1199"recv(buffersize[, flags]) -> data\n\
1200\n\
1201Receive up to buffersize bytes from the socket. For the optional flags\n\
1202argument, see the Unix manual. When no data is available, block until\n\
1203at least one byte is available or until the remote end is closed. When\n\
1204the remote end is closed and all data is read, return the empty string.";
1205
Guido van Rossum30a685f1991-06-27 15:51:29 +00001206
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001207/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001208
Guido van Rossum73624e91994-10-10 17:59:00 +00001209static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001210PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001211{
1212 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001213 PyObject *buf = NULL;
1214 PyObject *addr = NULL;
1215 PyObject *ret = NULL;
1216
Guido van Rossumff3ab422000-04-24 15:16:03 +00001217 int len, n, flags = 0;
1218 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001219 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001220 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001221 if (!getsockaddrlen(s, &addrlen))
1222 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001223 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001224 if (buf == NULL)
1225 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001226 Py_BEGIN_ALLOW_THREADS
1227 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001228#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001229#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001230 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001231#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001232 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001233#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001234#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001235 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001236#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001237 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001238 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001239 if (n < 0) {
1240 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001241 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001242 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001243 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001244 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001245
1246 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1247 goto finally;
1248
Guido van Rossum73624e91994-10-10 17:59:00 +00001249 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001250 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001251 Py_XDECREF(addr);
1252 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001253 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001254}
1255
Guido van Rossum82a5c661998-07-07 20:45:43 +00001256static char recvfrom_doc[] =
1257"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1258\n\
1259Like recv(buffersize, flags) but also return the sender's address info.";
1260
Guido van Rossum30a685f1991-06-27 15:51:29 +00001261
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001262/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001263
Guido van Rossum73624e91994-10-10 17:59:00 +00001264static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001265PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001266{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001267 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001268 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001269 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001270 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001271 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001272 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001273 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001274 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001275 return PySocket_Err();
1276 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001277}
1278
Guido van Rossum82a5c661998-07-07 20:45:43 +00001279static char send_doc[] =
1280"send(data[, flags])\n\
1281\n\
1282Send a data string to the socket. For the optional flags\n\
1283argument, see the Unix manual.";
1284
Guido van Rossum30a685f1991-06-27 15:51:29 +00001285
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001286/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001287
Guido van Rossum73624e91994-10-10 17:59:00 +00001288static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001289PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001290{
Guido van Rossum73624e91994-10-10 17:59:00 +00001291 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001292 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001293 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001294 int addrlen, len, n, flags;
1295 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001296 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001297 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001298 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1299 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001300 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001301 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001302 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001303 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001304 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001305 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001306 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001307 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001308 return PySocket_Err();
1309 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001310}
1311
Guido van Rossum82a5c661998-07-07 20:45:43 +00001312static char sendto_doc[] =
1313"sendto(data[, flags], address)\n\
1314\n\
1315Like send(data, flags) but allows specifying the destination address.\n\
1316For IP sockets, the address is a pair (hostaddr, port).";
1317
Guido van Rossum30a685f1991-06-27 15:51:29 +00001318
1319/* s.shutdown(how) method */
1320
Guido van Rossum73624e91994-10-10 17:59:00 +00001321static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001322PySocketSock_shutdown(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001323{
1324 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001325 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001326 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001327 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001328 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001329 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001330 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001331 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001332 return PySocket_Err();
1333 Py_INCREF(Py_None);
1334 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001335}
1336
Guido van Rossum82a5c661998-07-07 20:45:43 +00001337static char shutdown_doc[] =
1338"shutdown(flag)\n\
1339\n\
1340Shut down the reading side of the socket (flag == 0), the writing side\n\
1341of the socket (flag == 1), or both ends (flag == 2).";
1342
Guido van Rossum30a685f1991-06-27 15:51:29 +00001343
1344/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001345
Guido van Rossum73624e91994-10-10 17:59:00 +00001346static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001347 {"accept", (PyCFunction)PySocketSock_accept, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001348 accept_doc},
Fred Drake728819a2000-07-01 03:40:12 +00001349 {"bind", (PyCFunction)PySocketSock_bind, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001350 bind_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001351 {"close", (PyCFunction)PySocketSock_close, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001352 close_doc},
Fred Drake728819a2000-07-01 03:40:12 +00001353 {"connect", (PyCFunction)PySocketSock_connect, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001354 connect_doc},
Fred Drake728819a2000-07-01 03:40:12 +00001355 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001356 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001357#ifndef NO_DUP
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001358 {"dup", (PyCFunction)PySocketSock_dup, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001359 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001360#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001361 {"fileno", (PyCFunction)PySocketSock_fileno, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001362 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001363#ifdef HAVE_GETPEERNAME
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001364 {"getpeername", (PyCFunction)PySocketSock_getpeername, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001365 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001366#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001367 {"getsockname", (PyCFunction)PySocketSock_getsockname, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001368 getsockname_doc},
1369 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1370 getsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001371 {"listen", (PyCFunction)PySocketSock_listen, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001372 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001373#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001374 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1375 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001376#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001377 {"recv", (PyCFunction)PySocketSock_recv, 1,
1378 recv_doc},
1379 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1380 recvfrom_doc},
1381 {"send", (PyCFunction)PySocketSock_send, 1,
1382 send_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001383 {"sendto", (PyCFunction)PySocketSock_sendto, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001384 sendto_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001385 {"setblocking", (PyCFunction)PySocketSock_setblocking, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001386 setblocking_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001387 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001388 setsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001389 {"shutdown", (PyCFunction)PySocketSock_shutdown, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001390 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001391 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001392};
1393
Guido van Rossum30a685f1991-06-27 15:51:29 +00001394
Guido van Rossum73624e91994-10-10 17:59:00 +00001395/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001396 First close the file description. */
1397
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001398static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001399PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001400{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001401 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001402 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001403 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001404}
1405
Guido van Rossum30a685f1991-06-27 15:51:29 +00001406
1407/* Return a socket object's named attribute. */
1408
Guido van Rossum73624e91994-10-10 17:59:00 +00001409static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001410PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001411{
Guido van Rossum73624e91994-10-10 17:59:00 +00001412 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001413}
1414
Guido van Rossum30a685f1991-06-27 15:51:29 +00001415
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001416static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001417PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001418{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001419 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001420#if SIZEOF_SOCKET_T > SIZEOF_LONG
1421 if (s->sock_fd > LONG_MAX) {
1422 /* this can occur on Win64, and actually there is a special
1423 ugly printf formatter for decimal pointer length integer
1424 printing, only bother if necessary*/
1425 PyErr_SetString(PyExc_OverflowError,
1426 "no printf formatter to display the socket descriptor in decimal");
1427 return NULL;
1428 }
1429#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001430 sprintf(buf,
Fred Drakea04eaad2000-06-30 02:46:07 +00001431 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1432 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001433 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001434}
1435
1436
Guido van Rossumb6775db1994-08-01 11:34:53 +00001437/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001438
Guido van Rossum73624e91994-10-10 17:59:00 +00001439static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001440 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001441 0,
1442 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001443 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001444 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001445 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001446 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001447 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001448 0, /*tp_setattr*/
1449 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001450 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001451 0, /*tp_as_number*/
1452 0, /*tp_as_sequence*/
1453 0, /*tp_as_mapping*/
1454};
1455
Guido van Rossum30a685f1991-06-27 15:51:29 +00001456
Guido van Rossum81194471991-07-27 21:42:02 +00001457/* Python interface to gethostname(). */
1458
1459/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001460static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001461PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001462{
1463 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001464 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001465 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001466 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001467 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001468 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001469 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001470 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001471 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001472 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001473 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001474}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001475
Guido van Rossum82a5c661998-07-07 20:45:43 +00001476static char gethostname_doc[] =
1477"gethostname() -> string\n\
1478\n\
1479Return the current host name.";
1480
Guido van Rossumff4949e1992-08-05 19:58:53 +00001481
Guido van Rossum30a685f1991-06-27 15:51:29 +00001482/* Python interface to gethostbyname(name). */
1483
1484/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001485static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001486PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001487{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001488 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001489 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001490 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001491 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001492 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001493 return NULL;
1494 return makeipaddr(&addrbuf);
1495}
1496
Guido van Rossum82a5c661998-07-07 20:45:43 +00001497static char gethostbyname_doc[] =
1498"gethostbyname(host) -> address\n\
1499\n\
1500Return the IP address (a string of the form '255.255.255.255') for a host.";
1501
1502
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001503/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1504
1505static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001506gethost_common(struct hostent *h, struct sockaddr_in *addr)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001507{
1508 char **pch;
1509 PyObject *rtn_tuple = (PyObject *)NULL;
1510 PyObject *name_list = (PyObject *)NULL;
1511 PyObject *addr_list = (PyObject *)NULL;
1512 PyObject *tmp;
1513 if (h == NULL) {
1514#ifdef HAVE_HSTRERROR
1515 /* Let's get real error message to return */
1516 extern int h_errno;
1517 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1518#else
1519 PyErr_SetString(PySocket_Error, "host not found");
1520#endif
1521 return NULL;
1522 }
1523 if ((name_list = PyList_New(0)) == NULL)
1524 goto err;
1525 if ((addr_list = PyList_New(0)) == NULL)
1526 goto err;
1527 for (pch = h->h_aliases; *pch != NULL; pch++) {
1528 int status;
1529 tmp = PyString_FromString(*pch);
1530 if (tmp == NULL)
1531 goto err;
1532 status = PyList_Append(name_list, tmp);
1533 Py_DECREF(tmp);
1534 if (status)
1535 goto err;
1536 }
1537 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1538 int status;
1539 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1540 tmp = makeipaddr(addr);
1541 if (tmp == NULL)
1542 goto err;
1543 status = PyList_Append(addr_list, tmp);
1544 Py_DECREF(tmp);
1545 if (status)
1546 goto err;
1547 }
1548 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1549 err:
1550 Py_XDECREF(name_list);
1551 Py_XDECREF(addr_list);
1552 return rtn_tuple;
1553}
1554
1555
1556/* Python interface to gethostbyname_ex(name). */
1557
1558/*ARGSUSED*/
1559static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001560PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001561{
1562 char *name;
1563 struct hostent *h;
1564 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001565 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001566#ifdef HAVE_GETHOSTBYNAME_R
1567 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001568#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1569 struct hostent_data data;
1570#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001571 char buf[16384];
1572 int buf_len = (sizeof buf) - 1;
1573 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001574#endif
1575#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001576 int result;
1577#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001578#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001579 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001580 return NULL;
1581 if (setipaddr(name, &addr) < 0)
1582 return NULL;
1583 Py_BEGIN_ALLOW_THREADS
1584#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001585#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001586 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001587#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001588 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001589#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001590 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001591 result = gethostbyname_r(name, &hp_allocated, &data);
1592 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001593#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001594#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001595#ifdef USE_GETHOSTBYNAME_LOCK
1596 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001597#endif
1598 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001599#endif /* HAVE_GETHOSTBYNAME_R */
1600 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001601 ret = gethost_common(h, &addr);
1602#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001603 PyThread_release_lock(gethostbyname_lock);
1604#endif
1605 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001606}
1607
1608static char ghbn_ex_doc[] =
1609"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1610\n\
1611Return the true host name, a list of aliases, and a list of IP addresses,\n\
1612for a host. The host argument is a string giving a host name or IP number.";
1613
1614
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001615/* Python interface to gethostbyaddr(IP). */
1616
1617/*ARGSUSED*/
1618static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001619PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001620{
1621 struct sockaddr_in addr;
1622 char *ip_num;
1623 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001624 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001625#ifdef HAVE_GETHOSTBYNAME_R
1626 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001627#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1628 struct hostent_data data;
1629#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001630 char buf[16384];
1631 int buf_len = (sizeof buf) - 1;
1632 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001633#endif
1634#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001635 int result;
1636#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001637#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001638
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001639 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001640 return NULL;
1641 if (setipaddr(ip_num, &addr) < 0)
1642 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001643 Py_BEGIN_ALLOW_THREADS
1644#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001645#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001646 result = gethostbyaddr_r((char *)&addr.sin_addr,
1647 sizeof(addr.sin_addr),
1648 AF_INET, &hp_allocated, buf, buf_len,
1649 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001650#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001651 h = gethostbyaddr_r((char *)&addr.sin_addr,
1652 sizeof(addr.sin_addr),
1653 AF_INET,
1654 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001655#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001656 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001657 result = gethostbyaddr_r((char *)&addr.sin_addr,
1658 sizeof(addr.sin_addr),
1659 AF_INET, &hp_allocated, &data);
1660 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001661#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001662#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001663#ifdef USE_GETHOSTBYNAME_LOCK
1664 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001665#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001666 h = gethostbyaddr((char *)&addr.sin_addr,
1667 sizeof(addr.sin_addr),
1668 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001669#endif /* HAVE_GETHOSTBYNAME_R */
1670 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001671 ret = gethost_common(h, &addr);
1672#ifdef USE_GETHOSTBYNAME_LOCK
1673 PyThread_release_lock(gethostbyname_lock);
1674#endif
1675 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001676}
1677
Guido van Rossum82a5c661998-07-07 20:45:43 +00001678static char gethostbyaddr_doc[] =
1679"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1680\n\
1681Return the true host name, a list of aliases, and a list of IP addresses,\n\
1682for a host. The host argument is a string giving a host name or IP number.";
1683
Guido van Rossum30a685f1991-06-27 15:51:29 +00001684
1685/* Python interface to getservbyname(name).
1686 This only returns the port number, since the other info is already
1687 known or not useful (like the list of aliases). */
1688
1689/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001690static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001691PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001692{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001693 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001694 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001695 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001696 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001697 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001698 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001699 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001700 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001701 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001702 return NULL;
1703 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001704 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001705}
1706
Guido van Rossum82a5c661998-07-07 20:45:43 +00001707static char getservbyname_doc[] =
1708"getservbyname(servicename, protocolname) -> integer\n\
1709\n\
1710Return a port number from a service name and protocol name.\n\
1711The protocol name should be 'tcp' or 'udp'.";
1712
Guido van Rossum30a685f1991-06-27 15:51:29 +00001713
Guido van Rossum3901d851996-12-19 16:35:04 +00001714/* Python interface to getprotobyname(name).
1715 This only returns the protocol number, since the other info is
1716 already known or not useful (like the list of aliases). */
1717
1718/*ARGSUSED*/
1719static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001720PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00001721{
1722 char *name;
1723 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001724#ifdef __BEOS__
1725/* Not available in BeOS yet. - [cjh] */
1726 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1727 return NULL;
1728#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001729 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001730 return NULL;
1731 Py_BEGIN_ALLOW_THREADS
1732 sp = getprotobyname(name);
1733 Py_END_ALLOW_THREADS
1734 if (sp == NULL) {
1735 PyErr_SetString(PySocket_Error, "protocol not found");
1736 return NULL;
1737 }
1738 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001739#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001740}
1741
Guido van Rossum82a5c661998-07-07 20:45:43 +00001742static char getprotobyname_doc[] =
1743"getprotobyname(name) -> integer\n\
1744\n\
1745Return the protocol number for the named protocol. (Rarely used.)";
1746
Guido van Rossum3901d851996-12-19 16:35:04 +00001747
Guido van Rossum30a685f1991-06-27 15:51:29 +00001748/* Python interface to socket(family, type, proto).
1749 The third (protocol) argument is optional.
1750 Return a new socket object. */
1751
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001752/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001753static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001754PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001755{
Guido van Rossum73624e91994-10-10 17:59:00 +00001756 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001757 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001758 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001759 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001760 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001761 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001762 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001763 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001764#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001765 if (fd == INVALID_SOCKET)
1766#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001767 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001768#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001769 return PySocket_Err();
1770 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001771 /* If the object can't be created, don't forget to close the
1772 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001773 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001774 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001775 /* From now on, ignore SIGPIPE and let the error checking
1776 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001777#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001778 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001779#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001780 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001781}
1782
Guido van Rossum82a5c661998-07-07 20:45:43 +00001783static char socket_doc[] =
1784"socket(family, type[, proto]) -> socket object\n\
1785\n\
1786Open a socket of the given type. The family argument specifies the\n\
1787address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1788The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1789or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1790specifying the default protocol.";
1791
1792
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001793#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001794/* Create a socket object from a numeric file description.
1795 Useful e.g. if stdin is a socket.
1796 Additional arguments as for socket(). */
1797
1798/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001799static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001800PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001801{
Guido van Rossum73624e91994-10-10 17:59:00 +00001802 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001803 SOCKET_T fd;
1804 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001805 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1806 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001807 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001808 /* Dup the fd so it and the socket can be closed independently */
1809 fd = dup(fd);
1810 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001811 return PySocket_Err();
1812 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001813 /* From now on, ignore SIGPIPE and let the error checking
1814 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001815#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001816 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001817#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001818 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001819}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001820
1821static char fromfd_doc[] =
1822"fromfd(fd, family, type[, proto]) -> socket object\n\
1823\n\
1824Create a socket object from the given file descriptor.\n\
1825The remaining arguments are the same as for socket().";
1826
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001827#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001828
Guido van Rossum82a5c661998-07-07 20:45:43 +00001829
Guido van Rossum006bf911996-06-12 04:04:55 +00001830static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001831PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001832{
1833 int x1, x2;
1834
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001835 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001836 return NULL;
1837 }
1838 x2 = (int)ntohs((short)x1);
1839 return PyInt_FromLong(x2);
1840}
1841
Guido van Rossum82a5c661998-07-07 20:45:43 +00001842static char ntohs_doc[] =
1843"ntohs(integer) -> integer\n\
1844\n\
1845Convert a 16-bit integer from network to host byte order.";
1846
1847
Guido van Rossum006bf911996-06-12 04:04:55 +00001848static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001849PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001850{
1851 int x1, x2;
1852
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001853 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001854 return NULL;
1855 }
1856 x2 = ntohl(x1);
1857 return PyInt_FromLong(x2);
1858}
1859
Guido van Rossum82a5c661998-07-07 20:45:43 +00001860static char ntohl_doc[] =
1861"ntohl(integer) -> integer\n\
1862\n\
1863Convert a 32-bit integer from network to host byte order.";
1864
1865
Guido van Rossum006bf911996-06-12 04:04:55 +00001866static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001867PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001868{
1869 int x1, x2;
1870
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001871 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001872 return NULL;
1873 }
1874 x2 = (int)htons((short)x1);
1875 return PyInt_FromLong(x2);
1876}
1877
Guido van Rossum82a5c661998-07-07 20:45:43 +00001878static char htons_doc[] =
1879"htons(integer) -> integer\n\
1880\n\
1881Convert a 16-bit integer from host to network byte order.";
1882
1883
Guido van Rossum006bf911996-06-12 04:04:55 +00001884static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001885PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001886{
1887 int x1, x2;
1888
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001889 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001890 return NULL;
1891 }
1892 x2 = htonl(x1);
1893 return PyInt_FromLong(x2);
1894}
1895
Guido van Rossum82a5c661998-07-07 20:45:43 +00001896static char htonl_doc[] =
1897"htonl(integer) -> integer\n\
1898\n\
1899Convert a 32-bit integer from host to network byte order.";
1900
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001901/*
1902 * socket.inet_aton() and socket.inet_ntoa() functions
1903 *
1904 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
1905 *
1906 */
1907
1908static char inet_aton_doc[] =
1909"inet_aton(string) -> packed 32-bit IP representation\n\
1910\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001911Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001912binary format used in low-level network functions.";
1913
1914static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001915PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001916{
Guido van Rossuma2e48551999-09-09 15:42:59 +00001917#ifndef INADDR_NONE
1918#define INADDR_NONE (-1)
1919#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001920
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001921 /* Have to use inet_addr() instead */
1922 char *ip_addr;
1923 long packed_addr;
1924
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001925 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001926 return NULL;
1927 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00001928#ifdef USE_GUSI1
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001929 packed_addr = (long)inet_addr(ip_addr).s_addr;
1930#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001931 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001932#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001933
1934 if (packed_addr == INADDR_NONE) { /* invalid address */
1935 PyErr_SetString(PySocket_Error,
1936 "illegal IP address string passed to inet_aton");
1937 return NULL;
1938 }
1939
1940 return PyString_FromStringAndSize((char *) &packed_addr,
1941 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001942}
1943
1944static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00001945"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001946\n\
1947Convert an IP address from 32-bit packed binary format to string format";
1948
1949static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001950PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001951{
1952 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001953 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001954 struct in_addr packed_addr;
1955
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001956 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001957 return NULL;
1958 }
1959
1960 if (addr_len != sizeof(packed_addr)) {
1961 PyErr_SetString(PySocket_Error,
1962 "packed IP wrong length for inet_ntoa");
1963 return NULL;
1964 }
1965
1966 memcpy(&packed_addr, packed_str, addr_len);
1967
1968 return PyString_FromString(inet_ntoa(packed_addr));
1969}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001970
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001971
1972#ifdef USE_SSL
1973
1974/* This is a C function to be called for new object initialization */
1975static SSLObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001976newSSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001977{
1978 SSLObject *self;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001979
Guido van Rossumb18618d2000-05-03 23:44:39 +00001980 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001981 if (self == NULL){
1982 PyErr_SetObject(SSLErrorObject,
1983 PyString_FromString("newSSLObject error"));
1984 return NULL;
1985 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001986 memset(self->server, '\0', sizeof(char) * 256);
1987 memset(self->issuer, '\0', sizeof(char) * 256);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001988
1989 self->x_attr = PyDict_New();
1990 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
1991 if (self->ctx == NULL) {
1992 PyErr_SetObject(SSLErrorObject,
1993 PyString_FromString("SSL_CTX_new error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00001994 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001995 return NULL;
1996 }
1997
1998 if ( (key_file && !cert_file) || (!key_file && cert_file) )
1999 {
2000 PyErr_SetObject(SSLErrorObject,
2001 PyString_FromString(
2002 "Both the key & certificate files must be specified"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002003 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002004 return NULL;
2005 }
2006
2007 if (key_file && cert_file)
2008 {
2009 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
2010 SSL_FILETYPE_PEM) < 1)
2011 {
2012 PyErr_SetObject(SSLErrorObject,
2013 PyString_FromString(
2014 "SSL_CTX_use_PrivateKey_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002015 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002016 return NULL;
2017 }
2018
2019 if (SSL_CTX_use_certificate_chain_file(self->ctx,
2020 cert_file) < 1)
2021 {
2022 PyErr_SetObject(SSLErrorObject,
2023 PyString_FromString(
2024 "SSL_CTX_use_certificate_chain_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002025 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002026 return NULL;
2027 }
2028 }
2029
2030 SSL_CTX_set_verify(self->ctx,
2031 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2032 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2033 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2034 SSL_set_connect_state(self->ssl);
2035
2036 if ((SSL_connect(self->ssl)) == -1) {
2037 /* Actually negotiate SSL connection */
2038 PyErr_SetObject(SSLErrorObject,
2039 PyString_FromString("SSL_connect error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002040 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002041 return NULL;
2042 }
2043 self->ssl->debug = 1;
2044
2045 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2046 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2047 self->server, 256);
2048 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2049 self->issuer, 256);
2050 }
2051 self->x_attr = NULL;
2052 self->Socket = Sock;
2053 Py_INCREF(self->Socket);
2054 return self;
2055}
2056
2057/* This is the Python function called for new object initialization */
2058static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002059PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002060{
2061 SSLObject *rv;
2062 PySocketSockObject *Sock;
2063 char *key_file;
2064 char *cert_file;
2065
Guido van Rossum43713e52000-02-29 13:59:29 +00002066 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002067 &PySocketSock_Type, (PyObject*)&Sock,
2068 &key_file, &cert_file) )
2069 return NULL;
2070
2071 rv = newSSLObject(Sock, key_file, cert_file);
2072 if ( rv == NULL )
2073 return NULL;
2074 return (PyObject *)rv;
2075}
2076
2077static char ssl_doc[] =
2078"ssl(socket, keyfile, certfile) -> sslobject";
2079
2080static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002081SSL_server(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002082{
2083 return PyString_FromString(self->server);
2084}
2085
2086static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002087SSL_issuer(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002088{
2089 return PyString_FromString(self->issuer);
2090}
2091
2092
2093/* SSL object methods */
2094
2095static PyMethodDef SSLMethods[] = {
2096 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2097 { "read", (PyCFunction)SSL_SSLread, 1 },
2098 { "server", (PyCFunction)SSL_server, 1 },
2099 { "issuer", (PyCFunction)SSL_issuer, 1 },
2100 { NULL, NULL}
2101};
2102
2103static void SSL_dealloc(SSLObject *self)
2104{
2105 if (self->server_cert) /* Possible not to have one? */
2106 X509_free (self->server_cert);
2107 SSL_CTX_free(self->ctx);
2108 SSL_free(self->ssl);
2109 Py_XDECREF(self->x_attr);
2110 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002111 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002112}
2113
2114static PyObject *SSL_getattr(SSLObject *self, char *name)
2115{
2116 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2117}
2118
2119staticforward PyTypeObject SSL_Type = {
2120 PyObject_HEAD_INIT(&PyType_Type)
2121 0, /*ob_size*/
2122 "SSL", /*tp_name*/
2123 sizeof(SSLObject), /*tp_basicsize*/
2124 0, /*tp_itemsize*/
2125 /* methods */
2126 (destructor)SSL_dealloc, /*tp_dealloc*/
2127 0, /*tp_print*/
2128 (getattrfunc)SSL_getattr, /*tp_getattr*/
2129 0, /*tp_setattr*/
2130 0, /*tp_compare*/
2131 0, /*tp_repr*/
2132 0, /*tp_as_number*/
2133 0, /*tp_as_sequence*/
2134 0, /*tp_as_mapping*/
2135 0, /*tp_hash*/
2136};
2137
2138
2139
2140static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2141{
2142 char *data;
Fred Drakea04eaad2000-06-30 02:46:07 +00002143 size_t len = 0;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002144
Guido van Rossum43713e52000-02-29 13:59:29 +00002145 if (!PyArg_ParseTuple(args, "s|i:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002146 return NULL;
2147
2148 if (!len)
2149 len = strlen(data);
2150
2151 len = SSL_write(self->ssl, data, len);
2152 return PyInt_FromLong((long)len);
2153}
2154
2155static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2156{
2157 PyObject *buf;
2158 int count = 0;
2159 int len = 1024;
2160 int res;
2161
Guido van Rossum43713e52000-02-29 13:59:29 +00002162 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002163
2164 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2165 return NULL; /* Error object should already be set */
2166
2167 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2168 res = SSL_get_error(self->ssl, count);
2169
2170 switch (res) {
2171 case 0: /* Good return value! */
2172 break;
2173 case 6:
2174 PyErr_SetString(SSLErrorObject, "EOF");
2175 Py_DECREF(buf);
2176 return NULL;
2177 break;
2178 case 5:
2179 default:
2180 return PyErr_SetFromErrno(SSLErrorObject);
2181 break;
2182 }
2183
2184 fflush(stderr);
2185
2186 if (count < 0) {
2187 Py_DECREF(buf);
2188 return PyErr_SetFromErrno(SSLErrorObject);
2189 }
2190
2191 if (count != len && _PyString_Resize(&buf, count) < 0)
2192 return NULL;
2193 return buf;
2194}
2195
2196#endif /* USE_SSL */
2197
2198
Guido van Rossum30a685f1991-06-27 15:51:29 +00002199/* List of functions exported by this module. */
2200
Guido van Rossum73624e91994-10-10 17:59:00 +00002201static PyMethodDef PySocket_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002202 {"gethostbyname", PySocket_gethostbyname, 1, gethostbyname_doc},
2203 {"gethostbyname_ex", PySocket_gethostbyname_ex, 1, ghbn_ex_doc},
2204 {"gethostbyaddr", PySocket_gethostbyaddr, 1, gethostbyaddr_doc},
2205 {"gethostname", PySocket_gethostname, 1, gethostname_doc},
2206 {"getservbyname", PySocket_getservbyname, 1, getservbyname_doc},
2207 {"getprotobyname", PySocket_getprotobyname, 1,getprotobyname_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00002208 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002209#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00002210 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002211#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002212 {"ntohs", PySocket_ntohs, 1, ntohs_doc},
2213 {"ntohl", PySocket_ntohl, 1, ntohl_doc},
2214 {"htons", PySocket_htons, 1, htons_doc},
2215 {"htonl", PySocket_htonl, 1, htonl_doc},
2216 {"inet_aton", PySocket_inet_aton, 1, inet_aton_doc},
2217 {"inet_ntoa", PySocket_inet_ntoa, 1, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002218#ifdef USE_SSL
2219 {"ssl", PySocket_ssl, 1, ssl_doc},
2220#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002221 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002222};
2223
Guido van Rossum30a685f1991-06-27 15:51:29 +00002224
2225/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002226 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002227 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002228 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002229static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002230insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002231{
Guido van Rossum73624e91994-10-10 17:59:00 +00002232 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002233 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002234 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002235
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002236 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002237}
2238
Guido van Rossum30a685f1991-06-27 15:51:29 +00002239
Guido van Rossum8d665e61996-06-26 18:22:49 +00002240#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002241
2242/* Additional initialization and cleanup for NT/Windows */
2243
2244static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002245NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002246{
2247 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002248}
2249
2250static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002251NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002252{
2253 WSADATA WSAData;
2254 int ret;
2255 char buf[100];
2256 ret = WSAStartup(0x0101, &WSAData);
2257 switch (ret) {
2258 case 0: /* no error */
2259 atexit(NTcleanup);
2260 return 1;
2261 case WSASYSNOTREADY:
2262 PyErr_SetString(PyExc_ImportError,
2263 "WSAStartup failed: network not ready");
2264 break;
2265 case WSAVERNOTSUPPORTED:
2266 case WSAEINVAL:
2267 PyErr_SetString(PyExc_ImportError,
2268 "WSAStartup failed: requested version not supported");
2269 break;
2270 default:
2271 sprintf(buf, "WSAStartup failed: error code %d", ret);
2272 PyErr_SetString(PyExc_ImportError, buf);
2273 break;
2274 }
2275 return 0;
2276}
2277
Guido van Rossum8d665e61996-06-26 18:22:49 +00002278#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002279
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002280#if defined(PYOS_OS2)
2281
2282/* Additional initialization and cleanup for OS/2 */
2283
2284static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002285OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002286{
2287 /* No cleanup is necessary for OS/2 Sockets */
2288}
2289
2290static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002291OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002292{
2293 char reason[64];
2294 int rc = sock_init();
2295
2296 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002297 atexit(OS2cleanup);
2298 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002299 }
2300
2301 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2302 PyErr_SetString(PyExc_ImportError, reason);
2303
Guido van Rossum32c575d1997-12-02 20:37:32 +00002304 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002305}
2306
2307#endif /* PYOS_OS2 */
2308
Guido van Rossum30a685f1991-06-27 15:51:29 +00002309/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002310 * This is called when the first 'import socket' is done,
2311 * via a table in config.c, if config.c is compiled with USE_SOCKET
2312 * defined.
2313 *
2314 * For MS_WINDOWS (which means any Windows variant), this module
2315 * is actually called "_socket", and there's a wrapper "socket.py"
2316 * which implements some missing functionality (such as makefile(),
2317 * dup() and fromfd()). The import of "_socket" may fail with an
2318 * ImportError exception if initialization of WINSOCK fails. When
2319 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2320 * scheduled to be made at exit time.
2321 *
2322 * For OS/2, this module is also called "_socket" and uses a wrapper
2323 * "socket.py" which implements that functionality that is missing
2324 * when PC operating systems don't put socket descriptors in the
2325 * operating system's filesystem layer.
2326 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002327
Guido van Rossum82a5c661998-07-07 20:45:43 +00002328static char module_doc[] =
2329"This module provides socket operations and some related functions.\n\
2330On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
2331On other systems, it only supports IP.\n\
2332\n\
2333Functions:\n\
2334\n\
2335socket() -- create a new socket object\n\
2336fromfd() -- create a socket object from an open file descriptor (*)\n\
2337gethostname() -- return the current hostname\n\
2338gethostbyname() -- map a hostname to its IP number\n\
2339gethostbyaddr() -- map an IP number or hostname to DNS info\n\
2340getservbyname() -- map a service name and a protocol name to a port number\n\
2341getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
2342ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
2343htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002344inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format\n\
2345inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)\n\
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002346ssl() -- secure socket layer support (only available if configured)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002347\n\
2348(*) not available on all platforms!)\n\
2349\n\
2350Special objects:\n\
2351\n\
2352SocketType -- type object for socket objects\n\
2353error -- exception raised for I/O errors\n\
2354\n\
2355Integer constants:\n\
2356\n\
2357AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
2358SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
2359\n\
2360Many other constants may be defined; these may be used in calls to\n\
2361the setsockopt() and getsockopt() methods.\n\
2362";
2363
2364static char sockettype_doc[] =
2365"A socket represents one endpoint of a network connection.\n\
2366\n\
2367Methods:\n\
2368\n\
2369accept() -- accept a connection, returning new socket and client address\n\
2370bind() -- bind the socket to a local address\n\
2371close() -- close the socket\n\
2372connect() -- connect the socket to a remote address\n\
2373connect_ex() -- connect, return an error code instead of an exception \n\
2374dup() -- return a new socket object identical to the current one (*)\n\
2375fileno() -- return underlying file descriptor\n\
2376getpeername() -- return remote address (*)\n\
2377getsockname() -- return local address\n\
2378getsockopt() -- get socket options\n\
2379listen() -- start listening for incoming connections\n\
2380makefile() -- return a file object corresponding tot the socket (*)\n\
2381recv() -- receive data\n\
2382recvfrom() -- receive data and sender's address\n\
2383send() -- send data\n\
2384sendto() -- send data to a given address\n\
2385setblocking() -- set or clear the blocking I/O flag\n\
2386setsockopt() -- set socket options\n\
2387shutdown() -- shut down traffic in one or both directions\n\
2388\n\
2389(*) not available on all platforms!)";
2390
Guido van Rossum3886bb61998-12-04 18:50:17 +00002391DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00002392#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002393init_socket(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002394#else
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002395initsocket(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002396#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002397{
Guido van Rossum73624e91994-10-10 17:59:00 +00002398 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00002399#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002400 if (!NTinit())
2401 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002402 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002403#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002404#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002405 if (!OS2init())
2406 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002407 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002408#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00002409#if defined(__BEOS__)
2410 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
2411#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002412 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002413#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00002414#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00002415#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002416 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002417 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2418 if (PySocket_Error == NULL)
2419 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002420#ifdef USE_SSL
2421 SSL_load_error_strings();
2422 SSLeay_add_ssl_algorithms();
2423 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2424 if (SSLErrorObject == NULL)
2425 return;
2426 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2427 Py_INCREF(&SSL_Type);
2428 if (PyDict_SetItemString(d, "SSLType",
2429 (PyObject *)&SSL_Type) != 0)
2430 return;
2431#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002432 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002433 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002434 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002435 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002436 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002437 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002438 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002439
2440 /* Address families (we only support AF_INET and AF_UNIX) */
2441#ifdef AF_UNSPEC
2442 insint(d, "AF_UNSPEC", AF_UNSPEC);
2443#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002444 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002445#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002446 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002447#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002448#ifdef AF_AX25
2449 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2450#endif
2451#ifdef AF_IPX
2452 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2453#endif
2454#ifdef AF_APPLETALK
2455 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2456#endif
2457#ifdef AF_NETROM
2458 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2459#endif
2460#ifdef AF_BRIDGE
2461 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2462#endif
2463#ifdef AF_AAL5
2464 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2465#endif
2466#ifdef AF_X25
2467 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2468#endif
2469#ifdef AF_INET6
2470 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2471#endif
2472#ifdef AF_ROSE
2473 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2474#endif
2475
2476 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002477 insint(d, "SOCK_STREAM", SOCK_STREAM);
2478 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002479#ifndef __BEOS__
2480/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002481 insint(d, "SOCK_RAW", SOCK_RAW);
2482 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2483 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002484#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002485
2486#ifdef SO_DEBUG
2487 insint(d, "SO_DEBUG", SO_DEBUG);
2488#endif
2489#ifdef SO_ACCEPTCONN
2490 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2491#endif
2492#ifdef SO_REUSEADDR
2493 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2494#endif
2495#ifdef SO_KEEPALIVE
2496 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2497#endif
2498#ifdef SO_DONTROUTE
2499 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2500#endif
2501#ifdef SO_BROADCAST
2502 insint(d, "SO_BROADCAST", SO_BROADCAST);
2503#endif
2504#ifdef SO_USELOOPBACK
2505 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2506#endif
2507#ifdef SO_LINGER
2508 insint(d, "SO_LINGER", SO_LINGER);
2509#endif
2510#ifdef SO_OOBINLINE
2511 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2512#endif
2513#ifdef SO_REUSEPORT
2514 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2515#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002516#ifdef SO_SNDBUF
2517 insint(d, "SO_SNDBUF", SO_SNDBUF);
2518#endif
2519#ifdef SO_RCVBUF
2520 insint(d, "SO_RCVBUF", SO_RCVBUF);
2521#endif
2522#ifdef SO_SNDLOWAT
2523 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2524#endif
2525#ifdef SO_RCVLOWAT
2526 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2527#endif
2528#ifdef SO_SNDTIMEO
2529 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2530#endif
2531#ifdef SO_RCVTIMEO
2532 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2533#endif
2534#ifdef SO_ERROR
2535 insint(d, "SO_ERROR", SO_ERROR);
2536#endif
2537#ifdef SO_TYPE
2538 insint(d, "SO_TYPE", SO_TYPE);
2539#endif
2540
2541 /* Maximum number of connections for "listen" */
2542#ifdef SOMAXCONN
2543 insint(d, "SOMAXCONN", SOMAXCONN);
2544#else
2545 insint(d, "SOMAXCONN", 5); /* Common value */
2546#endif
2547
2548 /* Flags for send, recv */
2549#ifdef MSG_OOB
2550 insint(d, "MSG_OOB", MSG_OOB);
2551#endif
2552#ifdef MSG_PEEK
2553 insint(d, "MSG_PEEK", MSG_PEEK);
2554#endif
2555#ifdef MSG_DONTROUTE
2556 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2557#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002558#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00002559 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002560#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002561#ifdef MSG_EOR
2562 insint(d, "MSG_EOR", MSG_EOR);
2563#endif
2564#ifdef MSG_TRUNC
2565 insint(d, "MSG_TRUNC", MSG_TRUNC);
2566#endif
2567#ifdef MSG_CTRUNC
2568 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2569#endif
2570#ifdef MSG_WAITALL
2571 insint(d, "MSG_WAITALL", MSG_WAITALL);
2572#endif
2573#ifdef MSG_BTAG
2574 insint(d, "MSG_BTAG", MSG_BTAG);
2575#endif
2576#ifdef MSG_ETAG
2577 insint(d, "MSG_ETAG", MSG_ETAG);
2578#endif
2579
2580 /* Protocol level and numbers, usable for [gs]etsockopt */
2581#ifdef SOL_SOCKET
2582 insint(d, "SOL_SOCKET", SOL_SOCKET);
2583#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002584#ifdef SOL_IP
2585 insint(d, "SOL_IP", SOL_IP);
2586#else
2587 insint(d, "SOL_IP", 0);
2588#endif
2589#ifdef SOL_IPX
2590 insint(d, "SOL_IPX", SOL_IPX);
2591#endif
2592#ifdef SOL_AX25
2593 insint(d, "SOL_AX25", SOL_AX25);
2594#endif
2595#ifdef SOL_ATALK
2596 insint(d, "SOL_ATALK", SOL_ATALK);
2597#endif
2598#ifdef SOL_NETROM
2599 insint(d, "SOL_NETROM", SOL_NETROM);
2600#endif
2601#ifdef SOL_ROSE
2602 insint(d, "SOL_ROSE", SOL_ROSE);
2603#endif
2604#ifdef SOL_TCP
2605 insint(d, "SOL_TCP", SOL_TCP);
2606#else
2607 insint(d, "SOL_TCP", 6);
2608#endif
2609#ifdef SOL_UDP
2610 insint(d, "SOL_UDP", SOL_UDP);
2611#else
2612 insint(d, "SOL_UDP", 17);
2613#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002614#ifdef IPPROTO_IP
2615 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002616#else
2617 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002618#endif
2619#ifdef IPPROTO_ICMP
2620 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002621#else
2622 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002623#endif
2624#ifdef IPPROTO_IGMP
2625 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2626#endif
2627#ifdef IPPROTO_GGP
2628 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2629#endif
2630#ifdef IPPROTO_TCP
2631 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002632#else
2633 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002634#endif
2635#ifdef IPPROTO_EGP
2636 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2637#endif
2638#ifdef IPPROTO_PUP
2639 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2640#endif
2641#ifdef IPPROTO_UDP
2642 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002643#else
2644 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002645#endif
2646#ifdef IPPROTO_IDP
2647 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2648#endif
2649#ifdef IPPROTO_HELLO
2650 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2651#endif
2652#ifdef IPPROTO_ND
2653 insint(d, "IPPROTO_ND", IPPROTO_ND);
2654#endif
2655#ifdef IPPROTO_TP
2656 insint(d, "IPPROTO_TP", IPPROTO_TP);
2657#endif
2658#ifdef IPPROTO_XTP
2659 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2660#endif
2661#ifdef IPPROTO_EON
2662 insint(d, "IPPROTO_EON", IPPROTO_EON);
2663#endif
2664#ifdef IPPROTO_BIP
2665 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2666#endif
2667/**/
2668#ifdef IPPROTO_RAW
2669 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002670#else
2671 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002672#endif
2673#ifdef IPPROTO_MAX
2674 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2675#endif
2676
2677 /* Some port configuration */
2678#ifdef IPPORT_RESERVED
2679 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2680#else
2681 insint(d, "IPPORT_RESERVED", 1024);
2682#endif
2683#ifdef IPPORT_USERRESERVED
2684 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2685#else
2686 insint(d, "IPPORT_USERRESERVED", 5000);
2687#endif
2688
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002689 /* Some reserved IP v.4 addresses */
2690#ifdef INADDR_ANY
2691 insint(d, "INADDR_ANY", INADDR_ANY);
2692#else
2693 insint(d, "INADDR_ANY", 0x00000000);
2694#endif
2695#ifdef INADDR_BROADCAST
2696 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2697#else
2698 insint(d, "INADDR_BROADCAST", 0xffffffff);
2699#endif
2700#ifdef INADDR_LOOPBACK
2701 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2702#else
2703 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2704#endif
2705#ifdef INADDR_UNSPEC_GROUP
2706 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2707#else
2708 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2709#endif
2710#ifdef INADDR_ALLHOSTS_GROUP
2711 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2712#else
2713 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2714#endif
2715#ifdef INADDR_MAX_LOCAL_GROUP
2716 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2717#else
2718 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2719#endif
2720#ifdef INADDR_NONE
2721 insint(d, "INADDR_NONE", INADDR_NONE);
2722#else
2723 insint(d, "INADDR_NONE", 0xffffffff);
2724#endif
2725
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002726 /* IP [gs]etsockopt options */
2727#ifdef IP_OPTIONS
2728 insint(d, "IP_OPTIONS", IP_OPTIONS);
2729#endif
2730#ifdef IP_HDRINCL
2731 insint(d, "IP_HDRINCL", IP_HDRINCL);
2732#endif
2733#ifdef IP_TOS
2734 insint(d, "IP_TOS", IP_TOS);
2735#endif
2736#ifdef IP_TTL
2737 insint(d, "IP_TTL", IP_TTL);
2738#endif
2739#ifdef IP_RECVOPTS
2740 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2741#endif
2742#ifdef IP_RECVRETOPTS
2743 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2744#endif
2745#ifdef IP_RECVDSTADDR
2746 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2747#endif
2748#ifdef IP_RETOPTS
2749 insint(d, "IP_RETOPTS", IP_RETOPTS);
2750#endif
2751#ifdef IP_MULTICAST_IF
2752 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2753#endif
2754#ifdef IP_MULTICAST_TTL
2755 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2756#endif
2757#ifdef IP_MULTICAST_LOOP
2758 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2759#endif
2760#ifdef IP_ADD_MEMBERSHIP
2761 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2762#endif
2763#ifdef IP_DROP_MEMBERSHIP
2764 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2765#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002766#ifdef IP_DEFAULT_MULTICAST_TTL
2767 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2768#endif
2769#ifdef IP_DEFAULT_MULTICAST_LOOP
2770 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2771#endif
2772#ifdef IP_MAX_MEMBERSHIPS
2773 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2774#endif
2775
2776 /* TCP options */
2777#ifdef TCP_NODELAY
2778 insint(d, "TCP_NODELAY", TCP_NODELAY);
2779#endif
2780#ifdef TCP_MAXSEG
2781 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2782#endif
2783
2784 /* IPX options */
2785#ifdef IPX_TYPE
2786 insint(d, "IPX_TYPE", IPX_TYPE);
2787#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002788
2789 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002790#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002791 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002792#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002793}