blob: b8fbeadb4a55c3ff3151f9f86e14a7843348298f [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;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000358staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
359staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
360
361#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
362
363#endif /* USE_SSL */
364
Guido van Rossum30a685f1991-06-27 15:51:29 +0000365/* A forward reference to the Socktype type object.
366 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000367 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000368 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000369
Guido van Rossum73624e91994-10-10 17:59:00 +0000370staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000371
Guido van Rossum30a685f1991-06-27 15:51:29 +0000372
373/* Create a new socket object.
374 This just creates the object and initializes it.
375 If the creation fails, return NULL and set an exception (implicit
376 in NEWOBJ()). */
377
Guido van Rossum73624e91994-10-10 17:59:00 +0000378static PySocketSockObject *
Fred Drakea04eaad2000-06-30 02:46:07 +0000379BUILD_FUNC_DEF_4(PySocketSock_New,SOCKET_T,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000380{
Guido van Rossum73624e91994-10-10 17:59:00 +0000381 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000382 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000383 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000384 if (s != NULL) {
385 s->sock_fd = fd;
386 s->sock_family = family;
387 s->sock_type = type;
388 s->sock_proto = proto;
389 }
390 return s;
391}
392
Guido van Rossum30a685f1991-06-27 15:51:29 +0000393
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000394/* Lock to allow python interpreter to continue, but only allow one
395 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000396#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000397PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000398#endif
399
400
Guido van Rossum30a685f1991-06-27 15:51:29 +0000401/* Convert a string specifying a host name or one of a few symbolic
402 names to a numeric IP address. This usually calls gethostbyname()
403 to do the work; the names "" and "<broadcast>" are special.
404 Return the length (should always be 4 bytes), or negative if
405 an error occurred; then an exception is raised. */
406
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000407static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000408BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000409{
410 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000411 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000412 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000413 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000414#ifdef HAVE_GETHOSTBYNAME_R
415 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000416#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
417 struct hostent_data data;
418#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000419 char buf[1001];
420 int buf_len = (sizeof buf) - 1;
421 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000422#endif
423#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000424 int result;
425#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000426#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000427
Guido van Rossuma376cc51996-12-05 23:43:35 +0000428 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000429 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000430 addr_ret->sin_addr.s_addr = INADDR_ANY;
431 return 4;
432 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000433 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000434 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
435 return 4;
436 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000437 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
438 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
439 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
440 addr_ret->sin_addr.s_addr = htonl(
441 ((long) d1 << 24) | ((long) d2 << 16) |
442 ((long) d3 << 8) | ((long) d4 << 0));
443 return 4;
444 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000445 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000446#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000447#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000448 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000449#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000450 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000451#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000452 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000453 result = gethostbyname_r(name, &hp_allocated, &data);
454 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000455#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000456#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000457#ifdef USE_GETHOSTBYNAME_LOCK
458 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000459#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000460 hp = gethostbyname(name);
461#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000462 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000463
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000464 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000465#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000466 /* Let's get real error message to return */
467 extern int h_errno;
468 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
469#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000470 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000471#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000472#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000473 PyThread_release_lock(gethostbyname_lock);
474#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000475 return -1;
476 }
477 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000478 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000479#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000480 PyThread_release_lock(gethostbyname_lock);
481#endif
482 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000483}
484
Guido van Rossum30a685f1991-06-27 15:51:29 +0000485
Guido van Rossum30a685f1991-06-27 15:51:29 +0000486/* Create a string object representing an IP address.
487 This is always a string of the form 'dd.dd.dd.dd' (with variable
488 size numbers). */
489
Guido van Rossum73624e91994-10-10 17:59:00 +0000490static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000491BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000492{
493 long x = ntohl(addr->sin_addr.s_addr);
494 char buf[100];
495 sprintf(buf, "%d.%d.%d.%d",
496 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
497 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000498 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000499}
500
501
502/* Create an object representing the given socket address,
503 suitable for passing it back to bind(), connect() etc.
504 The family field of the sockaddr structure is inspected
505 to determine what kind of address it really is. */
506
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000507/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000508static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000509BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000510{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000511 if (addrlen == 0) {
512 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000513 Py_INCREF(Py_None);
514 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000515 }
516
Guido van Rossumbcc20741998-08-04 22:53:56 +0000517#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000518 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000519 addr->sa_family = AF_INET;
520#endif
521
Guido van Rossum30a685f1991-06-27 15:51:29 +0000522 switch (addr->sa_family) {
523
524 case AF_INET:
525 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000526 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000527 PyObject *addrobj = makeipaddr(a);
528 PyObject *ret = NULL;
529 if (addrobj) {
530 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
531 Py_DECREF(addrobj);
532 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000533 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000534 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000535
Guido van Rossumb6775db1994-08-01 11:34:53 +0000536#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000537 case AF_UNIX:
538 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000539 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000540 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000541 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000542#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000543
544 /* More cases here... */
545
546 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000547 /* If we don't know the address family, don't raise an
548 exception -- return it as a tuple. */
549 return Py_BuildValue("is#",
550 addr->sa_family,
551 addr->sa_data,
552 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000553
Guido van Rossum30a685f1991-06-27 15:51:29 +0000554 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000555}
556
Guido van Rossum30a685f1991-06-27 15:51:29 +0000557
558/* Parse a socket address argument according to the socket object's
559 address family. Return 1 if the address was in the proper format,
560 0 of not. The address is returned through addr_ret, its length
561 through len_ret. */
562
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000563static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000564BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000565getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000566{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000567 switch (s->sock_family) {
568
Guido van Rossumb6775db1994-08-01 11:34:53 +0000569#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000570 case AF_UNIX:
571 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000572 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000573 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000574 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000575 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000576 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000577 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000578 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000579 PyErr_SetString(PySocket_Error,
580 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000581 return 0;
582 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000583 addr->sun_family = AF_UNIX;
584 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000585 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000586 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000587 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000588 return 1;
589 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000590#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000591
Guido van Rossum30a685f1991-06-27 15:51:29 +0000592 case AF_INET:
593 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000594 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000595 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000596 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000597 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000598 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000599 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000600 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000601 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000602 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000603 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000604 *addr_ret = (struct sockaddr *) addr;
605 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000606 return 1;
607 }
608
Guido van Rossum30a685f1991-06-27 15:51:29 +0000609 /* More cases here... */
610
611 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000612 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000613 return 0;
614
615 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000616}
617
Guido van Rossum30a685f1991-06-27 15:51:29 +0000618
Guido van Rossum710e1df1992-06-12 10:39:36 +0000619/* Get the address length according to the socket object's address family.
620 Return 1 if the family is known, 0 otherwise. The length is returned
621 through len_ret. */
622
623static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000624BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000625{
626 switch (s->sock_family) {
627
Guido van Rossumb6775db1994-08-01 11:34:53 +0000628#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000629 case AF_UNIX:
630 {
631 *len_ret = sizeof (struct sockaddr_un);
632 return 1;
633 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000634#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000635
636 case AF_INET:
637 {
638 *len_ret = sizeof (struct sockaddr_in);
639 return 1;
640 }
641
642 /* More cases here... */
643
644 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000645 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000646 return 0;
647
648 }
649}
650
651
Guido van Rossum30a685f1991-06-27 15:51:29 +0000652/* s.accept() method */
653
Guido van Rossum73624e91994-10-10 17:59:00 +0000654static PyObject *
655BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000656{
657 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000658 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000659 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000660 PyObject *sock = NULL;
661 PyObject *addr = NULL;
662 PyObject *res = NULL;
663
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000664 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000665 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000666 if (!getsockaddrlen(s, &addrlen))
667 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000668 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000669 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000670 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000671#ifdef MS_WINDOWS
672 if (newfd == INVALID_SOCKET)
673#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000674 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000675#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000676 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000677
Guido van Rossum30a685f1991-06-27 15:51:29 +0000678 /* Create the new object with unspecified family,
679 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000680 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000681 s->sock_family,
682 s->sock_type,
683 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000684 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000685 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000686 goto finally;
687 }
688 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
689 goto finally;
690
691 if (!(res = Py_BuildValue("OO", sock, addr)))
692 goto finally;
693
694 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000695 Py_XDECREF(sock);
696 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000697 return res;
698}
699
Guido van Rossum82a5c661998-07-07 20:45:43 +0000700static char accept_doc[] =
701"accept() -> (socket object, address info)\n\
702\n\
703Wait for an incoming connection. Return a new socket representing the\n\
704connection, and the address of the client. For IP sockets, the address\n\
705info is a pair (hostaddr, port).";
706
Guido van Rossum30a685f1991-06-27 15:51:29 +0000707
Guido van Rossume4485b01994-09-07 14:32:49 +0000708/* s.setblocking(1 | 0) method */
709
Guido van Rossum73624e91994-10-10 17:59:00 +0000710static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000711BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000712{
713 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000714#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000715 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000716#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000717 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000718 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000719 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000720#ifdef __BEOS__
721 block = !block;
722 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
723 (void *)(&block), sizeof( int ) );
724#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000725#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000726#ifdef PYOS_OS2
727 block = !block;
728 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
729#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000730 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
731 if (block)
732 delay_flag &= (~O_NDELAY);
733 else
734 delay_flag |= O_NDELAY;
735 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000736#endif /* !PYOS_OS2 */
737#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000738 block = !block;
739 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000740#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000741#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000742 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000743
Guido van Rossum73624e91994-10-10 17:59:00 +0000744 Py_INCREF(Py_None);
745 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000746}
Guido van Rossume4485b01994-09-07 14:32:49 +0000747
Guido van Rossum82a5c661998-07-07 20:45:43 +0000748static char setblocking_doc[] =
749"setblocking(flag)\n\
750\n\
751Set the socket to blocking (flag is true) or non-blocking (false).\n\
752This uses the FIONBIO ioctl with the O_NDELAY flag.";
753
Guido van Rossume4485b01994-09-07 14:32:49 +0000754
Guido van Rossumaee08791992-09-08 09:05:33 +0000755/* s.setsockopt() method.
756 With an integer third argument, sets an integer option.
757 With a string third argument, sets an option from a buffer;
758 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000759
Guido van Rossum73624e91994-10-10 17:59:00 +0000760static PyObject *
761BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000762{
763 int level;
764 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000765 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000766 char *buf;
767 int buflen;
768 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000769
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000770 if (PyArg_ParseTuple(args, "iii:setsockopt",
771 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000772 buf = (char *) &flag;
773 buflen = sizeof flag;
774 }
775 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000776 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000777 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
778 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000779 return NULL;
780 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000781 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000782 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000783 return PySocket_Err();
784 Py_INCREF(Py_None);
785 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000786}
787
Guido van Rossum82a5c661998-07-07 20:45:43 +0000788static char setsockopt_doc[] =
789"setsockopt(level, option, value)\n\
790\n\
791Set a socket option. See the Unix manual for level and option.\n\
792The value argument can either be an integer or a string.";
793
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000794
Guido van Rossumaee08791992-09-08 09:05:33 +0000795/* s.getsockopt() method.
796 With two arguments, retrieves an integer option.
797 With a third integer argument, retrieves a string buffer of that size;
798 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000799
Guido van Rossum73624e91994-10-10 17:59:00 +0000800static PyObject *
801BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000802{
803 int level;
804 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000805 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000806 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000807 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000808
Guido van Rossumbcc20741998-08-04 22:53:56 +0000809#ifdef __BEOS__
810/* We have incomplete socket support. */
811 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
812 return NULL;
813#else
814
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000815 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
816 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000817 return NULL;
818
819 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000820 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000821 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000822 res = getsockopt(s->sock_fd, level, optname,
823 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000824 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000825 return PySocket_Err();
826 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000827 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000828 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000829 PyErr_SetString(PySocket_Error,
830 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000831 return NULL;
832 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000833 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000834 if (buf == NULL)
835 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000836 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000837 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000838 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000839 Py_DECREF(buf);
840 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000841 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000842 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000843 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000844#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000845}
846
Guido van Rossum82a5c661998-07-07 20:45:43 +0000847static char getsockopt_doc[] =
848"getsockopt(level, option[, buffersize]) -> value\n\
849\n\
850Get a socket option. See the Unix manual for level and option.\n\
851If a nonzero buffersize argument is given, the return value is a\n\
852string of that length; otherwise it is an integer.";
853
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000854
Fred Drake728819a2000-07-01 03:40:12 +0000855/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000856
Guido van Rossum73624e91994-10-10 17:59:00 +0000857static PyObject *
858BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000859{
860 struct sockaddr *addr;
861 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000862 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000863 PyObject *addro;
864 if (!PyArg_ParseTuple(args, "O:bind", &addro))
865 return NULL;
866 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000867 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000868 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000869 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000870 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000871 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000872 return PySocket_Err();
873 Py_INCREF(Py_None);
874 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000875}
876
Guido van Rossum82a5c661998-07-07 20:45:43 +0000877static char bind_doc[] =
878"bind(address)\n\
879\n\
880Bind the socket to a local address. For IP sockets, the address is a\n\
881pair (host, port); the host must refer to the local host.";
882
Guido van Rossum30a685f1991-06-27 15:51:29 +0000883
884/* s.close() method.
885 Set the file descriptor to -1 so operations tried subsequently
886 will surely fail. */
887
Guido van Rossum73624e91994-10-10 17:59:00 +0000888static PyObject *
889BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000890{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000891 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000892 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000893 if (s->sock_fd != -1) {
894 Py_BEGIN_ALLOW_THREADS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000895 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum08481461996-10-12 14:07:22 +0000896 Py_END_ALLOW_THREADS
897 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000898 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000899 Py_INCREF(Py_None);
900 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000901}
902
Guido van Rossum82a5c661998-07-07 20:45:43 +0000903static char close_doc[] =
904"close()\n\
905\n\
906Close the socket. It cannot be used after this call.";
907
Guido van Rossum30a685f1991-06-27 15:51:29 +0000908
Fred Drake728819a2000-07-01 03:40:12 +0000909/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000910
Guido van Rossum73624e91994-10-10 17:59:00 +0000911static PyObject *
912BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000913{
914 struct sockaddr *addr;
915 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000916 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000917 PyObject *addro;
918 if (!PyArg_ParseTuple(args, "O:connect", &addro))
919 return NULL;
920 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000921 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000922 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000923 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000924 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000925 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000926 return PySocket_Err();
927 Py_INCREF(Py_None);
928 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000929}
930
Guido van Rossum82a5c661998-07-07 20:45:43 +0000931static char connect_doc[] =
932"connect(address)\n\
933\n\
934Connect the socket to a remote address. For IP sockets, the address\n\
935is a pair (host, port).";
936
Guido van Rossum30a685f1991-06-27 15:51:29 +0000937
Fred Drake728819a2000-07-01 03:40:12 +0000938/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000939
940static PyObject *
941BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
942{
943 struct sockaddr *addr;
944 int addrlen;
945 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000946 PyObject *addro;
947 if (!PyArg_ParseTuple(args, "O:connect_ex", &addro))
948 return NULL;
949 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000950 return NULL;
951 Py_BEGIN_ALLOW_THREADS
952 res = connect(s->sock_fd, addr, addrlen);
953 Py_END_ALLOW_THREADS
954 if (res != 0)
955 res = errno;
956 return PyInt_FromLong((long) res);
957}
958
Guido van Rossum82a5c661998-07-07 20:45:43 +0000959static char connect_ex_doc[] =
960"connect_ex(address)\n\
961\n\
962This is like connect(address), but returns an error code (the errno value)\n\
963instead of raising an exception when an error occurs.";
964
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000965
Guido van Rossumed233a51992-06-23 09:07:03 +0000966/* s.fileno() method */
967
Guido van Rossum73624e91994-10-10 17:59:00 +0000968static PyObject *
969BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000970{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000971 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +0000972 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +0000973#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +0000974 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +0000975#else
976 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
977#endif
Guido van Rossumed233a51992-06-23 09:07:03 +0000978}
979
Guido van Rossum82a5c661998-07-07 20:45:43 +0000980static char fileno_doc[] =
981"fileno() -> integer\n\
982\n\
983Return the integer file descriptor of the socket.";
984
Guido van Rossumed233a51992-06-23 09:07:03 +0000985
Guido van Rossumbe32c891996-06-20 16:25:29 +0000986#ifndef NO_DUP
987/* s.dup() method */
988
989static PyObject *
990BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
991{
Fred Drakea04eaad2000-06-30 02:46:07 +0000992 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000993 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000994 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000995 return NULL;
996 newfd = dup(s->sock_fd);
997 if (newfd < 0)
998 return PySocket_Err();
999 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001000 s->sock_family,
1001 s->sock_type,
1002 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001003 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001004 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001005 return sock;
1006}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001007
1008static char dup_doc[] =
1009"dup() -> socket object\n\
1010\n\
1011Return a new socket object connected to the same system resource.";
1012
Guido van Rossumbe32c891996-06-20 16:25:29 +00001013#endif
1014
1015
Guido van Rossumc89705d1992-11-26 08:54:07 +00001016/* s.getsockname() method */
1017
Guido van Rossum73624e91994-10-10 17:59:00 +00001018static PyObject *
1019BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001020{
1021 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001022 int res;
1023 socklen_t addrlen;
1024
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001025 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001026 return NULL;
1027 if (!getsockaddrlen(s, &addrlen))
1028 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001029 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001030 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001031 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001032 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001033 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001034 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001035 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1036}
1037
Guido van Rossum82a5c661998-07-07 20:45:43 +00001038static char getsockname_doc[] =
1039"getsockname() -> address info\n\
1040\n\
1041Return the address of the local endpoint. For IP sockets, the address\n\
1042info is a pair (hostaddr, port).";
1043
Guido van Rossumc89705d1992-11-26 08:54:07 +00001044
Guido van Rossumb6775db1994-08-01 11:34:53 +00001045#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001046/* s.getpeername() method */
1047
Guido van Rossum73624e91994-10-10 17:59:00 +00001048static PyObject *
1049BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001050{
1051 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001052 int res;
1053 socklen_t addrlen;
1054
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001055 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001056 return NULL;
1057 if (!getsockaddrlen(s, &addrlen))
1058 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001059 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001060 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001061 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001062 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001063 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001064 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1065}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001066
1067static char getpeername_doc[] =
1068"getpeername() -> address info\n\
1069\n\
1070Return the address of the remote endpoint. For IP sockets, the address\n\
1071info is a pair (hostaddr, port).";
1072
Guido van Rossumb6775db1994-08-01 11:34:53 +00001073#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001074
1075
Guido van Rossum30a685f1991-06-27 15:51:29 +00001076/* s.listen(n) method */
1077
Guido van Rossum73624e91994-10-10 17:59:00 +00001078static PyObject *
1079BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001080{
1081 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001082 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001083 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001084 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001085 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001086 if (backlog < 1)
1087 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001088 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001089 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001090 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001091 return PySocket_Err();
1092 Py_INCREF(Py_None);
1093 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001094}
1095
Guido van Rossum82a5c661998-07-07 20:45:43 +00001096static char listen_doc[] =
1097"listen(backlog)\n\
1098\n\
1099Enable a server to accept connections. The backlog argument must be at\n\
1100least 1; it specifies the number of unaccepted connection that the system\n\
1101will allow before refusing new connections.";
1102
1103
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001104#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001105/* s.makefile(mode) method.
1106 Create a new open file object referring to a dupped version of
1107 the socket's file descriptor. (The dup() call is necessary so
1108 that the open file and socket objects may be closed independent
1109 of each other.)
1110 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1111
Guido van Rossum73624e91994-10-10 17:59:00 +00001112static PyObject *
1113BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001114{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001115 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001116 char *mode = "r";
1117 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001118#ifdef MS_WIN32
1119 intptr_t fd;
1120#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001121 int fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001122#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001123 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001124 PyObject *f;
1125
Guido van Rossum43713e52000-02-29 13:59:29 +00001126 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001127 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001128#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001129 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1130 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001131#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001132 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001133#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001134 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001135 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001136 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001137 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001138 }
1139 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1140 if (f != NULL)
1141 PyFile_SetBufSize(f, bufsize);
1142 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001143}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001144
1145static char makefile_doc[] =
1146"makefile([mode[, buffersize]]) -> file object\n\
1147\n\
1148Return a regular file object corresponding to the socket.\n\
1149The mode and buffersize arguments are as for the built-in open() function.";
1150
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001151#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001152
Guido van Rossum82a5c661998-07-07 20:45:43 +00001153
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001154/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001155
Guido van Rossum73624e91994-10-10 17:59:00 +00001156static PyObject *
1157BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001158{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001159 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001160 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001161 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001162 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001163 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001164 if (buf == NULL)
1165 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001166 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001167 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001168 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001169 if (n < 0) {
1170 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001171 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001172 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001173 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001174 return NULL;
1175 return buf;
1176}
1177
Guido van Rossum82a5c661998-07-07 20:45:43 +00001178static char recv_doc[] =
1179"recv(buffersize[, flags]) -> data\n\
1180\n\
1181Receive up to buffersize bytes from the socket. For the optional flags\n\
1182argument, see the Unix manual. When no data is available, block until\n\
1183at least one byte is available or until the remote end is closed. When\n\
1184the remote end is closed and all data is read, return the empty string.";
1185
Guido van Rossum30a685f1991-06-27 15:51:29 +00001186
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001187/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001188
Guido van Rossum73624e91994-10-10 17:59:00 +00001189static PyObject *
1190BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001191{
1192 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001193 PyObject *buf = NULL;
1194 PyObject *addr = NULL;
1195 PyObject *ret = NULL;
1196
Guido van Rossumff3ab422000-04-24 15:16:03 +00001197 int len, n, flags = 0;
1198 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001199 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001200 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001201 if (!getsockaddrlen(s, &addrlen))
1202 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001203 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001204 if (buf == NULL)
1205 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001206 Py_BEGIN_ALLOW_THREADS
1207 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001208#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001209#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001210 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001211#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001212 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001213#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001214#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001215 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001216#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001217 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001218 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001219 if (n < 0) {
1220 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001221 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001222 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001223 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001224 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001225
1226 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1227 goto finally;
1228
Guido van Rossum73624e91994-10-10 17:59:00 +00001229 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001230 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001231 Py_XDECREF(addr);
1232 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001233 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001234}
1235
Guido van Rossum82a5c661998-07-07 20:45:43 +00001236static char recvfrom_doc[] =
1237"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1238\n\
1239Like recv(buffersize, flags) but also return the sender's address info.";
1240
Guido van Rossum30a685f1991-06-27 15:51:29 +00001241
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001242/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001243
Guido van Rossum73624e91994-10-10 17:59:00 +00001244static PyObject *
1245BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001246{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001247 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001248 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001249 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001250 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001251 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001252 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001253 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001254 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001255 return PySocket_Err();
1256 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001257}
1258
Guido van Rossum82a5c661998-07-07 20:45:43 +00001259static char send_doc[] =
1260"send(data[, flags])\n\
1261\n\
1262Send a data string to the socket. For the optional flags\n\
1263argument, see the Unix manual.";
1264
Guido van Rossum30a685f1991-06-27 15:51:29 +00001265
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001266/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001267
Guido van Rossum73624e91994-10-10 17:59:00 +00001268static PyObject *
1269BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001270{
Guido van Rossum73624e91994-10-10 17:59:00 +00001271 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001272 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001273 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001274 int addrlen, len, n, flags;
1275 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001276 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001277 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001278 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1279 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001280 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001281 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001282 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001283 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001284 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001285 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001286 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001287 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001288 return PySocket_Err();
1289 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001290}
1291
Guido van Rossum82a5c661998-07-07 20:45:43 +00001292static char sendto_doc[] =
1293"sendto(data[, flags], address)\n\
1294\n\
1295Like send(data, flags) but allows specifying the destination address.\n\
1296For IP sockets, the address is a pair (hostaddr, port).";
1297
Guido van Rossum30a685f1991-06-27 15:51:29 +00001298
1299/* s.shutdown(how) method */
1300
Guido van Rossum73624e91994-10-10 17:59:00 +00001301static PyObject *
1302BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001303{
1304 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001305 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001306 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001307 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001308 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001309 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001310 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001311 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001312 return PySocket_Err();
1313 Py_INCREF(Py_None);
1314 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001315}
1316
Guido van Rossum82a5c661998-07-07 20:45:43 +00001317static char shutdown_doc[] =
1318"shutdown(flag)\n\
1319\n\
1320Shut down the reading side of the socket (flag == 0), the writing side\n\
1321of the socket (flag == 1), or both ends (flag == 2).";
1322
Guido van Rossum30a685f1991-06-27 15:51:29 +00001323
1324/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001325
Guido van Rossum73624e91994-10-10 17:59:00 +00001326static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001327 {"accept", (PyCFunction)PySocketSock_accept, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001328 accept_doc},
Fred Drake728819a2000-07-01 03:40:12 +00001329 {"bind", (PyCFunction)PySocketSock_bind, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001330 bind_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001331 {"close", (PyCFunction)PySocketSock_close, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001332 close_doc},
Fred Drake728819a2000-07-01 03:40:12 +00001333 {"connect", (PyCFunction)PySocketSock_connect, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001334 connect_doc},
Fred Drake728819a2000-07-01 03:40:12 +00001335 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001336 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001337#ifndef NO_DUP
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001338 {"dup", (PyCFunction)PySocketSock_dup, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001339 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001340#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001341 {"fileno", (PyCFunction)PySocketSock_fileno, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001342 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001343#ifdef HAVE_GETPEERNAME
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001344 {"getpeername", (PyCFunction)PySocketSock_getpeername, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001345 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001346#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001347 {"getsockname", (PyCFunction)PySocketSock_getsockname, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001348 getsockname_doc},
1349 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1350 getsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001351 {"listen", (PyCFunction)PySocketSock_listen, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001352 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001353#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001354 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1355 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001356#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001357 {"recv", (PyCFunction)PySocketSock_recv, 1,
1358 recv_doc},
1359 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1360 recvfrom_doc},
1361 {"send", (PyCFunction)PySocketSock_send, 1,
1362 send_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001363 {"sendto", (PyCFunction)PySocketSock_sendto, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001364 sendto_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001365 {"setblocking", (PyCFunction)PySocketSock_setblocking, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001366 setblocking_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001367 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001368 setsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001369 {"shutdown", (PyCFunction)PySocketSock_shutdown, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001370 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001371 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001372};
1373
Guido van Rossum30a685f1991-06-27 15:51:29 +00001374
Guido van Rossum73624e91994-10-10 17:59:00 +00001375/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001376 First close the file description. */
1377
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001378static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001379BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001380{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001381 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001382 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001383 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001384}
1385
Guido van Rossum30a685f1991-06-27 15:51:29 +00001386
1387/* Return a socket object's named attribute. */
1388
Guido van Rossum73624e91994-10-10 17:59:00 +00001389static PyObject *
1390BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001391{
Guido van Rossum73624e91994-10-10 17:59:00 +00001392 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001393}
1394
Guido van Rossum30a685f1991-06-27 15:51:29 +00001395
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001396static PyObject *
1397BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1398{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001399 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001400#if SIZEOF_SOCKET_T > SIZEOF_LONG
1401 if (s->sock_fd > LONG_MAX) {
1402 /* this can occur on Win64, and actually there is a special
1403 ugly printf formatter for decimal pointer length integer
1404 printing, only bother if necessary*/
1405 PyErr_SetString(PyExc_OverflowError,
1406 "no printf formatter to display the socket descriptor in decimal");
1407 return NULL;
1408 }
1409#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001410 sprintf(buf,
Fred Drakea04eaad2000-06-30 02:46:07 +00001411 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1412 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001413 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001414}
1415
1416
Guido van Rossumb6775db1994-08-01 11:34:53 +00001417/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001418
Guido van Rossum73624e91994-10-10 17:59:00 +00001419static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001420 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001421 0,
1422 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001423 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001424 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001425 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001426 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001427 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001428 0, /*tp_setattr*/
1429 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001430 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001431 0, /*tp_as_number*/
1432 0, /*tp_as_sequence*/
1433 0, /*tp_as_mapping*/
1434};
1435
Guido van Rossum30a685f1991-06-27 15:51:29 +00001436
Guido van Rossum81194471991-07-27 21:42:02 +00001437/* Python interface to gethostname(). */
1438
1439/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001440static PyObject *
1441BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001442{
1443 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001444 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001445 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001446 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001447 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001448 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001449 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001450 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001451 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001452 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001453 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001454}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001455
Guido van Rossum82a5c661998-07-07 20:45:43 +00001456static char gethostname_doc[] =
1457"gethostname() -> string\n\
1458\n\
1459Return the current host name.";
1460
Guido van Rossumff4949e1992-08-05 19:58:53 +00001461
Guido van Rossum30a685f1991-06-27 15:51:29 +00001462/* Python interface to gethostbyname(name). */
1463
1464/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001465static PyObject *
1466BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001467{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001468 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001469 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001470 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001471 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001472 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001473 return NULL;
1474 return makeipaddr(&addrbuf);
1475}
1476
Guido van Rossum82a5c661998-07-07 20:45:43 +00001477static char gethostbyname_doc[] =
1478"gethostbyname(host) -> address\n\
1479\n\
1480Return the IP address (a string of the form '255.255.255.255') for a host.";
1481
1482
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001483/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1484
1485static PyObject *
1486gethost_common(h, addr)
1487 struct hostent *h;
1488 struct sockaddr_in *addr;
1489{
1490 char **pch;
1491 PyObject *rtn_tuple = (PyObject *)NULL;
1492 PyObject *name_list = (PyObject *)NULL;
1493 PyObject *addr_list = (PyObject *)NULL;
1494 PyObject *tmp;
1495 if (h == NULL) {
1496#ifdef HAVE_HSTRERROR
1497 /* Let's get real error message to return */
1498 extern int h_errno;
1499 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1500#else
1501 PyErr_SetString(PySocket_Error, "host not found");
1502#endif
1503 return NULL;
1504 }
1505 if ((name_list = PyList_New(0)) == NULL)
1506 goto err;
1507 if ((addr_list = PyList_New(0)) == NULL)
1508 goto err;
1509 for (pch = h->h_aliases; *pch != NULL; pch++) {
1510 int status;
1511 tmp = PyString_FromString(*pch);
1512 if (tmp == NULL)
1513 goto err;
1514 status = PyList_Append(name_list, tmp);
1515 Py_DECREF(tmp);
1516 if (status)
1517 goto err;
1518 }
1519 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1520 int status;
1521 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1522 tmp = makeipaddr(addr);
1523 if (tmp == NULL)
1524 goto err;
1525 status = PyList_Append(addr_list, tmp);
1526 Py_DECREF(tmp);
1527 if (status)
1528 goto err;
1529 }
1530 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1531 err:
1532 Py_XDECREF(name_list);
1533 Py_XDECREF(addr_list);
1534 return rtn_tuple;
1535}
1536
1537
1538/* Python interface to gethostbyname_ex(name). */
1539
1540/*ARGSUSED*/
1541static PyObject *
1542BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1543{
1544 char *name;
1545 struct hostent *h;
1546 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001547 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001548#ifdef HAVE_GETHOSTBYNAME_R
1549 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001550#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1551 struct hostent_data data;
1552#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001553 char buf[16384];
1554 int buf_len = (sizeof buf) - 1;
1555 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001556#endif
1557#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001558 int result;
1559#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001560#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001561 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001562 return NULL;
1563 if (setipaddr(name, &addr) < 0)
1564 return NULL;
1565 Py_BEGIN_ALLOW_THREADS
1566#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001567#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001568 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001569#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001570 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001571#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001572 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001573 result = gethostbyname_r(name, &hp_allocated, &data);
1574 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001575#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001576#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001577#ifdef USE_GETHOSTBYNAME_LOCK
1578 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001579#endif
1580 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001581#endif /* HAVE_GETHOSTBYNAME_R */
1582 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001583 ret = gethost_common(h, &addr);
1584#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001585 PyThread_release_lock(gethostbyname_lock);
1586#endif
1587 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001588}
1589
1590static char ghbn_ex_doc[] =
1591"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1592\n\
1593Return the true host name, a list of aliases, and a list of IP addresses,\n\
1594for a host. The host argument is a string giving a host name or IP number.";
1595
1596
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001597/* Python interface to gethostbyaddr(IP). */
1598
1599/*ARGSUSED*/
1600static PyObject *
1601BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1602{
1603 struct sockaddr_in addr;
1604 char *ip_num;
1605 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001606 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001607#ifdef HAVE_GETHOSTBYNAME_R
1608 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001609#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1610 struct hostent_data data;
1611#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001612 char buf[16384];
1613 int buf_len = (sizeof buf) - 1;
1614 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001615#endif
1616#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001617 int result;
1618#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001619#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001620
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001621 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001622 return NULL;
1623 if (setipaddr(ip_num, &addr) < 0)
1624 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001625 Py_BEGIN_ALLOW_THREADS
1626#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001627#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001628 result = gethostbyaddr_r((char *)&addr.sin_addr,
1629 sizeof(addr.sin_addr),
1630 AF_INET, &hp_allocated, buf, buf_len,
1631 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001632#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001633 h = gethostbyaddr_r((char *)&addr.sin_addr,
1634 sizeof(addr.sin_addr),
1635 AF_INET,
1636 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001637#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001638 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001639 result = gethostbyaddr_r((char *)&addr.sin_addr,
1640 sizeof(addr.sin_addr),
1641 AF_INET, &hp_allocated, &data);
1642 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001643#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001644#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001645#ifdef USE_GETHOSTBYNAME_LOCK
1646 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001647#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001648 h = gethostbyaddr((char *)&addr.sin_addr,
1649 sizeof(addr.sin_addr),
1650 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001651#endif /* HAVE_GETHOSTBYNAME_R */
1652 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001653 ret = gethost_common(h, &addr);
1654#ifdef USE_GETHOSTBYNAME_LOCK
1655 PyThread_release_lock(gethostbyname_lock);
1656#endif
1657 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001658}
1659
Guido van Rossum82a5c661998-07-07 20:45:43 +00001660static char gethostbyaddr_doc[] =
1661"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1662\n\
1663Return the true host name, a list of aliases, and a list of IP addresses,\n\
1664for a host. The host argument is a string giving a host name or IP number.";
1665
Guido van Rossum30a685f1991-06-27 15:51:29 +00001666
1667/* Python interface to getservbyname(name).
1668 This only returns the port number, since the other info is already
1669 known or not useful (like the list of aliases). */
1670
1671/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001672static PyObject *
1673BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001674{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001675 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001676 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001677 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001678 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001679 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001680 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001681 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001682 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001683 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001684 return NULL;
1685 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001686 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001687}
1688
Guido van Rossum82a5c661998-07-07 20:45:43 +00001689static char getservbyname_doc[] =
1690"getservbyname(servicename, protocolname) -> integer\n\
1691\n\
1692Return a port number from a service name and protocol name.\n\
1693The protocol name should be 'tcp' or 'udp'.";
1694
Guido van Rossum30a685f1991-06-27 15:51:29 +00001695
Guido van Rossum3901d851996-12-19 16:35:04 +00001696/* Python interface to getprotobyname(name).
1697 This only returns the protocol number, since the other info is
1698 already known or not useful (like the list of aliases). */
1699
1700/*ARGSUSED*/
1701static PyObject *
1702BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1703{
1704 char *name;
1705 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001706#ifdef __BEOS__
1707/* Not available in BeOS yet. - [cjh] */
1708 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1709 return NULL;
1710#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001711 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001712 return NULL;
1713 Py_BEGIN_ALLOW_THREADS
1714 sp = getprotobyname(name);
1715 Py_END_ALLOW_THREADS
1716 if (sp == NULL) {
1717 PyErr_SetString(PySocket_Error, "protocol not found");
1718 return NULL;
1719 }
1720 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001721#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001722}
1723
Guido van Rossum82a5c661998-07-07 20:45:43 +00001724static char getprotobyname_doc[] =
1725"getprotobyname(name) -> integer\n\
1726\n\
1727Return the protocol number for the named protocol. (Rarely used.)";
1728
Guido van Rossum3901d851996-12-19 16:35:04 +00001729
Guido van Rossum30a685f1991-06-27 15:51:29 +00001730/* Python interface to socket(family, type, proto).
1731 The third (protocol) argument is optional.
1732 Return a new socket object. */
1733
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001734/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001735static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001736BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001737{
Guido van Rossum73624e91994-10-10 17:59:00 +00001738 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001739 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001740 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001741 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001742 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001743 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001744 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001745 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001746#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001747 if (fd == INVALID_SOCKET)
1748#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001749 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001750#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001751 return PySocket_Err();
1752 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001753 /* If the object can't be created, don't forget to close the
1754 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001755 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001756 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001757 /* From now on, ignore SIGPIPE and let the error checking
1758 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001759#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001760 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001761#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001762 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001763}
1764
Guido van Rossum82a5c661998-07-07 20:45:43 +00001765static char socket_doc[] =
1766"socket(family, type[, proto]) -> socket object\n\
1767\n\
1768Open a socket of the given type. The family argument specifies the\n\
1769address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1770The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1771or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1772specifying the default protocol.";
1773
1774
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001775#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001776/* Create a socket object from a numeric file description.
1777 Useful e.g. if stdin is a socket.
1778 Additional arguments as for socket(). */
1779
1780/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001781static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001782BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001783{
Guido van Rossum73624e91994-10-10 17:59:00 +00001784 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001785 SOCKET_T fd;
1786 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001787 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1788 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001789 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001790 /* Dup the fd so it and the socket can be closed independently */
1791 fd = dup(fd);
1792 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001793 return PySocket_Err();
1794 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001795 /* From now on, ignore SIGPIPE and let the error checking
1796 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001797#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001798 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001799#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001800 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001801}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001802
1803static char fromfd_doc[] =
1804"fromfd(fd, family, type[, proto]) -> socket object\n\
1805\n\
1806Create a socket object from the given file descriptor.\n\
1807The remaining arguments are the same as for socket().";
1808
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001809#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001810
Guido van Rossum82a5c661998-07-07 20:45:43 +00001811
Guido van Rossum006bf911996-06-12 04:04:55 +00001812static PyObject *
1813BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1814{
1815 int x1, x2;
1816
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001817 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001818 return NULL;
1819 }
1820 x2 = (int)ntohs((short)x1);
1821 return PyInt_FromLong(x2);
1822}
1823
Guido van Rossum82a5c661998-07-07 20:45:43 +00001824static char ntohs_doc[] =
1825"ntohs(integer) -> integer\n\
1826\n\
1827Convert a 16-bit integer from network to host byte order.";
1828
1829
Guido van Rossum006bf911996-06-12 04:04:55 +00001830static PyObject *
1831BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1832{
1833 int x1, x2;
1834
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001835 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001836 return NULL;
1837 }
1838 x2 = ntohl(x1);
1839 return PyInt_FromLong(x2);
1840}
1841
Guido van Rossum82a5c661998-07-07 20:45:43 +00001842static char ntohl_doc[] =
1843"ntohl(integer) -> integer\n\
1844\n\
1845Convert a 32-bit integer from network to host byte order.";
1846
1847
Guido van Rossum006bf911996-06-12 04:04:55 +00001848static PyObject *
1849BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1850{
1851 int x1, x2;
1852
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001853 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001854 return NULL;
1855 }
1856 x2 = (int)htons((short)x1);
1857 return PyInt_FromLong(x2);
1858}
1859
Guido van Rossum82a5c661998-07-07 20:45:43 +00001860static char htons_doc[] =
1861"htons(integer) -> integer\n\
1862\n\
1863Convert a 16-bit integer from host to network byte order.";
1864
1865
Guido van Rossum006bf911996-06-12 04:04:55 +00001866static PyObject *
1867BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1868{
1869 int x1, x2;
1870
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001871 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001872 return NULL;
1873 }
1874 x2 = htonl(x1);
1875 return PyInt_FromLong(x2);
1876}
1877
Guido van Rossum82a5c661998-07-07 20:45:43 +00001878static char htonl_doc[] =
1879"htonl(integer) -> integer\n\
1880\n\
1881Convert a 32-bit integer from host to network byte order.";
1882
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001883/*
1884 * socket.inet_aton() and socket.inet_ntoa() functions
1885 *
1886 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
1887 *
1888 */
1889
1890static char inet_aton_doc[] =
1891"inet_aton(string) -> packed 32-bit IP representation\n\
1892\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001893Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001894binary format used in low-level network functions.";
1895
1896static PyObject*
1897BUILD_FUNC_DEF_2(PySocket_inet_aton, PyObject *, self, PyObject *, args)
1898{
Guido van Rossuma2e48551999-09-09 15:42:59 +00001899#ifndef INADDR_NONE
1900#define INADDR_NONE (-1)
1901#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001902
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001903 /* Have to use inet_addr() instead */
1904 char *ip_addr;
1905 long packed_addr;
1906
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001907 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001908 return NULL;
1909 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00001910#ifdef USE_GUSI1
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001911 packed_addr = (long)inet_addr(ip_addr).s_addr;
1912#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001913 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001914#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001915
1916 if (packed_addr == INADDR_NONE) { /* invalid address */
1917 PyErr_SetString(PySocket_Error,
1918 "illegal IP address string passed to inet_aton");
1919 return NULL;
1920 }
1921
1922 return PyString_FromStringAndSize((char *) &packed_addr,
1923 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001924}
1925
1926static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00001927"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001928\n\
1929Convert an IP address from 32-bit packed binary format to string format";
1930
1931static PyObject*
1932BUILD_FUNC_DEF_2(PySocket_inet_ntoa, PyObject *, self, PyObject *, args)
1933{
1934 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001935 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001936 struct in_addr packed_addr;
1937
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001938 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001939 return NULL;
1940 }
1941
1942 if (addr_len != sizeof(packed_addr)) {
1943 PyErr_SetString(PySocket_Error,
1944 "packed IP wrong length for inet_ntoa");
1945 return NULL;
1946 }
1947
1948 memcpy(&packed_addr, packed_str, addr_len);
1949
1950 return PyString_FromString(inet_ntoa(packed_addr));
1951}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001952
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001953
1954#ifdef USE_SSL
1955
1956/* This is a C function to be called for new object initialization */
1957static SSLObject *
1958BUILD_FUNC_DEF_3(newSSLObject,
1959 PySocketSockObject *,Sock, char*,key_file, char*,cert_file)
1960{
1961 SSLObject *self;
1962 char *str;
1963
1964#if 0
1965 meth=SSLv23_client_method();
1966 meth=SSLv3_client_method();
1967 meth=SSLv2_client_method();
1968#endif
1969
Guido van Rossumb18618d2000-05-03 23:44:39 +00001970 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001971 if (self == NULL){
1972 PyErr_SetObject(SSLErrorObject,
1973 PyString_FromString("newSSLObject error"));
1974 return NULL;
1975 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001976 memset(self->server, '\0', sizeof(char) * 256);
1977 memset(self->issuer, '\0', sizeof(char) * 256);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001978
1979 self->x_attr = PyDict_New();
1980 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
1981 if (self->ctx == NULL) {
1982 PyErr_SetObject(SSLErrorObject,
1983 PyString_FromString("SSL_CTX_new error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00001984 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001985 return NULL;
1986 }
1987
1988 if ( (key_file && !cert_file) || (!key_file && cert_file) )
1989 {
1990 PyErr_SetObject(SSLErrorObject,
1991 PyString_FromString(
1992 "Both the key & certificate files must be specified"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00001993 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001994 return NULL;
1995 }
1996
1997 if (key_file && cert_file)
1998 {
1999 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
2000 SSL_FILETYPE_PEM) < 1)
2001 {
2002 PyErr_SetObject(SSLErrorObject,
2003 PyString_FromString(
2004 "SSL_CTX_use_PrivateKey_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002005 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002006 return NULL;
2007 }
2008
2009 if (SSL_CTX_use_certificate_chain_file(self->ctx,
2010 cert_file) < 1)
2011 {
2012 PyErr_SetObject(SSLErrorObject,
2013 PyString_FromString(
2014 "SSL_CTX_use_certificate_chain_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002015 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002016 return NULL;
2017 }
2018 }
2019
2020 SSL_CTX_set_verify(self->ctx,
2021 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2022 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2023 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2024 SSL_set_connect_state(self->ssl);
2025
2026 if ((SSL_connect(self->ssl)) == -1) {
2027 /* Actually negotiate SSL connection */
2028 PyErr_SetObject(SSLErrorObject,
2029 PyString_FromString("SSL_connect error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002030 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002031 return NULL;
2032 }
2033 self->ssl->debug = 1;
2034
2035 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2036 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2037 self->server, 256);
2038 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2039 self->issuer, 256);
2040 }
2041 self->x_attr = NULL;
2042 self->Socket = Sock;
2043 Py_INCREF(self->Socket);
2044 return self;
2045}
2046
2047/* This is the Python function called for new object initialization */
2048static PyObject *
2049BUILD_FUNC_DEF_2(PySocket_ssl, PyObject *, self, PyObject *, args)
2050{
2051 SSLObject *rv;
2052 PySocketSockObject *Sock;
2053 char *key_file;
2054 char *cert_file;
2055
Guido van Rossum43713e52000-02-29 13:59:29 +00002056 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002057 &PySocketSock_Type, (PyObject*)&Sock,
2058 &key_file, &cert_file) )
2059 return NULL;
2060
2061 rv = newSSLObject(Sock, key_file, cert_file);
2062 if ( rv == NULL )
2063 return NULL;
2064 return (PyObject *)rv;
2065}
2066
2067static char ssl_doc[] =
2068"ssl(socket, keyfile, certfile) -> sslobject";
2069
2070static PyObject *
2071BUILD_FUNC_DEF_2(SSL_server, SSLObject *, self, PyObject *, args)
2072{
2073 return PyString_FromString(self->server);
2074}
2075
2076static PyObject *
2077BUILD_FUNC_DEF_2(SSL_issuer, SSLObject *, self, PyObject *, args)
2078{
2079 return PyString_FromString(self->issuer);
2080}
2081
2082
2083/* SSL object methods */
2084
2085static PyMethodDef SSLMethods[] = {
2086 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2087 { "read", (PyCFunction)SSL_SSLread, 1 },
2088 { "server", (PyCFunction)SSL_server, 1 },
2089 { "issuer", (PyCFunction)SSL_issuer, 1 },
2090 { NULL, NULL}
2091};
2092
2093static void SSL_dealloc(SSLObject *self)
2094{
2095 if (self->server_cert) /* Possible not to have one? */
2096 X509_free (self->server_cert);
2097 SSL_CTX_free(self->ctx);
2098 SSL_free(self->ssl);
2099 Py_XDECREF(self->x_attr);
2100 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002101 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002102}
2103
2104static PyObject *SSL_getattr(SSLObject *self, char *name)
2105{
2106 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2107}
2108
2109staticforward PyTypeObject SSL_Type = {
2110 PyObject_HEAD_INIT(&PyType_Type)
2111 0, /*ob_size*/
2112 "SSL", /*tp_name*/
2113 sizeof(SSLObject), /*tp_basicsize*/
2114 0, /*tp_itemsize*/
2115 /* methods */
2116 (destructor)SSL_dealloc, /*tp_dealloc*/
2117 0, /*tp_print*/
2118 (getattrfunc)SSL_getattr, /*tp_getattr*/
2119 0, /*tp_setattr*/
2120 0, /*tp_compare*/
2121 0, /*tp_repr*/
2122 0, /*tp_as_number*/
2123 0, /*tp_as_sequence*/
2124 0, /*tp_as_mapping*/
2125 0, /*tp_hash*/
2126};
2127
2128
2129
2130static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2131{
2132 char *data;
Fred Drakea04eaad2000-06-30 02:46:07 +00002133 size_t len = 0;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002134
Guido van Rossum43713e52000-02-29 13:59:29 +00002135 if (!PyArg_ParseTuple(args, "s|i:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002136 return NULL;
2137
2138 if (!len)
2139 len = strlen(data);
2140
2141 len = SSL_write(self->ssl, data, len);
2142 return PyInt_FromLong((long)len);
2143}
2144
2145static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2146{
2147 PyObject *buf;
2148 int count = 0;
2149 int len = 1024;
2150 int res;
2151
Guido van Rossum43713e52000-02-29 13:59:29 +00002152 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002153
2154 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2155 return NULL; /* Error object should already be set */
2156
2157 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2158 res = SSL_get_error(self->ssl, count);
2159
2160 switch (res) {
2161 case 0: /* Good return value! */
2162 break;
2163 case 6:
2164 PyErr_SetString(SSLErrorObject, "EOF");
2165 Py_DECREF(buf);
2166 return NULL;
2167 break;
2168 case 5:
2169 default:
2170 return PyErr_SetFromErrno(SSLErrorObject);
2171 break;
2172 }
2173
2174 fflush(stderr);
2175
2176 if (count < 0) {
2177 Py_DECREF(buf);
2178 return PyErr_SetFromErrno(SSLErrorObject);
2179 }
2180
2181 if (count != len && _PyString_Resize(&buf, count) < 0)
2182 return NULL;
2183 return buf;
2184}
2185
2186#endif /* USE_SSL */
2187
2188
Guido van Rossum30a685f1991-06-27 15:51:29 +00002189/* List of functions exported by this module. */
2190
Guido van Rossum73624e91994-10-10 17:59:00 +00002191static PyMethodDef PySocket_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002192 {"gethostbyname", PySocket_gethostbyname, 1, gethostbyname_doc},
2193 {"gethostbyname_ex", PySocket_gethostbyname_ex, 1, ghbn_ex_doc},
2194 {"gethostbyaddr", PySocket_gethostbyaddr, 1, gethostbyaddr_doc},
2195 {"gethostname", PySocket_gethostname, 1, gethostname_doc},
2196 {"getservbyname", PySocket_getservbyname, 1, getservbyname_doc},
2197 {"getprotobyname", PySocket_getprotobyname, 1,getprotobyname_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00002198 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002199#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00002200 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002201#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002202 {"ntohs", PySocket_ntohs, 1, ntohs_doc},
2203 {"ntohl", PySocket_ntohl, 1, ntohl_doc},
2204 {"htons", PySocket_htons, 1, htons_doc},
2205 {"htonl", PySocket_htonl, 1, htonl_doc},
2206 {"inet_aton", PySocket_inet_aton, 1, inet_aton_doc},
2207 {"inet_ntoa", PySocket_inet_ntoa, 1, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002208#ifdef USE_SSL
2209 {"ssl", PySocket_ssl, 1, ssl_doc},
2210#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002211 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002212};
2213
Guido van Rossum30a685f1991-06-27 15:51:29 +00002214
2215/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002216 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002217 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002218 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002219static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002220BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002221{
Guido van Rossum73624e91994-10-10 17:59:00 +00002222 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002223 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002224 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002225
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002226 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002227}
2228
Guido van Rossum30a685f1991-06-27 15:51:29 +00002229
Guido van Rossum8d665e61996-06-26 18:22:49 +00002230#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002231
2232/* Additional initialization and cleanup for NT/Windows */
2233
2234static void
2235NTcleanup()
2236{
2237 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002238}
2239
2240static int
2241NTinit()
2242{
2243 WSADATA WSAData;
2244 int ret;
2245 char buf[100];
2246 ret = WSAStartup(0x0101, &WSAData);
2247 switch (ret) {
2248 case 0: /* no error */
2249 atexit(NTcleanup);
2250 return 1;
2251 case WSASYSNOTREADY:
2252 PyErr_SetString(PyExc_ImportError,
2253 "WSAStartup failed: network not ready");
2254 break;
2255 case WSAVERNOTSUPPORTED:
2256 case WSAEINVAL:
2257 PyErr_SetString(PyExc_ImportError,
2258 "WSAStartup failed: requested version not supported");
2259 break;
2260 default:
2261 sprintf(buf, "WSAStartup failed: error code %d", ret);
2262 PyErr_SetString(PyExc_ImportError, buf);
2263 break;
2264 }
2265 return 0;
2266}
2267
Guido van Rossum8d665e61996-06-26 18:22:49 +00002268#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002269
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002270#if defined(PYOS_OS2)
2271
2272/* Additional initialization and cleanup for OS/2 */
2273
2274static void
2275OS2cleanup()
2276{
2277 /* No cleanup is necessary for OS/2 Sockets */
2278}
2279
2280static int
2281OS2init()
2282{
2283 char reason[64];
2284 int rc = sock_init();
2285
2286 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002287 atexit(OS2cleanup);
2288 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002289 }
2290
2291 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2292 PyErr_SetString(PyExc_ImportError, reason);
2293
Guido van Rossum32c575d1997-12-02 20:37:32 +00002294 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002295}
2296
2297#endif /* PYOS_OS2 */
2298
Guido van Rossum30a685f1991-06-27 15:51:29 +00002299/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002300 * This is called when the first 'import socket' is done,
2301 * via a table in config.c, if config.c is compiled with USE_SOCKET
2302 * defined.
2303 *
2304 * For MS_WINDOWS (which means any Windows variant), this module
2305 * is actually called "_socket", and there's a wrapper "socket.py"
2306 * which implements some missing functionality (such as makefile(),
2307 * dup() and fromfd()). The import of "_socket" may fail with an
2308 * ImportError exception if initialization of WINSOCK fails. When
2309 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2310 * scheduled to be made at exit time.
2311 *
2312 * For OS/2, this module is also called "_socket" and uses a wrapper
2313 * "socket.py" which implements that functionality that is missing
2314 * when PC operating systems don't put socket descriptors in the
2315 * operating system's filesystem layer.
2316 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002317
Guido van Rossum82a5c661998-07-07 20:45:43 +00002318static char module_doc[] =
2319"This module provides socket operations and some related functions.\n\
2320On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
2321On other systems, it only supports IP.\n\
2322\n\
2323Functions:\n\
2324\n\
2325socket() -- create a new socket object\n\
2326fromfd() -- create a socket object from an open file descriptor (*)\n\
2327gethostname() -- return the current hostname\n\
2328gethostbyname() -- map a hostname to its IP number\n\
2329gethostbyaddr() -- map an IP number or hostname to DNS info\n\
2330getservbyname() -- map a service name and a protocol name to a port number\n\
2331getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
2332ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
2333htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002334inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format\n\
2335inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)\n\
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002336ssl() -- secure socket layer support (only available if configured)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002337\n\
2338(*) not available on all platforms!)\n\
2339\n\
2340Special objects:\n\
2341\n\
2342SocketType -- type object for socket objects\n\
2343error -- exception raised for I/O errors\n\
2344\n\
2345Integer constants:\n\
2346\n\
2347AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
2348SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
2349\n\
2350Many other constants may be defined; these may be used in calls to\n\
2351the setsockopt() and getsockopt() methods.\n\
2352";
2353
2354static char sockettype_doc[] =
2355"A socket represents one endpoint of a network connection.\n\
2356\n\
2357Methods:\n\
2358\n\
2359accept() -- accept a connection, returning new socket and client address\n\
2360bind() -- bind the socket to a local address\n\
2361close() -- close the socket\n\
2362connect() -- connect the socket to a remote address\n\
2363connect_ex() -- connect, return an error code instead of an exception \n\
2364dup() -- return a new socket object identical to the current one (*)\n\
2365fileno() -- return underlying file descriptor\n\
2366getpeername() -- return remote address (*)\n\
2367getsockname() -- return local address\n\
2368getsockopt() -- get socket options\n\
2369listen() -- start listening for incoming connections\n\
2370makefile() -- return a file object corresponding tot the socket (*)\n\
2371recv() -- receive data\n\
2372recvfrom() -- receive data and sender's address\n\
2373send() -- send data\n\
2374sendto() -- send data to a given address\n\
2375setblocking() -- set or clear the blocking I/O flag\n\
2376setsockopt() -- set socket options\n\
2377shutdown() -- shut down traffic in one or both directions\n\
2378\n\
2379(*) not available on all platforms!)";
2380
Guido van Rossum3886bb61998-12-04 18:50:17 +00002381DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00002382#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002383init_socket()
2384#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002385initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00002386#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002387{
Guido van Rossum73624e91994-10-10 17:59:00 +00002388 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00002389#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002390 if (!NTinit())
2391 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002392 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002393#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002394#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002395 if (!OS2init())
2396 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002397 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002398#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00002399#if defined(__BEOS__)
2400 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
2401#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002402 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002403#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00002404#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00002405#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002406 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002407 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2408 if (PySocket_Error == NULL)
2409 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002410#ifdef USE_SSL
2411 SSL_load_error_strings();
2412 SSLeay_add_ssl_algorithms();
2413 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2414 if (SSLErrorObject == NULL)
2415 return;
2416 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2417 Py_INCREF(&SSL_Type);
2418 if (PyDict_SetItemString(d, "SSLType",
2419 (PyObject *)&SSL_Type) != 0)
2420 return;
2421#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002422 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002423 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002424 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002425 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002426 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002427 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002428 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002429
2430 /* Address families (we only support AF_INET and AF_UNIX) */
2431#ifdef AF_UNSPEC
2432 insint(d, "AF_UNSPEC", AF_UNSPEC);
2433#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002434 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002435#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002436 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002437#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002438#ifdef AF_AX25
2439 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2440#endif
2441#ifdef AF_IPX
2442 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2443#endif
2444#ifdef AF_APPLETALK
2445 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2446#endif
2447#ifdef AF_NETROM
2448 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2449#endif
2450#ifdef AF_BRIDGE
2451 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2452#endif
2453#ifdef AF_AAL5
2454 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2455#endif
2456#ifdef AF_X25
2457 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2458#endif
2459#ifdef AF_INET6
2460 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2461#endif
2462#ifdef AF_ROSE
2463 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2464#endif
2465
2466 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002467 insint(d, "SOCK_STREAM", SOCK_STREAM);
2468 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002469#ifndef __BEOS__
2470/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002471 insint(d, "SOCK_RAW", SOCK_RAW);
2472 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2473 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002474#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002475
2476#ifdef SO_DEBUG
2477 insint(d, "SO_DEBUG", SO_DEBUG);
2478#endif
2479#ifdef SO_ACCEPTCONN
2480 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2481#endif
2482#ifdef SO_REUSEADDR
2483 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2484#endif
2485#ifdef SO_KEEPALIVE
2486 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2487#endif
2488#ifdef SO_DONTROUTE
2489 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2490#endif
2491#ifdef SO_BROADCAST
2492 insint(d, "SO_BROADCAST", SO_BROADCAST);
2493#endif
2494#ifdef SO_USELOOPBACK
2495 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2496#endif
2497#ifdef SO_LINGER
2498 insint(d, "SO_LINGER", SO_LINGER);
2499#endif
2500#ifdef SO_OOBINLINE
2501 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2502#endif
2503#ifdef SO_REUSEPORT
2504 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2505#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002506#ifdef SO_SNDBUF
2507 insint(d, "SO_SNDBUF", SO_SNDBUF);
2508#endif
2509#ifdef SO_RCVBUF
2510 insint(d, "SO_RCVBUF", SO_RCVBUF);
2511#endif
2512#ifdef SO_SNDLOWAT
2513 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2514#endif
2515#ifdef SO_RCVLOWAT
2516 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2517#endif
2518#ifdef SO_SNDTIMEO
2519 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2520#endif
2521#ifdef SO_RCVTIMEO
2522 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2523#endif
2524#ifdef SO_ERROR
2525 insint(d, "SO_ERROR", SO_ERROR);
2526#endif
2527#ifdef SO_TYPE
2528 insint(d, "SO_TYPE", SO_TYPE);
2529#endif
2530
2531 /* Maximum number of connections for "listen" */
2532#ifdef SOMAXCONN
2533 insint(d, "SOMAXCONN", SOMAXCONN);
2534#else
2535 insint(d, "SOMAXCONN", 5); /* Common value */
2536#endif
2537
2538 /* Flags for send, recv */
2539#ifdef MSG_OOB
2540 insint(d, "MSG_OOB", MSG_OOB);
2541#endif
2542#ifdef MSG_PEEK
2543 insint(d, "MSG_PEEK", MSG_PEEK);
2544#endif
2545#ifdef MSG_DONTROUTE
2546 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2547#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002548#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00002549 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002550#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002551#ifdef MSG_EOR
2552 insint(d, "MSG_EOR", MSG_EOR);
2553#endif
2554#ifdef MSG_TRUNC
2555 insint(d, "MSG_TRUNC", MSG_TRUNC);
2556#endif
2557#ifdef MSG_CTRUNC
2558 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2559#endif
2560#ifdef MSG_WAITALL
2561 insint(d, "MSG_WAITALL", MSG_WAITALL);
2562#endif
2563#ifdef MSG_BTAG
2564 insint(d, "MSG_BTAG", MSG_BTAG);
2565#endif
2566#ifdef MSG_ETAG
2567 insint(d, "MSG_ETAG", MSG_ETAG);
2568#endif
2569
2570 /* Protocol level and numbers, usable for [gs]etsockopt */
2571#ifdef SOL_SOCKET
2572 insint(d, "SOL_SOCKET", SOL_SOCKET);
2573#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002574#ifdef SOL_IP
2575 insint(d, "SOL_IP", SOL_IP);
2576#else
2577 insint(d, "SOL_IP", 0);
2578#endif
2579#ifdef SOL_IPX
2580 insint(d, "SOL_IPX", SOL_IPX);
2581#endif
2582#ifdef SOL_AX25
2583 insint(d, "SOL_AX25", SOL_AX25);
2584#endif
2585#ifdef SOL_ATALK
2586 insint(d, "SOL_ATALK", SOL_ATALK);
2587#endif
2588#ifdef SOL_NETROM
2589 insint(d, "SOL_NETROM", SOL_NETROM);
2590#endif
2591#ifdef SOL_ROSE
2592 insint(d, "SOL_ROSE", SOL_ROSE);
2593#endif
2594#ifdef SOL_TCP
2595 insint(d, "SOL_TCP", SOL_TCP);
2596#else
2597 insint(d, "SOL_TCP", 6);
2598#endif
2599#ifdef SOL_UDP
2600 insint(d, "SOL_UDP", SOL_UDP);
2601#else
2602 insint(d, "SOL_UDP", 17);
2603#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002604#ifdef IPPROTO_IP
2605 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002606#else
2607 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002608#endif
2609#ifdef IPPROTO_ICMP
2610 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002611#else
2612 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002613#endif
2614#ifdef IPPROTO_IGMP
2615 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2616#endif
2617#ifdef IPPROTO_GGP
2618 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2619#endif
2620#ifdef IPPROTO_TCP
2621 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002622#else
2623 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002624#endif
2625#ifdef IPPROTO_EGP
2626 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2627#endif
2628#ifdef IPPROTO_PUP
2629 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2630#endif
2631#ifdef IPPROTO_UDP
2632 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002633#else
2634 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002635#endif
2636#ifdef IPPROTO_IDP
2637 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2638#endif
2639#ifdef IPPROTO_HELLO
2640 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2641#endif
2642#ifdef IPPROTO_ND
2643 insint(d, "IPPROTO_ND", IPPROTO_ND);
2644#endif
2645#ifdef IPPROTO_TP
2646 insint(d, "IPPROTO_TP", IPPROTO_TP);
2647#endif
2648#ifdef IPPROTO_XTP
2649 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2650#endif
2651#ifdef IPPROTO_EON
2652 insint(d, "IPPROTO_EON", IPPROTO_EON);
2653#endif
2654#ifdef IPPROTO_BIP
2655 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2656#endif
2657/**/
2658#ifdef IPPROTO_RAW
2659 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002660#else
2661 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002662#endif
2663#ifdef IPPROTO_MAX
2664 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2665#endif
2666
2667 /* Some port configuration */
2668#ifdef IPPORT_RESERVED
2669 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2670#else
2671 insint(d, "IPPORT_RESERVED", 1024);
2672#endif
2673#ifdef IPPORT_USERRESERVED
2674 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2675#else
2676 insint(d, "IPPORT_USERRESERVED", 5000);
2677#endif
2678
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002679 /* Some reserved IP v.4 addresses */
2680#ifdef INADDR_ANY
2681 insint(d, "INADDR_ANY", INADDR_ANY);
2682#else
2683 insint(d, "INADDR_ANY", 0x00000000);
2684#endif
2685#ifdef INADDR_BROADCAST
2686 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2687#else
2688 insint(d, "INADDR_BROADCAST", 0xffffffff);
2689#endif
2690#ifdef INADDR_LOOPBACK
2691 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2692#else
2693 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2694#endif
2695#ifdef INADDR_UNSPEC_GROUP
2696 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2697#else
2698 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2699#endif
2700#ifdef INADDR_ALLHOSTS_GROUP
2701 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2702#else
2703 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2704#endif
2705#ifdef INADDR_MAX_LOCAL_GROUP
2706 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2707#else
2708 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2709#endif
2710#ifdef INADDR_NONE
2711 insint(d, "INADDR_NONE", INADDR_NONE);
2712#else
2713 insint(d, "INADDR_NONE", 0xffffffff);
2714#endif
2715
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002716 /* IP [gs]etsockopt options */
2717#ifdef IP_OPTIONS
2718 insint(d, "IP_OPTIONS", IP_OPTIONS);
2719#endif
2720#ifdef IP_HDRINCL
2721 insint(d, "IP_HDRINCL", IP_HDRINCL);
2722#endif
2723#ifdef IP_TOS
2724 insint(d, "IP_TOS", IP_TOS);
2725#endif
2726#ifdef IP_TTL
2727 insint(d, "IP_TTL", IP_TTL);
2728#endif
2729#ifdef IP_RECVOPTS
2730 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2731#endif
2732#ifdef IP_RECVRETOPTS
2733 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2734#endif
2735#ifdef IP_RECVDSTADDR
2736 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2737#endif
2738#ifdef IP_RETOPTS
2739 insint(d, "IP_RETOPTS", IP_RETOPTS);
2740#endif
2741#ifdef IP_MULTICAST_IF
2742 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2743#endif
2744#ifdef IP_MULTICAST_TTL
2745 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2746#endif
2747#ifdef IP_MULTICAST_LOOP
2748 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2749#endif
2750#ifdef IP_ADD_MEMBERSHIP
2751 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2752#endif
2753#ifdef IP_DROP_MEMBERSHIP
2754 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2755#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002756#ifdef IP_DEFAULT_MULTICAST_TTL
2757 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2758#endif
2759#ifdef IP_DEFAULT_MULTICAST_LOOP
2760 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2761#endif
2762#ifdef IP_MAX_MEMBERSHIPS
2763 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2764#endif
2765
2766 /* TCP options */
2767#ifdef TCP_NODELAY
2768 insint(d, "TCP_NODELAY", TCP_NODELAY);
2769#endif
2770#ifdef TCP_MAXSEG
2771 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2772#endif
2773
2774 /* IPX options */
2775#ifdef IPX_TYPE
2776 insint(d, "IPX_TYPE", IPX_TYPE);
2777#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002778
2779 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002780#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002781 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002782#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002783}