blob: b10268eb943ea152b427188c549fbcfa44d15ef2 [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 Rossumbcc20741998-08-04 22:53:56 +0000113#if !defined(MS_WINDOWS) && !defined(PYOS_OS2) && !defined(__BEOS__)
Guido van Rossumfb4130d1996-12-10 15:17:08 +0000114extern int gethostname(); /* For Solaris, at least */
115#endif
116
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000117#if defined(PYCC_VACPP)
118#include <types.h>
119#include <io.h>
120#include <sys/ioctl.h>
121#include <utils.h>
122#include <ctype.h>
123#endif
124
125#if defined(PYOS_OS2)
126#define INCL_DOS
127#define INCL_DOSERRORS
128#define INCL_NOPMAPI
129#include <os2.h>
130#endif
131
Guido van Rossumbcc20741998-08-04 22:53:56 +0000132#if defined(__BEOS__)
133/* It's in the libs, but not the headers... - [cjh] */
134int shutdown( int, int );
135#endif
136
Guido van Rossumb6775db1994-08-01 11:34:53 +0000137#include <sys/types.h>
138#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +0000139
Guido van Rossum81194471991-07-27 21:42:02 +0000140#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000141#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000142#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000143#include <sys/socket.h>
144#include <netinet/in.h>
Fred Drake11b09362000-05-16 13:30:12 +0000145#ifndef __BEOS__
Andrew M. Kuchling52a644c2000-03-31 17:24:30 +0000146#include <netinet/tcp.h>
Fred Drake11b09362000-05-16 13:30:12 +0000147#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000148
Guido van Rossum9376b741999-09-15 22:01:40 +0000149/* Headers needed for inet_ntoa() and inet_addr() */
150#ifdef __BEOS__
151#include <net/netdb.h>
152#else
Guido van Rossumff3ab422000-04-24 15:16:03 +0000153#ifndef USE_GUSI1
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000154#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000155#endif
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000156#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000157
Guido van Rossume4485b01994-09-07 14:32:49 +0000158#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000159#else
160#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000161#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000162#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000163#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000164#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000165#else
166#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000167#endif
168
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000169#ifndef O_NDELAY
170#define O_NDELAY O_NONBLOCK /* For QNX only? */
171#endif
172
Guido van Rossumff3ab422000-04-24 15:16:03 +0000173#ifdef USE_GUSI1
Jack Jansen508537b1996-02-14 15:57:45 +0000174/* fdopen() isn't declared in stdio.h (sigh) */
175#include <GUSI.h>
176#endif
177
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000178#ifdef USE_SSL
179#include "rsa.h"
180#include "crypto.h"
181#include "x509.h"
182#include "pem.h"
183#include "ssl.h"
184#include "err.h"
185#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000186
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000187/* Here we have some hacks to choose between K&R or ANSI style function
188 definitions. For NT to build this as an extension module (ie, DLL)
189 it must be compiled by the C++ compiler, as it takes the address of
190 a static data item exported from the main Python DLL.
191*/
Guido van Rossumbcc20741998-08-04 22:53:56 +0000192#if defined(MS_WINDOWS) || defined(__BEOS__)
193/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000194/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000195#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000196#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000197#define FORCE_ANSI_FUNC_DEFS
198#endif
199
Fred Drakea04eaad2000-06-30 02:46:07 +0000200/* abstract the socket file descriptor type */
201#ifdef MS_WINDOWS
202typedef SOCKET SOCKET_T;
203# ifdef MS_WIN64
204# define SIZEOF_SOCKET_T 8
205# else
206# define SIZEOF_SOCKET_T 4
207# endif
208#else
209typedef int SOCKET_T;
210# define SIZEOF_SOCKET_T SIZEOF_INT
211#endif
212
213
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000214#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000215#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000216#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
217#define FORCE_ANSI_FUNC_DEFS
218#endif
219
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000220#ifndef SOCKETCLOSE
221#define SOCKETCLOSE close
222#endif
223
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000224#ifdef FORCE_ANSI_FUNC_DEFS
225#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
226fnname( arg1type arg1name )
227
228#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
229fnname( arg1type arg1name, arg2type arg2name )
230
231#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
232fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
233
234#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
235fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
236
237#else /* !FORCE_ANSI_FN_DEFS */
238#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
239fnname( arg1name ) \
240 arg1type arg1name;
241
242#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
243fnname( arg1name, arg2name ) \
244 arg1type arg1name; \
245 arg2type arg2name;
246
247#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
248fnname( arg1name, arg2name, arg3name ) \
249 arg1type arg1name; \
250 arg2type arg2name; \
251 arg3type arg3name;
252
253#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
254fnname( arg1name, arg2name, arg3name, arg4name ) \
255 arg1type arg1name; \
256 arg2type arg2name; \
257 arg3type arg3name; \
258 arg4type arg4name;
259
260#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000261
262/* Global variable holding the exception type for errors detected
263 by this module (but not argument type or memory errors, etc.). */
264
Guido van Rossum73624e91994-10-10 17:59:00 +0000265static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000266
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000267#ifdef USE_SSL
268static PyObject *SSLErrorObject;
269#endif /* USE_SSL */
270
Guido van Rossum30a685f1991-06-27 15:51:29 +0000271
272/* Convenience function to raise an error according to errno
273 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000274
Guido van Rossum73624e91994-10-10 17:59:00 +0000275static PyObject *
276PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000277{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000278#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000279 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000280 PyObject *v;
281 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000282 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000283 PyErr_SetObject(PySocket_Error, v);
284 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000285 }
286 return NULL;
287 }
288 else
289#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000290
291#if defined(PYOS_OS2)
292 if (sock_errno() != NO_ERROR) {
293 APIRET rc;
294 ULONG msglen;
295 char outbuf[100];
296 int myerrorcode = sock_errno();
297
298 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
299 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
300 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
301 if (rc == NO_ERROR) {
302 PyObject *v;
303
304 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
305 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
306 char *lastc = &outbuf[ strlen(outbuf)-1 ];
307 while (lastc > outbuf && isspace(*lastc))
308 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
309 }
310 v = Py_BuildValue("(is)", myerrorcode, outbuf);
311 if (v != NULL) {
312 PyErr_SetObject(PySocket_Error, v);
313 Py_DECREF(v);
314 }
315 return NULL;
316 }
317 }
318#endif
319
Guido van Rossum73624e91994-10-10 17:59:00 +0000320 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000321}
322
Guido van Rossum30a685f1991-06-27 15:51:29 +0000323
324/* The object holding a socket. It holds some extra information,
325 like the address family, which is used to decode socket address
326 arguments properly. */
327
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000328typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000329 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000330 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000331 int sock_family; /* Address family, e.g., AF_INET */
332 int sock_type; /* Socket type, e.g., SOCK_STREAM */
333 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000334 union sock_addr {
335 struct sockaddr_in in;
336#ifdef AF_UNIX
337 struct sockaddr_un un;
338#endif
339 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000340} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000341
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000342#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000343
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000344typedef struct {
345 PyObject_HEAD
346 PySocketSockObject *Socket; /* Socket on which we're layered */
347 PyObject *x_attr; /* Attributes dictionary */
348 SSL_CTX* ctx;
349 SSL* ssl;
350 X509* server_cert;
351 BIO* sbio;
352 char server[256];
353 char issuer[256];
354
355} SSLObject;
356
357staticforward PyTypeObject SSL_Type;
358staticforward int SSL_setattr(SSLObject *self, char *name, PyObject *v);
359staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
360staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
361
362#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
363
364#endif /* USE_SSL */
365
Guido van Rossum30a685f1991-06-27 15:51:29 +0000366/* A forward reference to the Socktype type object.
367 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000368 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000369 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000370
Guido van Rossum73624e91994-10-10 17:59:00 +0000371staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000372
Guido van Rossum30a685f1991-06-27 15:51:29 +0000373
374/* Create a new socket object.
375 This just creates the object and initializes it.
376 If the creation fails, return NULL and set an exception (implicit
377 in NEWOBJ()). */
378
Guido van Rossum73624e91994-10-10 17:59:00 +0000379static PySocketSockObject *
Fred Drakea04eaad2000-06-30 02:46:07 +0000380BUILD_FUNC_DEF_4(PySocketSock_New,SOCKET_T,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000381{
Guido van Rossum73624e91994-10-10 17:59:00 +0000382 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000383 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000384 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000385 if (s != NULL) {
386 s->sock_fd = fd;
387 s->sock_family = family;
388 s->sock_type = type;
389 s->sock_proto = proto;
390 }
391 return s;
392}
393
Guido van Rossum30a685f1991-06-27 15:51:29 +0000394
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000395/* Lock to allow python interpreter to continue, but only allow one
396 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000397#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000398PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000399#endif
400
401
Guido van Rossum30a685f1991-06-27 15:51:29 +0000402/* Convert a string specifying a host name or one of a few symbolic
403 names to a numeric IP address. This usually calls gethostbyname()
404 to do the work; the names "" and "<broadcast>" are special.
405 Return the length (should always be 4 bytes), or negative if
406 an error occurred; then an exception is raised. */
407
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000408static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000409BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000410{
411 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000412 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000413 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000414 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000415#ifdef HAVE_GETHOSTBYNAME_R
416 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000417#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
418 struct hostent_data data;
419#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000420 char buf[1001];
421 int buf_len = (sizeof buf) - 1;
422 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000423#endif
424#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000425 int result;
426#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000427#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000428
Guido van Rossuma376cc51996-12-05 23:43:35 +0000429 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000430 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000431 addr_ret->sin_addr.s_addr = INADDR_ANY;
432 return 4;
433 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000434 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000435 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
436 return 4;
437 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000438 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
439 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
440 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
441 addr_ret->sin_addr.s_addr = htonl(
442 ((long) d1 << 24) | ((long) d2 << 16) |
443 ((long) d3 << 8) | ((long) d4 << 0));
444 return 4;
445 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000446 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000447#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000448#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000449 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000450#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000451 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000452#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000453 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000454 result = gethostbyname_r(name, &hp_allocated, &data);
455 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000456#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000457#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000458#ifdef USE_GETHOSTBYNAME_LOCK
459 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000460#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000461 hp = gethostbyname(name);
462#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000463 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000464
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000465 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000466#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000467 /* Let's get real error message to return */
468 extern int h_errno;
469 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
470#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000471 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000472#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000473#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000474 PyThread_release_lock(gethostbyname_lock);
475#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000476 return -1;
477 }
478 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000479 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000480#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000481 PyThread_release_lock(gethostbyname_lock);
482#endif
483 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000484}
485
Guido van Rossum30a685f1991-06-27 15:51:29 +0000486
Guido van Rossum30a685f1991-06-27 15:51:29 +0000487/* Create a string object representing an IP address.
488 This is always a string of the form 'dd.dd.dd.dd' (with variable
489 size numbers). */
490
Guido van Rossum73624e91994-10-10 17:59:00 +0000491static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000492BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000493{
494 long x = ntohl(addr->sin_addr.s_addr);
495 char buf[100];
496 sprintf(buf, "%d.%d.%d.%d",
497 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
498 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000499 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000500}
501
502
503/* Create an object representing the given socket address,
504 suitable for passing it back to bind(), connect() etc.
505 The family field of the sockaddr structure is inspected
506 to determine what kind of address it really is. */
507
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000508/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000509static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000510BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000511{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000512 if (addrlen == 0) {
513 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000514 Py_INCREF(Py_None);
515 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000516 }
517
Guido van Rossumbcc20741998-08-04 22:53:56 +0000518#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000519 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000520 addr->sa_family = AF_INET;
521#endif
522
Guido van Rossum30a685f1991-06-27 15:51:29 +0000523 switch (addr->sa_family) {
524
525 case AF_INET:
526 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000527 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000528 PyObject *addrobj = makeipaddr(a);
529 PyObject *ret = NULL;
530 if (addrobj) {
531 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
532 Py_DECREF(addrobj);
533 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000534 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000535 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000536
Guido van Rossumb6775db1994-08-01 11:34:53 +0000537#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000538 case AF_UNIX:
539 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000540 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000541 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000542 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000543#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000544
545 /* More cases here... */
546
547 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000548 /* If we don't know the address family, don't raise an
549 exception -- return it as a tuple. */
550 return Py_BuildValue("is#",
551 addr->sa_family,
552 addr->sa_data,
553 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000554
Guido van Rossum30a685f1991-06-27 15:51:29 +0000555 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000556}
557
Guido van Rossum30a685f1991-06-27 15:51:29 +0000558
559/* Parse a socket address argument according to the socket object's
560 address family. Return 1 if the address was in the proper format,
561 0 of not. The address is returned through addr_ret, its length
562 through len_ret. */
563
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000564static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000565BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000566getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000567{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000568 switch (s->sock_family) {
569
Guido van Rossumb6775db1994-08-01 11:34:53 +0000570#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000571 case AF_UNIX:
572 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000573 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000574 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000575 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000576 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000577 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000578 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000579 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000580 PyErr_SetString(PySocket_Error,
581 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000582 return 0;
583 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000584 addr->sun_family = AF_UNIX;
585 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000586 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000587 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000588 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000589 return 1;
590 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000591#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000592
Guido van Rossum30a685f1991-06-27 15:51:29 +0000593 case AF_INET:
594 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000595 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000596 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000597 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000598 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000599 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000600 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000601 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000602 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000603 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000604 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000605 *addr_ret = (struct sockaddr *) addr;
606 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000607 return 1;
608 }
609
Guido van Rossum30a685f1991-06-27 15:51:29 +0000610 /* More cases here... */
611
612 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000613 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000614 return 0;
615
616 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000617}
618
Guido van Rossum30a685f1991-06-27 15:51:29 +0000619
Guido van Rossum710e1df1992-06-12 10:39:36 +0000620/* Get the address length according to the socket object's address family.
621 Return 1 if the family is known, 0 otherwise. The length is returned
622 through len_ret. */
623
624static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000625BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000626{
627 switch (s->sock_family) {
628
Guido van Rossumb6775db1994-08-01 11:34:53 +0000629#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000630 case AF_UNIX:
631 {
632 *len_ret = sizeof (struct sockaddr_un);
633 return 1;
634 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000635#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000636
637 case AF_INET:
638 {
639 *len_ret = sizeof (struct sockaddr_in);
640 return 1;
641 }
642
643 /* More cases here... */
644
645 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000646 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000647 return 0;
648
649 }
650}
651
652
Guido van Rossum30a685f1991-06-27 15:51:29 +0000653/* s.accept() method */
654
Guido van Rossum73624e91994-10-10 17:59:00 +0000655static PyObject *
656BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000657{
658 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000659 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000660 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000661 PyObject *sock = NULL;
662 PyObject *addr = NULL;
663 PyObject *res = NULL;
664
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000665 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000666 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000667 if (!getsockaddrlen(s, &addrlen))
668 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000669 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000670 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000671 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000672#ifdef MS_WINDOWS
673 if (newfd == INVALID_SOCKET)
674#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000675 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000676#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000677 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000678
Guido van Rossum30a685f1991-06-27 15:51:29 +0000679 /* Create the new object with unspecified family,
680 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000681 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000682 s->sock_family,
683 s->sock_type,
684 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000685 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000686 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000687 goto finally;
688 }
689 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
690 goto finally;
691
692 if (!(res = Py_BuildValue("OO", sock, addr)))
693 goto finally;
694
695 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000696 Py_XDECREF(sock);
697 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000698 return res;
699}
700
Guido van Rossum82a5c661998-07-07 20:45:43 +0000701static char accept_doc[] =
702"accept() -> (socket object, address info)\n\
703\n\
704Wait for an incoming connection. Return a new socket representing the\n\
705connection, and the address of the client. For IP sockets, the address\n\
706info is a pair (hostaddr, port).";
707
Guido van Rossum30a685f1991-06-27 15:51:29 +0000708
Guido van Rossume4485b01994-09-07 14:32:49 +0000709/* s.setblocking(1 | 0) method */
710
Guido van Rossum73624e91994-10-10 17:59:00 +0000711static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000712BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000713{
714 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000715#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000716 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000717#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000718 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000719 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000720 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000721#ifdef __BEOS__
722 block = !block;
723 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
724 (void *)(&block), sizeof( int ) );
725#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000726#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000727#ifdef PYOS_OS2
728 block = !block;
729 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
730#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000731 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
732 if (block)
733 delay_flag &= (~O_NDELAY);
734 else
735 delay_flag |= O_NDELAY;
736 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000737#endif /* !PYOS_OS2 */
738#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000739 block = !block;
740 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000741#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000742#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000743 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000744
Guido van Rossum73624e91994-10-10 17:59:00 +0000745 Py_INCREF(Py_None);
746 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000747}
Guido van Rossume4485b01994-09-07 14:32:49 +0000748
Guido van Rossum82a5c661998-07-07 20:45:43 +0000749static char setblocking_doc[] =
750"setblocking(flag)\n\
751\n\
752Set the socket to blocking (flag is true) or non-blocking (false).\n\
753This uses the FIONBIO ioctl with the O_NDELAY flag.";
754
Guido van Rossume4485b01994-09-07 14:32:49 +0000755
Guido van Rossumaee08791992-09-08 09:05:33 +0000756/* s.setsockopt() method.
757 With an integer third argument, sets an integer option.
758 With a string third argument, sets an option from a buffer;
759 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000760
Guido van Rossum73624e91994-10-10 17:59:00 +0000761static PyObject *
762BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000763{
764 int level;
765 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000766 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000767 char *buf;
768 int buflen;
769 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000770
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000771 if (PyArg_ParseTuple(args, "iii:setsockopt",
772 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000773 buf = (char *) &flag;
774 buflen = sizeof flag;
775 }
776 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000777 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000778 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
779 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000780 return NULL;
781 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000782 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000783 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000784 return PySocket_Err();
785 Py_INCREF(Py_None);
786 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000787}
788
Guido van Rossum82a5c661998-07-07 20:45:43 +0000789static char setsockopt_doc[] =
790"setsockopt(level, option, value)\n\
791\n\
792Set a socket option. See the Unix manual for level and option.\n\
793The value argument can either be an integer or a string.";
794
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000795
Guido van Rossumaee08791992-09-08 09:05:33 +0000796/* s.getsockopt() method.
797 With two arguments, retrieves an integer option.
798 With a third integer argument, retrieves a string buffer of that size;
799 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000800
Guido van Rossum73624e91994-10-10 17:59:00 +0000801static PyObject *
802BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000803{
804 int level;
805 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000806 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000807 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000808 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000809
Guido van Rossumbcc20741998-08-04 22:53:56 +0000810#ifdef __BEOS__
811/* We have incomplete socket support. */
812 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
813 return NULL;
814#else
815
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000816 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
817 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000818 return NULL;
819
820 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000821 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000822 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000823 res = getsockopt(s->sock_fd, level, optname,
824 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000825 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000826 return PySocket_Err();
827 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000828 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000829 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000830 PyErr_SetString(PySocket_Error,
831 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000832 return NULL;
833 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000834 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000835 if (buf == NULL)
836 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000837 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000838 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000839 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000840 Py_DECREF(buf);
841 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000842 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000843 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000844 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000845#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000846}
847
Guido van Rossum82a5c661998-07-07 20:45:43 +0000848static char getsockopt_doc[] =
849"getsockopt(level, option[, buffersize]) -> value\n\
850\n\
851Get a socket option. See the Unix manual for level and option.\n\
852If a nonzero buffersize argument is given, the return value is a\n\
853string of that length; otherwise it is an integer.";
854
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000855
Fred Drake728819a2000-07-01 03:40:12 +0000856/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000857
Guido van Rossum73624e91994-10-10 17:59:00 +0000858static PyObject *
859BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000860{
861 struct sockaddr *addr;
862 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000863 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000864 PyObject *addro;
865 if (!PyArg_ParseTuple(args, "O:bind", &addro))
866 return NULL;
867 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000868 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000869 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000870 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000871 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000872 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000873 return PySocket_Err();
874 Py_INCREF(Py_None);
875 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000876}
877
Guido van Rossum82a5c661998-07-07 20:45:43 +0000878static char bind_doc[] =
879"bind(address)\n\
880\n\
881Bind the socket to a local address. For IP sockets, the address is a\n\
882pair (host, port); the host must refer to the local host.";
883
Guido van Rossum30a685f1991-06-27 15:51:29 +0000884
885/* s.close() method.
886 Set the file descriptor to -1 so operations tried subsequently
887 will surely fail. */
888
Guido van Rossum73624e91994-10-10 17:59:00 +0000889static PyObject *
890BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000891{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000892 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000893 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000894 if (s->sock_fd != -1) {
895 Py_BEGIN_ALLOW_THREADS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000896 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum08481461996-10-12 14:07:22 +0000897 Py_END_ALLOW_THREADS
898 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000899 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000900 Py_INCREF(Py_None);
901 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000902}
903
Guido van Rossum82a5c661998-07-07 20:45:43 +0000904static char close_doc[] =
905"close()\n\
906\n\
907Close the socket. It cannot be used after this call.";
908
Guido van Rossum30a685f1991-06-27 15:51:29 +0000909
Fred Drake728819a2000-07-01 03:40:12 +0000910/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000911
Guido van Rossum73624e91994-10-10 17:59:00 +0000912static PyObject *
913BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000914{
915 struct sockaddr *addr;
916 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000917 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000918 PyObject *addro;
919 if (!PyArg_ParseTuple(args, "O:connect", &addro))
920 return NULL;
921 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000922 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000923 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000924 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000925 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000926 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000927 return PySocket_Err();
928 Py_INCREF(Py_None);
929 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000930}
931
Guido van Rossum82a5c661998-07-07 20:45:43 +0000932static char connect_doc[] =
933"connect(address)\n\
934\n\
935Connect the socket to a remote address. For IP sockets, the address\n\
936is a pair (host, port).";
937
Guido van Rossum30a685f1991-06-27 15:51:29 +0000938
Fred Drake728819a2000-07-01 03:40:12 +0000939/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000940
941static PyObject *
942BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
943{
944 struct sockaddr *addr;
945 int addrlen;
946 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000947 PyObject *addro;
948 if (!PyArg_ParseTuple(args, "O:connect_ex", &addro))
949 return NULL;
950 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000951 return NULL;
952 Py_BEGIN_ALLOW_THREADS
953 res = connect(s->sock_fd, addr, addrlen);
954 Py_END_ALLOW_THREADS
955 if (res != 0)
956 res = errno;
957 return PyInt_FromLong((long) res);
958}
959
Guido van Rossum82a5c661998-07-07 20:45:43 +0000960static char connect_ex_doc[] =
961"connect_ex(address)\n\
962\n\
963This is like connect(address), but returns an error code (the errno value)\n\
964instead of raising an exception when an error occurs.";
965
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000966
Guido van Rossumed233a51992-06-23 09:07:03 +0000967/* s.fileno() method */
968
Guido van Rossum73624e91994-10-10 17:59:00 +0000969static PyObject *
970BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000971{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000972 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +0000973 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +0000974#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +0000975 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +0000976#else
977 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
978#endif
Guido van Rossumed233a51992-06-23 09:07:03 +0000979}
980
Guido van Rossum82a5c661998-07-07 20:45:43 +0000981static char fileno_doc[] =
982"fileno() -> integer\n\
983\n\
984Return the integer file descriptor of the socket.";
985
Guido van Rossumed233a51992-06-23 09:07:03 +0000986
Guido van Rossumbe32c891996-06-20 16:25:29 +0000987#ifndef NO_DUP
988/* s.dup() method */
989
990static PyObject *
991BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
992{
Fred Drakea04eaad2000-06-30 02:46:07 +0000993 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000994 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000995 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000996 return NULL;
997 newfd = dup(s->sock_fd);
998 if (newfd < 0)
999 return PySocket_Err();
1000 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001001 s->sock_family,
1002 s->sock_type,
1003 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001004 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001005 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001006 return sock;
1007}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001008
1009static char dup_doc[] =
1010"dup() -> socket object\n\
1011\n\
1012Return a new socket object connected to the same system resource.";
1013
Guido van Rossumbe32c891996-06-20 16:25:29 +00001014#endif
1015
1016
Guido van Rossumc89705d1992-11-26 08:54:07 +00001017/* s.getsockname() method */
1018
Guido van Rossum73624e91994-10-10 17:59:00 +00001019static PyObject *
1020BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001021{
1022 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001023 int res;
1024 socklen_t addrlen;
1025
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001026 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001027 return NULL;
1028 if (!getsockaddrlen(s, &addrlen))
1029 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001030 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001031 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001032 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001033 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001034 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001035 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001036 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1037}
1038
Guido van Rossum82a5c661998-07-07 20:45:43 +00001039static char getsockname_doc[] =
1040"getsockname() -> address info\n\
1041\n\
1042Return the address of the local endpoint. For IP sockets, the address\n\
1043info is a pair (hostaddr, port).";
1044
Guido van Rossumc89705d1992-11-26 08:54:07 +00001045
Guido van Rossumb6775db1994-08-01 11:34:53 +00001046#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001047/* s.getpeername() method */
1048
Guido van Rossum73624e91994-10-10 17:59:00 +00001049static PyObject *
1050BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001051{
1052 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001053 int res;
1054 socklen_t addrlen;
1055
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001056 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001057 return NULL;
1058 if (!getsockaddrlen(s, &addrlen))
1059 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001060 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001061 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001062 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001063 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001064 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001065 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1066}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001067
1068static char getpeername_doc[] =
1069"getpeername() -> address info\n\
1070\n\
1071Return the address of the remote endpoint. For IP sockets, the address\n\
1072info is a pair (hostaddr, port).";
1073
Guido van Rossumb6775db1994-08-01 11:34:53 +00001074#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001075
1076
Guido van Rossum30a685f1991-06-27 15:51:29 +00001077/* s.listen(n) method */
1078
Guido van Rossum73624e91994-10-10 17:59:00 +00001079static PyObject *
1080BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001081{
1082 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001083 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001084 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001085 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001086 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001087 if (backlog < 1)
1088 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001089 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001090 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001091 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001092 return PySocket_Err();
1093 Py_INCREF(Py_None);
1094 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001095}
1096
Guido van Rossum82a5c661998-07-07 20:45:43 +00001097static char listen_doc[] =
1098"listen(backlog)\n\
1099\n\
1100Enable a server to accept connections. The backlog argument must be at\n\
1101least 1; it specifies the number of unaccepted connection that the system\n\
1102will allow before refusing new connections.";
1103
1104
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001105#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001106/* s.makefile(mode) method.
1107 Create a new open file object referring to a dupped version of
1108 the socket's file descriptor. (The dup() call is necessary so
1109 that the open file and socket objects may be closed independent
1110 of each other.)
1111 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1112
Guido van Rossum73624e91994-10-10 17:59:00 +00001113static PyObject *
1114BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001115{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001116 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +00001117 char *mode = "r";
1118 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001119#ifdef MS_WIN32
1120 intptr_t fd;
1121#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001122 int fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001123#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001124 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001125 PyObject *f;
1126
Guido van Rossum43713e52000-02-29 13:59:29 +00001127 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001128 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001129#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001130 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1131 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001132#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001133 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001134#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001135 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001136 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001137 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001138 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001139 }
1140 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1141 if (f != NULL)
1142 PyFile_SetBufSize(f, bufsize);
1143 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001144}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001145
1146static char makefile_doc[] =
1147"makefile([mode[, buffersize]]) -> file object\n\
1148\n\
1149Return a regular file object corresponding to the socket.\n\
1150The mode and buffersize arguments are as for the built-in open() function.";
1151
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001152#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001153
Guido van Rossum82a5c661998-07-07 20:45:43 +00001154
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001155/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001156
Guido van Rossum73624e91994-10-10 17:59:00 +00001157static PyObject *
1158BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001159{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001160 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001161 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001162 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001163 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001164 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001165 if (buf == NULL)
1166 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001167 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001168 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001169 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001170 if (n < 0) {
1171 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001172 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001173 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001174 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001175 return NULL;
1176 return buf;
1177}
1178
Guido van Rossum82a5c661998-07-07 20:45:43 +00001179static char recv_doc[] =
1180"recv(buffersize[, flags]) -> data\n\
1181\n\
1182Receive up to buffersize bytes from the socket. For the optional flags\n\
1183argument, see the Unix manual. When no data is available, block until\n\
1184at least one byte is available or until the remote end is closed. When\n\
1185the remote end is closed and all data is read, return the empty string.";
1186
Guido van Rossum30a685f1991-06-27 15:51:29 +00001187
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001188/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001189
Guido van Rossum73624e91994-10-10 17:59:00 +00001190static PyObject *
1191BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001192{
1193 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001194 PyObject *buf = NULL;
1195 PyObject *addr = NULL;
1196 PyObject *ret = NULL;
1197
Guido van Rossumff3ab422000-04-24 15:16:03 +00001198 int len, n, flags = 0;
1199 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001200 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001201 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001202 if (!getsockaddrlen(s, &addrlen))
1203 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001204 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001205 if (buf == NULL)
1206 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001207 Py_BEGIN_ALLOW_THREADS
1208 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001209#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001210#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001211 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001212#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001213 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001214#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001215#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001216 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001217#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001218 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001219 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001220 if (n < 0) {
1221 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001222 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001223 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001224 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001225 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001226
1227 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1228 goto finally;
1229
Guido van Rossum73624e91994-10-10 17:59:00 +00001230 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001231 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001232 Py_XDECREF(addr);
1233 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001234 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001235}
1236
Guido van Rossum82a5c661998-07-07 20:45:43 +00001237static char recvfrom_doc[] =
1238"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1239\n\
1240Like recv(buffersize, flags) but also return the sender's address info.";
1241
Guido van Rossum30a685f1991-06-27 15:51:29 +00001242
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001243/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001244
Guido van Rossum73624e91994-10-10 17:59:00 +00001245static PyObject *
1246BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001247{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001248 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001249 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001250 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001251 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001252 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001253 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001254 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001255 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001256 return PySocket_Err();
1257 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001258}
1259
Guido van Rossum82a5c661998-07-07 20:45:43 +00001260static char send_doc[] =
1261"send(data[, flags])\n\
1262\n\
1263Send a data string to the socket. For the optional flags\n\
1264argument, see the Unix manual.";
1265
Guido van Rossum30a685f1991-06-27 15:51:29 +00001266
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001267/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001268
Guido van Rossum73624e91994-10-10 17:59:00 +00001269static PyObject *
1270BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001271{
Guido van Rossum73624e91994-10-10 17:59:00 +00001272 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001273 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001274 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001275 int addrlen, len, n, flags;
1276 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001277 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001278 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001279 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1280 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001281 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001282 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001283 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001284 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001285 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001286 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001287 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001288 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001289 return PySocket_Err();
1290 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001291}
1292
Guido van Rossum82a5c661998-07-07 20:45:43 +00001293static char sendto_doc[] =
1294"sendto(data[, flags], address)\n\
1295\n\
1296Like send(data, flags) but allows specifying the destination address.\n\
1297For IP sockets, the address is a pair (hostaddr, port).";
1298
Guido van Rossum30a685f1991-06-27 15:51:29 +00001299
1300/* s.shutdown(how) method */
1301
Guido van Rossum73624e91994-10-10 17:59:00 +00001302static PyObject *
1303BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001304{
1305 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001306 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001307 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001308 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001309 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001310 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001311 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001312 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001313 return PySocket_Err();
1314 Py_INCREF(Py_None);
1315 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001316}
1317
Guido van Rossum82a5c661998-07-07 20:45:43 +00001318static char shutdown_doc[] =
1319"shutdown(flag)\n\
1320\n\
1321Shut down the reading side of the socket (flag == 0), the writing side\n\
1322of the socket (flag == 1), or both ends (flag == 2).";
1323
Guido van Rossum30a685f1991-06-27 15:51:29 +00001324
1325/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001326
Guido van Rossum73624e91994-10-10 17:59:00 +00001327static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001328 {"accept", (PyCFunction)PySocketSock_accept, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001329 accept_doc},
Fred Drake728819a2000-07-01 03:40:12 +00001330 {"bind", (PyCFunction)PySocketSock_bind, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001331 bind_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001332 {"close", (PyCFunction)PySocketSock_close, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001333 close_doc},
Fred Drake728819a2000-07-01 03:40:12 +00001334 {"connect", (PyCFunction)PySocketSock_connect, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001335 connect_doc},
Fred Drake728819a2000-07-01 03:40:12 +00001336 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001337 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001338#ifndef NO_DUP
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001339 {"dup", (PyCFunction)PySocketSock_dup, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001340 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001341#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001342 {"fileno", (PyCFunction)PySocketSock_fileno, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001343 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001344#ifdef HAVE_GETPEERNAME
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001345 {"getpeername", (PyCFunction)PySocketSock_getpeername, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001346 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001347#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001348 {"getsockname", (PyCFunction)PySocketSock_getsockname, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001349 getsockname_doc},
1350 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1351 getsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001352 {"listen", (PyCFunction)PySocketSock_listen, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001353 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001354#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001355 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1356 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001357#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001358 {"recv", (PyCFunction)PySocketSock_recv, 1,
1359 recv_doc},
1360 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1361 recvfrom_doc},
1362 {"send", (PyCFunction)PySocketSock_send, 1,
1363 send_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001364 {"sendto", (PyCFunction)PySocketSock_sendto, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001365 sendto_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001366 {"setblocking", (PyCFunction)PySocketSock_setblocking, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001367 setblocking_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001368 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001369 setsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001370 {"shutdown", (PyCFunction)PySocketSock_shutdown, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001371 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001372 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001373};
1374
Guido van Rossum30a685f1991-06-27 15:51:29 +00001375
Guido van Rossum73624e91994-10-10 17:59:00 +00001376/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001377 First close the file description. */
1378
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001379static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001380BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001381{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001382 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001383 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001384 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001385}
1386
Guido van Rossum30a685f1991-06-27 15:51:29 +00001387
1388/* Return a socket object's named attribute. */
1389
Guido van Rossum73624e91994-10-10 17:59:00 +00001390static PyObject *
1391BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001392{
Guido van Rossum73624e91994-10-10 17:59:00 +00001393 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001394}
1395
Guido van Rossum30a685f1991-06-27 15:51:29 +00001396
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001397static PyObject *
1398BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1399{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001400 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001401#if SIZEOF_SOCKET_T > SIZEOF_LONG
1402 if (s->sock_fd > LONG_MAX) {
1403 /* this can occur on Win64, and actually there is a special
1404 ugly printf formatter for decimal pointer length integer
1405 printing, only bother if necessary*/
1406 PyErr_SetString(PyExc_OverflowError,
1407 "no printf formatter to display the socket descriptor in decimal");
1408 return NULL;
1409 }
1410#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001411 sprintf(buf,
Fred Drakea04eaad2000-06-30 02:46:07 +00001412 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1413 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001414 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001415}
1416
1417
Guido van Rossumb6775db1994-08-01 11:34:53 +00001418/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001419
Guido van Rossum73624e91994-10-10 17:59:00 +00001420static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001421 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001422 0,
1423 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001424 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001425 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001426 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001427 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001428 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001429 0, /*tp_setattr*/
1430 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001431 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001432 0, /*tp_as_number*/
1433 0, /*tp_as_sequence*/
1434 0, /*tp_as_mapping*/
1435};
1436
Guido van Rossum30a685f1991-06-27 15:51:29 +00001437
Guido van Rossum81194471991-07-27 21:42:02 +00001438/* Python interface to gethostname(). */
1439
1440/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001441static PyObject *
1442BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001443{
1444 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001445 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001446 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001447 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001448 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001449 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001450 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001451 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001452 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001453 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001454 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001455}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001456
Guido van Rossum82a5c661998-07-07 20:45:43 +00001457static char gethostname_doc[] =
1458"gethostname() -> string\n\
1459\n\
1460Return the current host name.";
1461
Guido van Rossumff4949e1992-08-05 19:58:53 +00001462
Guido van Rossum30a685f1991-06-27 15:51:29 +00001463/* Python interface to gethostbyname(name). */
1464
1465/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001466static PyObject *
1467BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001468{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001469 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001470 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001471 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001472 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001473 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001474 return NULL;
1475 return makeipaddr(&addrbuf);
1476}
1477
Guido van Rossum82a5c661998-07-07 20:45:43 +00001478static char gethostbyname_doc[] =
1479"gethostbyname(host) -> address\n\
1480\n\
1481Return the IP address (a string of the form '255.255.255.255') for a host.";
1482
1483
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001484/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1485
1486static PyObject *
1487gethost_common(h, addr)
1488 struct hostent *h;
1489 struct sockaddr_in *addr;
1490{
1491 char **pch;
1492 PyObject *rtn_tuple = (PyObject *)NULL;
1493 PyObject *name_list = (PyObject *)NULL;
1494 PyObject *addr_list = (PyObject *)NULL;
1495 PyObject *tmp;
1496 if (h == NULL) {
1497#ifdef HAVE_HSTRERROR
1498 /* Let's get real error message to return */
1499 extern int h_errno;
1500 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1501#else
1502 PyErr_SetString(PySocket_Error, "host not found");
1503#endif
1504 return NULL;
1505 }
1506 if ((name_list = PyList_New(0)) == NULL)
1507 goto err;
1508 if ((addr_list = PyList_New(0)) == NULL)
1509 goto err;
1510 for (pch = h->h_aliases; *pch != NULL; pch++) {
1511 int status;
1512 tmp = PyString_FromString(*pch);
1513 if (tmp == NULL)
1514 goto err;
1515 status = PyList_Append(name_list, tmp);
1516 Py_DECREF(tmp);
1517 if (status)
1518 goto err;
1519 }
1520 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1521 int status;
1522 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1523 tmp = makeipaddr(addr);
1524 if (tmp == NULL)
1525 goto err;
1526 status = PyList_Append(addr_list, tmp);
1527 Py_DECREF(tmp);
1528 if (status)
1529 goto err;
1530 }
1531 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1532 err:
1533 Py_XDECREF(name_list);
1534 Py_XDECREF(addr_list);
1535 return rtn_tuple;
1536}
1537
1538
1539/* Python interface to gethostbyname_ex(name). */
1540
1541/*ARGSUSED*/
1542static PyObject *
1543BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1544{
1545 char *name;
1546 struct hostent *h;
1547 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001548 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001549#ifdef HAVE_GETHOSTBYNAME_R
1550 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001551#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1552 struct hostent_data data;
1553#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001554 char buf[16384];
1555 int buf_len = (sizeof buf) - 1;
1556 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001557#endif
1558#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001559 int result;
1560#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001561#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001562 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001563 return NULL;
1564 if (setipaddr(name, &addr) < 0)
1565 return NULL;
1566 Py_BEGIN_ALLOW_THREADS
1567#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001568#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001569 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001570#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001571 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001572#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001573 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001574 result = gethostbyname_r(name, &hp_allocated, &data);
1575 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001576#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001577#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001578#ifdef USE_GETHOSTBYNAME_LOCK
1579 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001580#endif
1581 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001582#endif /* HAVE_GETHOSTBYNAME_R */
1583 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001584 ret = gethost_common(h, &addr);
1585#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001586 PyThread_release_lock(gethostbyname_lock);
1587#endif
1588 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001589}
1590
1591static char ghbn_ex_doc[] =
1592"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1593\n\
1594Return the true host name, a list of aliases, and a list of IP addresses,\n\
1595for a host. The host argument is a string giving a host name or IP number.";
1596
1597
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001598/* Python interface to gethostbyaddr(IP). */
1599
1600/*ARGSUSED*/
1601static PyObject *
1602BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1603{
1604 struct sockaddr_in addr;
1605 char *ip_num;
1606 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001607 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001608#ifdef HAVE_GETHOSTBYNAME_R
1609 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001610#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1611 struct hostent_data data;
1612#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001613 char buf[16384];
1614 int buf_len = (sizeof buf) - 1;
1615 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001616#endif
1617#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001618 int result;
1619#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001620#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001621
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001622 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001623 return NULL;
1624 if (setipaddr(ip_num, &addr) < 0)
1625 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001626 Py_BEGIN_ALLOW_THREADS
1627#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001628#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001629 result = gethostbyaddr_r((char *)&addr.sin_addr,
1630 sizeof(addr.sin_addr),
1631 AF_INET, &hp_allocated, buf, buf_len,
1632 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001633#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001634 h = gethostbyaddr_r((char *)&addr.sin_addr,
1635 sizeof(addr.sin_addr),
1636 AF_INET,
1637 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001638#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001639 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001640 result = gethostbyaddr_r((char *)&addr.sin_addr,
1641 sizeof(addr.sin_addr),
1642 AF_INET, &hp_allocated, &data);
1643 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001644#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001645#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001646#ifdef USE_GETHOSTBYNAME_LOCK
1647 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001648#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001649 h = gethostbyaddr((char *)&addr.sin_addr,
1650 sizeof(addr.sin_addr),
1651 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001652#endif /* HAVE_GETHOSTBYNAME_R */
1653 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001654 ret = gethost_common(h, &addr);
1655#ifdef USE_GETHOSTBYNAME_LOCK
1656 PyThread_release_lock(gethostbyname_lock);
1657#endif
1658 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001659}
1660
Guido van Rossum82a5c661998-07-07 20:45:43 +00001661static char gethostbyaddr_doc[] =
1662"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1663\n\
1664Return the true host name, a list of aliases, and a list of IP addresses,\n\
1665for a host. The host argument is a string giving a host name or IP number.";
1666
Guido van Rossum30a685f1991-06-27 15:51:29 +00001667
1668/* Python interface to getservbyname(name).
1669 This only returns the port number, since the other info is already
1670 known or not useful (like the list of aliases). */
1671
1672/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001673static PyObject *
1674BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001675{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001676 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001677 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001678 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001679 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001680 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001681 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001682 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001683 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001684 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001685 return NULL;
1686 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001687 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001688}
1689
Guido van Rossum82a5c661998-07-07 20:45:43 +00001690static char getservbyname_doc[] =
1691"getservbyname(servicename, protocolname) -> integer\n\
1692\n\
1693Return a port number from a service name and protocol name.\n\
1694The protocol name should be 'tcp' or 'udp'.";
1695
Guido van Rossum30a685f1991-06-27 15:51:29 +00001696
Guido van Rossum3901d851996-12-19 16:35:04 +00001697/* Python interface to getprotobyname(name).
1698 This only returns the protocol number, since the other info is
1699 already known or not useful (like the list of aliases). */
1700
1701/*ARGSUSED*/
1702static PyObject *
1703BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1704{
1705 char *name;
1706 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001707#ifdef __BEOS__
1708/* Not available in BeOS yet. - [cjh] */
1709 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1710 return NULL;
1711#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001712 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001713 return NULL;
1714 Py_BEGIN_ALLOW_THREADS
1715 sp = getprotobyname(name);
1716 Py_END_ALLOW_THREADS
1717 if (sp == NULL) {
1718 PyErr_SetString(PySocket_Error, "protocol not found");
1719 return NULL;
1720 }
1721 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001722#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001723}
1724
Guido van Rossum82a5c661998-07-07 20:45:43 +00001725static char getprotobyname_doc[] =
1726"getprotobyname(name) -> integer\n\
1727\n\
1728Return the protocol number for the named protocol. (Rarely used.)";
1729
Guido van Rossum3901d851996-12-19 16:35:04 +00001730
Guido van Rossum30a685f1991-06-27 15:51:29 +00001731/* Python interface to socket(family, type, proto).
1732 The third (protocol) argument is optional.
1733 Return a new socket object. */
1734
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001735/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001736static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001737BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001738{
Guido van Rossum73624e91994-10-10 17:59:00 +00001739 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001740 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001741 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001742 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001743 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001744 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001745 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001746 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001747#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001748 if (fd == INVALID_SOCKET)
1749#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001750 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001751#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001752 return PySocket_Err();
1753 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001754 /* If the object can't be created, don't forget to close the
1755 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001756 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001757 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001758 /* From now on, ignore SIGPIPE and let the error checking
1759 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001760#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001761 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001762#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001763 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001764}
1765
Guido van Rossum82a5c661998-07-07 20:45:43 +00001766static char socket_doc[] =
1767"socket(family, type[, proto]) -> socket object\n\
1768\n\
1769Open a socket of the given type. The family argument specifies the\n\
1770address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1771The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1772or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1773specifying the default protocol.";
1774
1775
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001776#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001777/* Create a socket object from a numeric file description.
1778 Useful e.g. if stdin is a socket.
1779 Additional arguments as for socket(). */
1780
1781/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001782static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001783BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001784{
Guido van Rossum73624e91994-10-10 17:59:00 +00001785 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001786 SOCKET_T fd;
1787 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001788 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1789 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001790 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001791 /* Dup the fd so it and the socket can be closed independently */
1792 fd = dup(fd);
1793 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001794 return PySocket_Err();
1795 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001796 /* From now on, ignore SIGPIPE and let the error checking
1797 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001798#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001799 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001800#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001801 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001802}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001803
1804static char fromfd_doc[] =
1805"fromfd(fd, family, type[, proto]) -> socket object\n\
1806\n\
1807Create a socket object from the given file descriptor.\n\
1808The remaining arguments are the same as for socket().";
1809
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001810#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001811
Guido van Rossum82a5c661998-07-07 20:45:43 +00001812
Guido van Rossum006bf911996-06-12 04:04:55 +00001813static PyObject *
1814BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1815{
1816 int x1, x2;
1817
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001818 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001819 return NULL;
1820 }
1821 x2 = (int)ntohs((short)x1);
1822 return PyInt_FromLong(x2);
1823}
1824
Guido van Rossum82a5c661998-07-07 20:45:43 +00001825static char ntohs_doc[] =
1826"ntohs(integer) -> integer\n\
1827\n\
1828Convert a 16-bit integer from network to host byte order.";
1829
1830
Guido van Rossum006bf911996-06-12 04:04:55 +00001831static PyObject *
1832BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1833{
1834 int x1, x2;
1835
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001836 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001837 return NULL;
1838 }
1839 x2 = ntohl(x1);
1840 return PyInt_FromLong(x2);
1841}
1842
Guido van Rossum82a5c661998-07-07 20:45:43 +00001843static char ntohl_doc[] =
1844"ntohl(integer) -> integer\n\
1845\n\
1846Convert a 32-bit integer from network to host byte order.";
1847
1848
Guido van Rossum006bf911996-06-12 04:04:55 +00001849static PyObject *
1850BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1851{
1852 int x1, x2;
1853
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001854 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001855 return NULL;
1856 }
1857 x2 = (int)htons((short)x1);
1858 return PyInt_FromLong(x2);
1859}
1860
Guido van Rossum82a5c661998-07-07 20:45:43 +00001861static char htons_doc[] =
1862"htons(integer) -> integer\n\
1863\n\
1864Convert a 16-bit integer from host to network byte order.";
1865
1866
Guido van Rossum006bf911996-06-12 04:04:55 +00001867static PyObject *
1868BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1869{
1870 int x1, x2;
1871
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001872 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001873 return NULL;
1874 }
1875 x2 = htonl(x1);
1876 return PyInt_FromLong(x2);
1877}
1878
Guido van Rossum82a5c661998-07-07 20:45:43 +00001879static char htonl_doc[] =
1880"htonl(integer) -> integer\n\
1881\n\
1882Convert a 32-bit integer from host to network byte order.";
1883
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001884/*
1885 * socket.inet_aton() and socket.inet_ntoa() functions
1886 *
1887 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
1888 *
1889 */
1890
1891static char inet_aton_doc[] =
1892"inet_aton(string) -> packed 32-bit IP representation\n\
1893\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001894Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001895binary format used in low-level network functions.";
1896
1897static PyObject*
1898BUILD_FUNC_DEF_2(PySocket_inet_aton, PyObject *, self, PyObject *, args)
1899{
Guido van Rossuma2e48551999-09-09 15:42:59 +00001900#ifndef INADDR_NONE
1901#define INADDR_NONE (-1)
1902#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001903
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001904 /* Have to use inet_addr() instead */
1905 char *ip_addr;
1906 long packed_addr;
1907
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001908 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001909 return NULL;
1910 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00001911#ifdef USE_GUSI1
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001912 packed_addr = (long)inet_addr(ip_addr).s_addr;
1913#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001914 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001915#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001916
1917 if (packed_addr == INADDR_NONE) { /* invalid address */
1918 PyErr_SetString(PySocket_Error,
1919 "illegal IP address string passed to inet_aton");
1920 return NULL;
1921 }
1922
1923 return PyString_FromStringAndSize((char *) &packed_addr,
1924 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001925}
1926
1927static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00001928"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001929\n\
1930Convert an IP address from 32-bit packed binary format to string format";
1931
1932static PyObject*
1933BUILD_FUNC_DEF_2(PySocket_inet_ntoa, PyObject *, self, PyObject *, args)
1934{
1935 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001936 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001937 struct in_addr packed_addr;
1938
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001939 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001940 return NULL;
1941 }
1942
1943 if (addr_len != sizeof(packed_addr)) {
1944 PyErr_SetString(PySocket_Error,
1945 "packed IP wrong length for inet_ntoa");
1946 return NULL;
1947 }
1948
1949 memcpy(&packed_addr, packed_str, addr_len);
1950
1951 return PyString_FromString(inet_ntoa(packed_addr));
1952}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001953
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001954
1955#ifdef USE_SSL
1956
1957/* This is a C function to be called for new object initialization */
1958static SSLObject *
1959BUILD_FUNC_DEF_3(newSSLObject,
1960 PySocketSockObject *,Sock, char*,key_file, char*,cert_file)
1961{
1962 SSLObject *self;
1963 char *str;
1964
1965#if 0
1966 meth=SSLv23_client_method();
1967 meth=SSLv3_client_method();
1968 meth=SSLv2_client_method();
1969#endif
1970
Guido van Rossumb18618d2000-05-03 23:44:39 +00001971 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001972 if (self == NULL){
1973 PyErr_SetObject(SSLErrorObject,
1974 PyString_FromString("newSSLObject error"));
1975 return NULL;
1976 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001977 memset(self->server, '\0', sizeof(char) * 256);
1978 memset(self->issuer, '\0', sizeof(char) * 256);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001979
1980 self->x_attr = PyDict_New();
1981 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
1982 if (self->ctx == NULL) {
1983 PyErr_SetObject(SSLErrorObject,
1984 PyString_FromString("SSL_CTX_new error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00001985 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001986 return NULL;
1987 }
1988
1989 if ( (key_file && !cert_file) || (!key_file && cert_file) )
1990 {
1991 PyErr_SetObject(SSLErrorObject,
1992 PyString_FromString(
1993 "Both the key & certificate files must be specified"));
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)
1999 {
2000 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
2001 SSL_FILETYPE_PEM) < 1)
2002 {
2003 PyErr_SetObject(SSLErrorObject,
2004 PyString_FromString(
2005 "SSL_CTX_use_PrivateKey_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002006 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002007 return NULL;
2008 }
2009
2010 if (SSL_CTX_use_certificate_chain_file(self->ctx,
2011 cert_file) < 1)
2012 {
2013 PyErr_SetObject(SSLErrorObject,
2014 PyString_FromString(
2015 "SSL_CTX_use_certificate_chain_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002016 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002017 return NULL;
2018 }
2019 }
2020
2021 SSL_CTX_set_verify(self->ctx,
2022 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2023 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2024 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2025 SSL_set_connect_state(self->ssl);
2026
2027 if ((SSL_connect(self->ssl)) == -1) {
2028 /* Actually negotiate SSL connection */
2029 PyErr_SetObject(SSLErrorObject,
2030 PyString_FromString("SSL_connect error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002031 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002032 return NULL;
2033 }
2034 self->ssl->debug = 1;
2035
2036 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2037 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2038 self->server, 256);
2039 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2040 self->issuer, 256);
2041 }
2042 self->x_attr = NULL;
2043 self->Socket = Sock;
2044 Py_INCREF(self->Socket);
2045 return self;
2046}
2047
2048/* This is the Python function called for new object initialization */
2049static PyObject *
2050BUILD_FUNC_DEF_2(PySocket_ssl, PyObject *, self, PyObject *, args)
2051{
2052 SSLObject *rv;
2053 PySocketSockObject *Sock;
2054 char *key_file;
2055 char *cert_file;
2056
Guido van Rossum43713e52000-02-29 13:59:29 +00002057 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002058 &PySocketSock_Type, (PyObject*)&Sock,
2059 &key_file, &cert_file) )
2060 return NULL;
2061
2062 rv = newSSLObject(Sock, key_file, cert_file);
2063 if ( rv == NULL )
2064 return NULL;
2065 return (PyObject *)rv;
2066}
2067
2068static char ssl_doc[] =
2069"ssl(socket, keyfile, certfile) -> sslobject";
2070
2071static PyObject *
2072BUILD_FUNC_DEF_2(SSL_server, SSLObject *, self, PyObject *, args)
2073{
2074 return PyString_FromString(self->server);
2075}
2076
2077static PyObject *
2078BUILD_FUNC_DEF_2(SSL_issuer, SSLObject *, self, PyObject *, args)
2079{
2080 return PyString_FromString(self->issuer);
2081}
2082
2083
2084/* SSL object methods */
2085
2086static PyMethodDef SSLMethods[] = {
2087 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2088 { "read", (PyCFunction)SSL_SSLread, 1 },
2089 { "server", (PyCFunction)SSL_server, 1 },
2090 { "issuer", (PyCFunction)SSL_issuer, 1 },
2091 { NULL, NULL}
2092};
2093
2094static void SSL_dealloc(SSLObject *self)
2095{
2096 if (self->server_cert) /* Possible not to have one? */
2097 X509_free (self->server_cert);
2098 SSL_CTX_free(self->ctx);
2099 SSL_free(self->ssl);
2100 Py_XDECREF(self->x_attr);
2101 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002102 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002103}
2104
2105static PyObject *SSL_getattr(SSLObject *self, char *name)
2106{
2107 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2108}
2109
2110staticforward PyTypeObject SSL_Type = {
2111 PyObject_HEAD_INIT(&PyType_Type)
2112 0, /*ob_size*/
2113 "SSL", /*tp_name*/
2114 sizeof(SSLObject), /*tp_basicsize*/
2115 0, /*tp_itemsize*/
2116 /* methods */
2117 (destructor)SSL_dealloc, /*tp_dealloc*/
2118 0, /*tp_print*/
2119 (getattrfunc)SSL_getattr, /*tp_getattr*/
2120 0, /*tp_setattr*/
2121 0, /*tp_compare*/
2122 0, /*tp_repr*/
2123 0, /*tp_as_number*/
2124 0, /*tp_as_sequence*/
2125 0, /*tp_as_mapping*/
2126 0, /*tp_hash*/
2127};
2128
2129
2130
2131static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2132{
2133 char *data;
Fred Drakea04eaad2000-06-30 02:46:07 +00002134 size_t len = 0;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002135
Guido van Rossum43713e52000-02-29 13:59:29 +00002136 if (!PyArg_ParseTuple(args, "s|i:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002137 return NULL;
2138
2139 if (!len)
2140 len = strlen(data);
2141
2142 len = SSL_write(self->ssl, data, len);
2143 return PyInt_FromLong((long)len);
2144}
2145
2146static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2147{
2148 PyObject *buf;
2149 int count = 0;
2150 int len = 1024;
2151 int res;
2152
Guido van Rossum43713e52000-02-29 13:59:29 +00002153 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002154
2155 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2156 return NULL; /* Error object should already be set */
2157
2158 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2159 res = SSL_get_error(self->ssl, count);
2160
2161 switch (res) {
2162 case 0: /* Good return value! */
2163 break;
2164 case 6:
2165 PyErr_SetString(SSLErrorObject, "EOF");
2166 Py_DECREF(buf);
2167 return NULL;
2168 break;
2169 case 5:
2170 default:
2171 return PyErr_SetFromErrno(SSLErrorObject);
2172 break;
2173 }
2174
2175 fflush(stderr);
2176
2177 if (count < 0) {
2178 Py_DECREF(buf);
2179 return PyErr_SetFromErrno(SSLErrorObject);
2180 }
2181
2182 if (count != len && _PyString_Resize(&buf, count) < 0)
2183 return NULL;
2184 return buf;
2185}
2186
2187#endif /* USE_SSL */
2188
2189
Guido van Rossum30a685f1991-06-27 15:51:29 +00002190/* List of functions exported by this module. */
2191
Guido van Rossum73624e91994-10-10 17:59:00 +00002192static PyMethodDef PySocket_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002193 {"gethostbyname", PySocket_gethostbyname, 1, gethostbyname_doc},
2194 {"gethostbyname_ex", PySocket_gethostbyname_ex, 1, ghbn_ex_doc},
2195 {"gethostbyaddr", PySocket_gethostbyaddr, 1, gethostbyaddr_doc},
2196 {"gethostname", PySocket_gethostname, 1, gethostname_doc},
2197 {"getservbyname", PySocket_getservbyname, 1, getservbyname_doc},
2198 {"getprotobyname", PySocket_getprotobyname, 1,getprotobyname_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00002199 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002200#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00002201 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002202#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002203 {"ntohs", PySocket_ntohs, 1, ntohs_doc},
2204 {"ntohl", PySocket_ntohl, 1, ntohl_doc},
2205 {"htons", PySocket_htons, 1, htons_doc},
2206 {"htonl", PySocket_htonl, 1, htonl_doc},
2207 {"inet_aton", PySocket_inet_aton, 1, inet_aton_doc},
2208 {"inet_ntoa", PySocket_inet_ntoa, 1, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002209#ifdef USE_SSL
2210 {"ssl", PySocket_ssl, 1, ssl_doc},
2211#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002212 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002213};
2214
Guido van Rossum30a685f1991-06-27 15:51:29 +00002215
2216/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002217 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002218 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002219 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002220static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002221BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002222{
Guido van Rossum73624e91994-10-10 17:59:00 +00002223 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002224 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002225 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002226
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002227 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002228}
2229
Guido van Rossum30a685f1991-06-27 15:51:29 +00002230
Guido van Rossum8d665e61996-06-26 18:22:49 +00002231#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002232
2233/* Additional initialization and cleanup for NT/Windows */
2234
2235static void
2236NTcleanup()
2237{
2238 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002239}
2240
2241static int
2242NTinit()
2243{
2244 WSADATA WSAData;
2245 int ret;
2246 char buf[100];
2247 ret = WSAStartup(0x0101, &WSAData);
2248 switch (ret) {
2249 case 0: /* no error */
2250 atexit(NTcleanup);
2251 return 1;
2252 case WSASYSNOTREADY:
2253 PyErr_SetString(PyExc_ImportError,
2254 "WSAStartup failed: network not ready");
2255 break;
2256 case WSAVERNOTSUPPORTED:
2257 case WSAEINVAL:
2258 PyErr_SetString(PyExc_ImportError,
2259 "WSAStartup failed: requested version not supported");
2260 break;
2261 default:
2262 sprintf(buf, "WSAStartup failed: error code %d", ret);
2263 PyErr_SetString(PyExc_ImportError, buf);
2264 break;
2265 }
2266 return 0;
2267}
2268
Guido van Rossum8d665e61996-06-26 18:22:49 +00002269#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002270
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002271#if defined(PYOS_OS2)
2272
2273/* Additional initialization and cleanup for OS/2 */
2274
2275static void
2276OS2cleanup()
2277{
2278 /* No cleanup is necessary for OS/2 Sockets */
2279}
2280
2281static int
2282OS2init()
2283{
2284 char reason[64];
2285 int rc = sock_init();
2286
2287 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002288 atexit(OS2cleanup);
2289 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002290 }
2291
2292 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2293 PyErr_SetString(PyExc_ImportError, reason);
2294
Guido van Rossum32c575d1997-12-02 20:37:32 +00002295 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002296}
2297
2298#endif /* PYOS_OS2 */
2299
Guido van Rossum30a685f1991-06-27 15:51:29 +00002300/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002301 * This is called when the first 'import socket' is done,
2302 * via a table in config.c, if config.c is compiled with USE_SOCKET
2303 * defined.
2304 *
2305 * For MS_WINDOWS (which means any Windows variant), this module
2306 * is actually called "_socket", and there's a wrapper "socket.py"
2307 * which implements some missing functionality (such as makefile(),
2308 * dup() and fromfd()). The import of "_socket" may fail with an
2309 * ImportError exception if initialization of WINSOCK fails. When
2310 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2311 * scheduled to be made at exit time.
2312 *
2313 * For OS/2, this module is also called "_socket" and uses a wrapper
2314 * "socket.py" which implements that functionality that is missing
2315 * when PC operating systems don't put socket descriptors in the
2316 * operating system's filesystem layer.
2317 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002318
Guido van Rossum82a5c661998-07-07 20:45:43 +00002319static char module_doc[] =
2320"This module provides socket operations and some related functions.\n\
2321On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
2322On other systems, it only supports IP.\n\
2323\n\
2324Functions:\n\
2325\n\
2326socket() -- create a new socket object\n\
2327fromfd() -- create a socket object from an open file descriptor (*)\n\
2328gethostname() -- return the current hostname\n\
2329gethostbyname() -- map a hostname to its IP number\n\
2330gethostbyaddr() -- map an IP number or hostname to DNS info\n\
2331getservbyname() -- map a service name and a protocol name to a port number\n\
2332getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
2333ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
2334htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002335inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format\n\
2336inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)\n\
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002337ssl() -- secure socket layer support (only available if configured)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002338\n\
2339(*) not available on all platforms!)\n\
2340\n\
2341Special objects:\n\
2342\n\
2343SocketType -- type object for socket objects\n\
2344error -- exception raised for I/O errors\n\
2345\n\
2346Integer constants:\n\
2347\n\
2348AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
2349SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
2350\n\
2351Many other constants may be defined; these may be used in calls to\n\
2352the setsockopt() and getsockopt() methods.\n\
2353";
2354
2355static char sockettype_doc[] =
2356"A socket represents one endpoint of a network connection.\n\
2357\n\
2358Methods:\n\
2359\n\
2360accept() -- accept a connection, returning new socket and client address\n\
2361bind() -- bind the socket to a local address\n\
2362close() -- close the socket\n\
2363connect() -- connect the socket to a remote address\n\
2364connect_ex() -- connect, return an error code instead of an exception \n\
2365dup() -- return a new socket object identical to the current one (*)\n\
2366fileno() -- return underlying file descriptor\n\
2367getpeername() -- return remote address (*)\n\
2368getsockname() -- return local address\n\
2369getsockopt() -- get socket options\n\
2370listen() -- start listening for incoming connections\n\
2371makefile() -- return a file object corresponding tot the socket (*)\n\
2372recv() -- receive data\n\
2373recvfrom() -- receive data and sender's address\n\
2374send() -- send data\n\
2375sendto() -- send data to a given address\n\
2376setblocking() -- set or clear the blocking I/O flag\n\
2377setsockopt() -- set socket options\n\
2378shutdown() -- shut down traffic in one or both directions\n\
2379\n\
2380(*) not available on all platforms!)";
2381
Guido van Rossum3886bb61998-12-04 18:50:17 +00002382DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00002383#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002384init_socket()
2385#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002386initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00002387#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002388{
Guido van Rossum73624e91994-10-10 17:59:00 +00002389 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00002390#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002391 if (!NTinit())
2392 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002393 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002394#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002395#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002396 if (!OS2init())
2397 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002398 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002399#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00002400#if defined(__BEOS__)
2401 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
2402#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002403 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002404#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00002405#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00002406#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002407 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002408 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2409 if (PySocket_Error == NULL)
2410 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002411#ifdef USE_SSL
2412 SSL_load_error_strings();
2413 SSLeay_add_ssl_algorithms();
2414 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2415 if (SSLErrorObject == NULL)
2416 return;
2417 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2418 Py_INCREF(&SSL_Type);
2419 if (PyDict_SetItemString(d, "SSLType",
2420 (PyObject *)&SSL_Type) != 0)
2421 return;
2422#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002423 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002424 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002425 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002426 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002427 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002428 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002429 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002430
2431 /* Address families (we only support AF_INET and AF_UNIX) */
2432#ifdef AF_UNSPEC
2433 insint(d, "AF_UNSPEC", AF_UNSPEC);
2434#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002435 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002436#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002437 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002438#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002439#ifdef AF_AX25
2440 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2441#endif
2442#ifdef AF_IPX
2443 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2444#endif
2445#ifdef AF_APPLETALK
2446 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2447#endif
2448#ifdef AF_NETROM
2449 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2450#endif
2451#ifdef AF_BRIDGE
2452 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2453#endif
2454#ifdef AF_AAL5
2455 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2456#endif
2457#ifdef AF_X25
2458 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2459#endif
2460#ifdef AF_INET6
2461 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2462#endif
2463#ifdef AF_ROSE
2464 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2465#endif
2466
2467 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002468 insint(d, "SOCK_STREAM", SOCK_STREAM);
2469 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002470#ifndef __BEOS__
2471/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002472 insint(d, "SOCK_RAW", SOCK_RAW);
2473 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2474 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002475#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002476
2477#ifdef SO_DEBUG
2478 insint(d, "SO_DEBUG", SO_DEBUG);
2479#endif
2480#ifdef SO_ACCEPTCONN
2481 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2482#endif
2483#ifdef SO_REUSEADDR
2484 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2485#endif
2486#ifdef SO_KEEPALIVE
2487 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2488#endif
2489#ifdef SO_DONTROUTE
2490 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2491#endif
2492#ifdef SO_BROADCAST
2493 insint(d, "SO_BROADCAST", SO_BROADCAST);
2494#endif
2495#ifdef SO_USELOOPBACK
2496 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2497#endif
2498#ifdef SO_LINGER
2499 insint(d, "SO_LINGER", SO_LINGER);
2500#endif
2501#ifdef SO_OOBINLINE
2502 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2503#endif
2504#ifdef SO_REUSEPORT
2505 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2506#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002507#ifdef SO_SNDBUF
2508 insint(d, "SO_SNDBUF", SO_SNDBUF);
2509#endif
2510#ifdef SO_RCVBUF
2511 insint(d, "SO_RCVBUF", SO_RCVBUF);
2512#endif
2513#ifdef SO_SNDLOWAT
2514 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2515#endif
2516#ifdef SO_RCVLOWAT
2517 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2518#endif
2519#ifdef SO_SNDTIMEO
2520 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2521#endif
2522#ifdef SO_RCVTIMEO
2523 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2524#endif
2525#ifdef SO_ERROR
2526 insint(d, "SO_ERROR", SO_ERROR);
2527#endif
2528#ifdef SO_TYPE
2529 insint(d, "SO_TYPE", SO_TYPE);
2530#endif
2531
2532 /* Maximum number of connections for "listen" */
2533#ifdef SOMAXCONN
2534 insint(d, "SOMAXCONN", SOMAXCONN);
2535#else
2536 insint(d, "SOMAXCONN", 5); /* Common value */
2537#endif
2538
2539 /* Flags for send, recv */
2540#ifdef MSG_OOB
2541 insint(d, "MSG_OOB", MSG_OOB);
2542#endif
2543#ifdef MSG_PEEK
2544 insint(d, "MSG_PEEK", MSG_PEEK);
2545#endif
2546#ifdef MSG_DONTROUTE
2547 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2548#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002549#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00002550 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002551#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002552#ifdef MSG_EOR
2553 insint(d, "MSG_EOR", MSG_EOR);
2554#endif
2555#ifdef MSG_TRUNC
2556 insint(d, "MSG_TRUNC", MSG_TRUNC);
2557#endif
2558#ifdef MSG_CTRUNC
2559 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2560#endif
2561#ifdef MSG_WAITALL
2562 insint(d, "MSG_WAITALL", MSG_WAITALL);
2563#endif
2564#ifdef MSG_BTAG
2565 insint(d, "MSG_BTAG", MSG_BTAG);
2566#endif
2567#ifdef MSG_ETAG
2568 insint(d, "MSG_ETAG", MSG_ETAG);
2569#endif
2570
2571 /* Protocol level and numbers, usable for [gs]etsockopt */
2572#ifdef SOL_SOCKET
2573 insint(d, "SOL_SOCKET", SOL_SOCKET);
2574#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002575#ifdef SOL_IP
2576 insint(d, "SOL_IP", SOL_IP);
2577#else
2578 insint(d, "SOL_IP", 0);
2579#endif
2580#ifdef SOL_IPX
2581 insint(d, "SOL_IPX", SOL_IPX);
2582#endif
2583#ifdef SOL_AX25
2584 insint(d, "SOL_AX25", SOL_AX25);
2585#endif
2586#ifdef SOL_ATALK
2587 insint(d, "SOL_ATALK", SOL_ATALK);
2588#endif
2589#ifdef SOL_NETROM
2590 insint(d, "SOL_NETROM", SOL_NETROM);
2591#endif
2592#ifdef SOL_ROSE
2593 insint(d, "SOL_ROSE", SOL_ROSE);
2594#endif
2595#ifdef SOL_TCP
2596 insint(d, "SOL_TCP", SOL_TCP);
2597#else
2598 insint(d, "SOL_TCP", 6);
2599#endif
2600#ifdef SOL_UDP
2601 insint(d, "SOL_UDP", SOL_UDP);
2602#else
2603 insint(d, "SOL_UDP", 17);
2604#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002605#ifdef IPPROTO_IP
2606 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002607#else
2608 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002609#endif
2610#ifdef IPPROTO_ICMP
2611 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002612#else
2613 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002614#endif
2615#ifdef IPPROTO_IGMP
2616 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2617#endif
2618#ifdef IPPROTO_GGP
2619 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2620#endif
2621#ifdef IPPROTO_TCP
2622 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002623#else
2624 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002625#endif
2626#ifdef IPPROTO_EGP
2627 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2628#endif
2629#ifdef IPPROTO_PUP
2630 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2631#endif
2632#ifdef IPPROTO_UDP
2633 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002634#else
2635 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002636#endif
2637#ifdef IPPROTO_IDP
2638 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2639#endif
2640#ifdef IPPROTO_HELLO
2641 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2642#endif
2643#ifdef IPPROTO_ND
2644 insint(d, "IPPROTO_ND", IPPROTO_ND);
2645#endif
2646#ifdef IPPROTO_TP
2647 insint(d, "IPPROTO_TP", IPPROTO_TP);
2648#endif
2649#ifdef IPPROTO_XTP
2650 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2651#endif
2652#ifdef IPPROTO_EON
2653 insint(d, "IPPROTO_EON", IPPROTO_EON);
2654#endif
2655#ifdef IPPROTO_BIP
2656 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2657#endif
2658/**/
2659#ifdef IPPROTO_RAW
2660 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002661#else
2662 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002663#endif
2664#ifdef IPPROTO_MAX
2665 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2666#endif
2667
2668 /* Some port configuration */
2669#ifdef IPPORT_RESERVED
2670 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2671#else
2672 insint(d, "IPPORT_RESERVED", 1024);
2673#endif
2674#ifdef IPPORT_USERRESERVED
2675 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2676#else
2677 insint(d, "IPPORT_USERRESERVED", 5000);
2678#endif
2679
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002680 /* Some reserved IP v.4 addresses */
2681#ifdef INADDR_ANY
2682 insint(d, "INADDR_ANY", INADDR_ANY);
2683#else
2684 insint(d, "INADDR_ANY", 0x00000000);
2685#endif
2686#ifdef INADDR_BROADCAST
2687 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2688#else
2689 insint(d, "INADDR_BROADCAST", 0xffffffff);
2690#endif
2691#ifdef INADDR_LOOPBACK
2692 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2693#else
2694 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2695#endif
2696#ifdef INADDR_UNSPEC_GROUP
2697 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2698#else
2699 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2700#endif
2701#ifdef INADDR_ALLHOSTS_GROUP
2702 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2703#else
2704 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2705#endif
2706#ifdef INADDR_MAX_LOCAL_GROUP
2707 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2708#else
2709 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2710#endif
2711#ifdef INADDR_NONE
2712 insint(d, "INADDR_NONE", INADDR_NONE);
2713#else
2714 insint(d, "INADDR_NONE", 0xffffffff);
2715#endif
2716
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002717 /* IP [gs]etsockopt options */
2718#ifdef IP_OPTIONS
2719 insint(d, "IP_OPTIONS", IP_OPTIONS);
2720#endif
2721#ifdef IP_HDRINCL
2722 insint(d, "IP_HDRINCL", IP_HDRINCL);
2723#endif
2724#ifdef IP_TOS
2725 insint(d, "IP_TOS", IP_TOS);
2726#endif
2727#ifdef IP_TTL
2728 insint(d, "IP_TTL", IP_TTL);
2729#endif
2730#ifdef IP_RECVOPTS
2731 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2732#endif
2733#ifdef IP_RECVRETOPTS
2734 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2735#endif
2736#ifdef IP_RECVDSTADDR
2737 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2738#endif
2739#ifdef IP_RETOPTS
2740 insint(d, "IP_RETOPTS", IP_RETOPTS);
2741#endif
2742#ifdef IP_MULTICAST_IF
2743 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2744#endif
2745#ifdef IP_MULTICAST_TTL
2746 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2747#endif
2748#ifdef IP_MULTICAST_LOOP
2749 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2750#endif
2751#ifdef IP_ADD_MEMBERSHIP
2752 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2753#endif
2754#ifdef IP_DROP_MEMBERSHIP
2755 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2756#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002757#ifdef IP_DEFAULT_MULTICAST_TTL
2758 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2759#endif
2760#ifdef IP_DEFAULT_MULTICAST_LOOP
2761 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2762#endif
2763#ifdef IP_MAX_MEMBERSHIPS
2764 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2765#endif
2766
2767 /* TCP options */
2768#ifdef TCP_NODELAY
2769 insint(d, "TCP_NODELAY", TCP_NODELAY);
2770#endif
2771#ifdef TCP_MAXSEG
2772 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2773#endif
2774
2775 /* IPX options */
2776#ifdef IPX_TYPE
2777 insint(d, "IPX_TYPE", IPX_TYPE);
2778#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002779
2780 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002781#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002782 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002783#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002784}