blob: 6502ced1fe2f023ba89d81ea38e8f80169ed0bb9 [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 Rossum527c9bd2000-04-04 14:10:20 +000048(NB: an argument list of the form (sockaddr...) means that multiple
49arguments are treated the same as a single tuple argument, for backwards
Guido van Rossumb49dc752000-04-04 15:09:07 +000050compatibility. This is deprecated, and will be removed in future versions.)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000051
Guido van Rossum81194471991-07-27 21:42:02 +000052- s.accept() --> new socket object, sockaddr
Guido van Rossum527c9bd2000-04-04 14:10:20 +000053- s.bind(sockaddr...) --> None
Guido van Rossum27e177d1995-03-16 15:43:47 +000054- s.close() --> None
Guido van Rossum527c9bd2000-04-04 14:10:20 +000055- s.connect(sockaddr...) --> None
56- s.connect_ex(sockaddr...) --> 0 or errno (handy for e.g. async connect)
Guido van Rossum27e177d1995-03-16 15:43:47 +000057- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000058- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000059- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000060- s.getsockname() --> sockaddr
61- s.getsockopt(level, optname[, buflen]) --> int or string
62- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000063- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000064- s.recv(buflen [,flags]) --> string
65- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000066- s.send(string [,flags]) --> nbytes
67- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000068- s.setblocking(0 | 1) --> None
69- s.setsockopt(level, optname, value) --> None
70- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000071- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000072
Guido van Rossum6574b3e1991-06-25 21:36:08 +000073*/
74
Guido van Rossum73624e91994-10-10 17:59:00 +000075#include "Python.h"
Guido van Rossum3baaa131999-03-22 21:44:51 +000076
Guido van Rossum9376b741999-09-15 22:01:40 +000077/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
78 script doesn't get this right, so we hardcode some platform checks below.
79 On the other hand, not all Linux versions agree, so there the settings
80 computed by the configure script are needed! */
81
82#ifndef linux
Guido van Rossume7de2061999-03-24 17:24:33 +000083#undef HAVE_GETHOSTBYNAME_R_3_ARG
84#undef HAVE_GETHOSTBYNAME_R_5_ARG
85#undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +000086#endif
Guido van Rossume7de2061999-03-24 17:24:33 +000087
Guido van Rossum7a122991999-04-13 04:07:32 +000088#ifndef WITH_THREAD
89#undef HAVE_GETHOSTBYNAME_R
90#endif
91
Guido van Rossume7de2061999-03-24 17:24:33 +000092#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +000093#if defined(_AIX) || defined(__osf__)
Guido van Rossume7de2061999-03-24 17:24:33 +000094#define HAVE_GETHOSTBYNAME_R_3_ARG
95#elif defined(__sun__) || defined(__sgi)
96#define HAVE_GETHOSTBYNAME_R_5_ARG
97#elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +000098/* Rely on the configure script */
Guido van Rossume7de2061999-03-24 17:24:33 +000099#else
100#undef HAVE_GETHOSTBYNAME_R
101#endif
102#endif
103
Guido van Rossum3baaa131999-03-22 21:44:51 +0000104#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
105#define USE_GETHOSTBYNAME_LOCK
106#endif
107
108#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum49b56061998-10-01 20:42:43 +0000109#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000110#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000111
Guido van Rossuma376cc51996-12-05 23:43:35 +0000112#ifdef HAVE_UNISTD_H
113#include <unistd.h>
114#endif
115
Guido van Rossumbcc20741998-08-04 22:53:56 +0000116#if !defined(MS_WINDOWS) && !defined(PYOS_OS2) && !defined(__BEOS__)
Guido van Rossumfb4130d1996-12-10 15:17:08 +0000117extern int gethostname(); /* For Solaris, at least */
118#endif
119
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000120#if defined(PYCC_VACPP)
121#include <types.h>
122#include <io.h>
123#include <sys/ioctl.h>
124#include <utils.h>
125#include <ctype.h>
126#endif
127
128#if defined(PYOS_OS2)
129#define INCL_DOS
130#define INCL_DOSERRORS
131#define INCL_NOPMAPI
132#include <os2.h>
133#endif
134
Guido van Rossumbcc20741998-08-04 22:53:56 +0000135#if defined(__BEOS__)
136/* It's in the libs, but not the headers... - [cjh] */
137int shutdown( int, int );
138#endif
139
Guido van Rossumb6775db1994-08-01 11:34:53 +0000140#include <sys/types.h>
141#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +0000142
Guido van Rossum81194471991-07-27 21:42:02 +0000143#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000144#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000145#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000146#include <sys/socket.h>
147#include <netinet/in.h>
Fred Drake11b09362000-05-16 13:30:12 +0000148#ifndef __BEOS__
Andrew M. Kuchling52a644c2000-03-31 17:24:30 +0000149#include <netinet/tcp.h>
Fred Drake11b09362000-05-16 13:30:12 +0000150#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000151
Guido van Rossum9376b741999-09-15 22:01:40 +0000152/* Headers needed for inet_ntoa() and inet_addr() */
153#ifdef __BEOS__
154#include <net/netdb.h>
155#else
Guido van Rossumff3ab422000-04-24 15:16:03 +0000156#ifndef USE_GUSI1
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000157#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000158#endif
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000159#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000160
Guido van Rossume4485b01994-09-07 14:32:49 +0000161#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000162#else
163#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000164#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000165#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000166#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000167#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000168#else
169#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000170#endif
171
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000172#ifndef O_NDELAY
173#define O_NDELAY O_NONBLOCK /* For QNX only? */
174#endif
175
Guido van Rossumff3ab422000-04-24 15:16:03 +0000176#ifdef USE_GUSI1
Jack Jansen508537b1996-02-14 15:57:45 +0000177/* fdopen() isn't declared in stdio.h (sigh) */
178#include <GUSI.h>
179#endif
180
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000181#ifdef USE_SSL
182#include "rsa.h"
183#include "crypto.h"
184#include "x509.h"
185#include "pem.h"
186#include "ssl.h"
187#include "err.h"
188#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000189
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000190/* Here we have some hacks to choose between K&R or ANSI style function
191 definitions. For NT to build this as an extension module (ie, DLL)
192 it must be compiled by the C++ compiler, as it takes the address of
193 a static data item exported from the main Python DLL.
194*/
Guido van Rossumbcc20741998-08-04 22:53:56 +0000195#if defined(MS_WINDOWS) || defined(__BEOS__)
196/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000197/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000198#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000199#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000200#define FORCE_ANSI_FUNC_DEFS
201#endif
202
Fred Drakea04eaad2000-06-30 02:46:07 +0000203/* abstract the socket file descriptor type */
204#ifdef MS_WINDOWS
205typedef SOCKET SOCKET_T;
206# ifdef MS_WIN64
207# define SIZEOF_SOCKET_T 8
208# else
209# define SIZEOF_SOCKET_T 4
210# endif
211#else
212typedef int SOCKET_T;
213# define SIZEOF_SOCKET_T SIZEOF_INT
214#endif
215
216
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000217#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000218#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000219#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
220#define FORCE_ANSI_FUNC_DEFS
221#endif
222
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000223#ifndef SOCKETCLOSE
224#define SOCKETCLOSE close
225#endif
226
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000227#ifdef FORCE_ANSI_FUNC_DEFS
228#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
229fnname( arg1type arg1name )
230
231#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
232fnname( arg1type arg1name, arg2type arg2name )
233
234#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
235fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
236
237#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
238fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
239
240#else /* !FORCE_ANSI_FN_DEFS */
241#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
242fnname( arg1name ) \
243 arg1type arg1name;
244
245#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
246fnname( arg1name, arg2name ) \
247 arg1type arg1name; \
248 arg2type arg2name;
249
250#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
251fnname( arg1name, arg2name, arg3name ) \
252 arg1type arg1name; \
253 arg2type arg2name; \
254 arg3type arg3name;
255
256#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
257fnname( arg1name, arg2name, arg3name, arg4name ) \
258 arg1type arg1name; \
259 arg2type arg2name; \
260 arg3type arg3name; \
261 arg4type arg4name;
262
263#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000264
265/* Global variable holding the exception type for errors detected
266 by this module (but not argument type or memory errors, etc.). */
267
Guido van Rossum73624e91994-10-10 17:59:00 +0000268static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000269
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000270#ifdef USE_SSL
271static PyObject *SSLErrorObject;
272#endif /* USE_SSL */
273
Guido van Rossum30a685f1991-06-27 15:51:29 +0000274
275/* Convenience function to raise an error according to errno
276 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000277
Guido van Rossum73624e91994-10-10 17:59:00 +0000278static PyObject *
279PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000280{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000281#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000282 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000283 PyObject *v;
284 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000285 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000286 PyErr_SetObject(PySocket_Error, v);
287 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000288 }
289 return NULL;
290 }
291 else
292#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000293
294#if defined(PYOS_OS2)
295 if (sock_errno() != NO_ERROR) {
296 APIRET rc;
297 ULONG msglen;
298 char outbuf[100];
299 int myerrorcode = sock_errno();
300
301 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
302 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
303 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
304 if (rc == NO_ERROR) {
305 PyObject *v;
306
307 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
308 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
309 char *lastc = &outbuf[ strlen(outbuf)-1 ];
310 while (lastc > outbuf && isspace(*lastc))
311 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
312 }
313 v = Py_BuildValue("(is)", myerrorcode, outbuf);
314 if (v != NULL) {
315 PyErr_SetObject(PySocket_Error, v);
316 Py_DECREF(v);
317 }
318 return NULL;
319 }
320 }
321#endif
322
Guido van Rossum73624e91994-10-10 17:59:00 +0000323 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000324}
325
Guido van Rossum30a685f1991-06-27 15:51:29 +0000326
327/* The object holding a socket. It holds some extra information,
328 like the address family, which is used to decode socket address
329 arguments properly. */
330
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000331typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000332 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000333 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000334 int sock_family; /* Address family, e.g., AF_INET */
335 int sock_type; /* Socket type, e.g., SOCK_STREAM */
336 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000337 union sock_addr {
338 struct sockaddr_in in;
339#ifdef AF_UNIX
340 struct sockaddr_un un;
341#endif
342 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000343} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000344
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000345#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000346
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000347typedef struct {
348 PyObject_HEAD
349 PySocketSockObject *Socket; /* Socket on which we're layered */
350 PyObject *x_attr; /* Attributes dictionary */
351 SSL_CTX* ctx;
352 SSL* ssl;
353 X509* server_cert;
354 BIO* sbio;
355 char server[256];
356 char issuer[256];
357
358} SSLObject;
359
360staticforward PyTypeObject SSL_Type;
361staticforward int SSL_setattr(SSLObject *self, char *name, PyObject *v);
362staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
363staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
364
365#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
366
367#endif /* USE_SSL */
368
Guido van Rossum30a685f1991-06-27 15:51:29 +0000369/* A forward reference to the Socktype type object.
370 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000371 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000372 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000373
Guido van Rossum73624e91994-10-10 17:59:00 +0000374staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000375
Guido van Rossum30a685f1991-06-27 15:51:29 +0000376
377/* Create a new socket object.
378 This just creates the object and initializes it.
379 If the creation fails, return NULL and set an exception (implicit
380 in NEWOBJ()). */
381
Guido van Rossum73624e91994-10-10 17:59:00 +0000382static PySocketSockObject *
Fred Drakea04eaad2000-06-30 02:46:07 +0000383BUILD_FUNC_DEF_4(PySocketSock_New,SOCKET_T,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000384{
Guido van Rossum73624e91994-10-10 17:59:00 +0000385 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000386 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000387 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000388 if (s != NULL) {
389 s->sock_fd = fd;
390 s->sock_family = family;
391 s->sock_type = type;
392 s->sock_proto = proto;
393 }
394 return s;
395}
396
Guido van Rossum30a685f1991-06-27 15:51:29 +0000397
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000398/* Lock to allow python interpreter to continue, but only allow one
399 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000400#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000401PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000402#endif
403
404
Guido van Rossum30a685f1991-06-27 15:51:29 +0000405/* Convert a string specifying a host name or one of a few symbolic
406 names to a numeric IP address. This usually calls gethostbyname()
407 to do the work; the names "" and "<broadcast>" are special.
408 Return the length (should always be 4 bytes), or negative if
409 an error occurred; then an exception is raised. */
410
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000411static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000412BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000413{
414 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000415 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000416 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000417 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000418#ifdef HAVE_GETHOSTBYNAME_R
419 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000420#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
421 struct hostent_data data;
422#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000423 char buf[1001];
424 int buf_len = (sizeof buf) - 1;
425 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000426#endif
427#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000428 int result;
429#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000430#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000431
Guido van Rossuma376cc51996-12-05 23:43:35 +0000432 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000433 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000434 addr_ret->sin_addr.s_addr = INADDR_ANY;
435 return 4;
436 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000437 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000438 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
439 return 4;
440 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000441 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
442 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
443 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
444 addr_ret->sin_addr.s_addr = htonl(
445 ((long) d1 << 24) | ((long) d2 << 16) |
446 ((long) d3 << 8) | ((long) d4 << 0));
447 return 4;
448 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000449 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000450#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000451#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000452 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000453#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000454 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000455#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000456 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000457 result = gethostbyname_r(name, &hp_allocated, &data);
458 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000459#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000460#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000461#ifdef USE_GETHOSTBYNAME_LOCK
462 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000463#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000464 hp = gethostbyname(name);
465#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000466 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000467
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000468 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000469#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000470 /* Let's get real error message to return */
471 extern int h_errno;
472 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
473#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000474 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000475#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000476#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000477 PyThread_release_lock(gethostbyname_lock);
478#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000479 return -1;
480 }
481 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000482 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000483#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000484 PyThread_release_lock(gethostbyname_lock);
485#endif
486 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000487}
488
Guido van Rossum30a685f1991-06-27 15:51:29 +0000489
Guido van Rossum30a685f1991-06-27 15:51:29 +0000490/* Create a string object representing an IP address.
491 This is always a string of the form 'dd.dd.dd.dd' (with variable
492 size numbers). */
493
Guido van Rossum73624e91994-10-10 17:59:00 +0000494static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000495BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000496{
497 long x = ntohl(addr->sin_addr.s_addr);
498 char buf[100];
499 sprintf(buf, "%d.%d.%d.%d",
500 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
501 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000502 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000503}
504
505
506/* Create an object representing the given socket address,
507 suitable for passing it back to bind(), connect() etc.
508 The family field of the sockaddr structure is inspected
509 to determine what kind of address it really is. */
510
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000511/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000512static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000513BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000514{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000515 if (addrlen == 0) {
516 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000517 Py_INCREF(Py_None);
518 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000519 }
520
Guido van Rossumbcc20741998-08-04 22:53:56 +0000521#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000522 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000523 addr->sa_family = AF_INET;
524#endif
525
Guido van Rossum30a685f1991-06-27 15:51:29 +0000526 switch (addr->sa_family) {
527
528 case AF_INET:
529 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000530 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000531 PyObject *addrobj = makeipaddr(a);
532 PyObject *ret = NULL;
533 if (addrobj) {
534 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
535 Py_DECREF(addrobj);
536 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000537 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000538 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000539
Guido van Rossumb6775db1994-08-01 11:34:53 +0000540#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000541 case AF_UNIX:
542 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000543 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000544 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000545 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000546#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000547
548 /* More cases here... */
549
550 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000551 /* If we don't know the address family, don't raise an
552 exception -- return it as a tuple. */
553 return Py_BuildValue("is#",
554 addr->sa_family,
555 addr->sa_data,
556 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000557
Guido van Rossum30a685f1991-06-27 15:51:29 +0000558 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000559}
560
Guido van Rossum30a685f1991-06-27 15:51:29 +0000561
562/* Parse a socket address argument according to the socket object's
563 address family. Return 1 if the address was in the proper format,
564 0 of not. The address is returned through addr_ret, its length
565 through len_ret. */
566
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000567static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000568BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000569getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000570{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000571 switch (s->sock_family) {
572
Guido van Rossumb6775db1994-08-01 11:34:53 +0000573#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000574 case AF_UNIX:
575 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000576 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000577 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000578 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000579 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000580 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000581 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000582 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000583 PyErr_SetString(PySocket_Error,
584 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000585 return 0;
586 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000587 addr->sun_family = AF_UNIX;
588 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000589 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000590 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000591 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000592 return 1;
593 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000594#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000595
Guido van Rossum30a685f1991-06-27 15:51:29 +0000596 case AF_INET:
597 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000598 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000599 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000600 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000601 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000602 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000603 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000604 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000605 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000606 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000607 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000608 *addr_ret = (struct sockaddr *) addr;
609 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000610 return 1;
611 }
612
Guido van Rossum30a685f1991-06-27 15:51:29 +0000613 /* More cases here... */
614
615 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000616 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000617 return 0;
618
619 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000620}
621
Guido van Rossum30a685f1991-06-27 15:51:29 +0000622
Guido van Rossum710e1df1992-06-12 10:39:36 +0000623/* Get the address length according to the socket object's address family.
624 Return 1 if the family is known, 0 otherwise. The length is returned
625 through len_ret. */
626
627static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000628BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000629{
630 switch (s->sock_family) {
631
Guido van Rossumb6775db1994-08-01 11:34:53 +0000632#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000633 case AF_UNIX:
634 {
635 *len_ret = sizeof (struct sockaddr_un);
636 return 1;
637 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000638#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000639
640 case AF_INET:
641 {
642 *len_ret = sizeof (struct sockaddr_in);
643 return 1;
644 }
645
646 /* More cases here... */
647
648 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000649 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000650 return 0;
651
652 }
653}
654
655
Guido van Rossum30a685f1991-06-27 15:51:29 +0000656/* s.accept() method */
657
Guido van Rossum73624e91994-10-10 17:59:00 +0000658static PyObject *
659BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000660{
661 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000662 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000663 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000664 PyObject *sock = NULL;
665 PyObject *addr = NULL;
666 PyObject *res = NULL;
667
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000668 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000669 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000670 if (!getsockaddrlen(s, &addrlen))
671 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000672 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000673 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000674 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000675#ifdef MS_WINDOWS
676 if (newfd == INVALID_SOCKET)
677#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000678 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000679#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000680 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000681
Guido van Rossum30a685f1991-06-27 15:51:29 +0000682 /* Create the new object with unspecified family,
683 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000684 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000685 s->sock_family,
686 s->sock_type,
687 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000688 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000689 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000690 goto finally;
691 }
692 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
693 goto finally;
694
695 if (!(res = Py_BuildValue("OO", sock, addr)))
696 goto finally;
697
698 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000699 Py_XDECREF(sock);
700 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000701 return res;
702}
703
Guido van Rossum82a5c661998-07-07 20:45:43 +0000704static char accept_doc[] =
705"accept() -> (socket object, address info)\n\
706\n\
707Wait for an incoming connection. Return a new socket representing the\n\
708connection, and the address of the client. For IP sockets, the address\n\
709info is a pair (hostaddr, port).";
710
Guido van Rossum30a685f1991-06-27 15:51:29 +0000711
Guido van Rossume4485b01994-09-07 14:32:49 +0000712/* s.setblocking(1 | 0) method */
713
Guido van Rossum73624e91994-10-10 17:59:00 +0000714static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000715BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000716{
717 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000718#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000719 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000720#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000721 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000722 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000723 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000724#ifdef __BEOS__
725 block = !block;
726 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
727 (void *)(&block), sizeof( int ) );
728#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000729#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000730#ifdef PYOS_OS2
731 block = !block;
732 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
733#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000734 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
735 if (block)
736 delay_flag &= (~O_NDELAY);
737 else
738 delay_flag |= O_NDELAY;
739 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000740#endif /* !PYOS_OS2 */
741#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000742 block = !block;
743 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000744#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000745#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000746 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000747
Guido van Rossum73624e91994-10-10 17:59:00 +0000748 Py_INCREF(Py_None);
749 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000750}
Guido van Rossume4485b01994-09-07 14:32:49 +0000751
Guido van Rossum82a5c661998-07-07 20:45:43 +0000752static char setblocking_doc[] =
753"setblocking(flag)\n\
754\n\
755Set the socket to blocking (flag is true) or non-blocking (false).\n\
756This uses the FIONBIO ioctl with the O_NDELAY flag.";
757
Guido van Rossume4485b01994-09-07 14:32:49 +0000758
Guido van Rossumaee08791992-09-08 09:05:33 +0000759/* s.setsockopt() method.
760 With an integer third argument, sets an integer option.
761 With a string third argument, sets an option from a buffer;
762 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000763
Guido van Rossum73624e91994-10-10 17:59:00 +0000764static PyObject *
765BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000766{
767 int level;
768 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000769 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000770 char *buf;
771 int buflen;
772 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000773
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000774 if (PyArg_ParseTuple(args, "iii:setsockopt",
775 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000776 buf = (char *) &flag;
777 buflen = sizeof flag;
778 }
779 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000780 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000781 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
782 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000783 return NULL;
784 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000785 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000786 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000787 return PySocket_Err();
788 Py_INCREF(Py_None);
789 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000790}
791
Guido van Rossum82a5c661998-07-07 20:45:43 +0000792static char setsockopt_doc[] =
793"setsockopt(level, option, value)\n\
794\n\
795Set a socket option. See the Unix manual for level and option.\n\
796The value argument can either be an integer or a string.";
797
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000798
Guido van Rossumaee08791992-09-08 09:05:33 +0000799/* s.getsockopt() method.
800 With two arguments, retrieves an integer option.
801 With a third integer argument, retrieves a string buffer of that size;
802 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000803
Guido van Rossum73624e91994-10-10 17:59:00 +0000804static PyObject *
805BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000806{
807 int level;
808 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000809 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000810 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000811 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000812
Guido van Rossumbcc20741998-08-04 22:53:56 +0000813#ifdef __BEOS__
814/* We have incomplete socket support. */
815 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
816 return NULL;
817#else
818
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000819 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
820 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000821 return NULL;
822
823 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000824 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000825 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000826 res = getsockopt(s->sock_fd, level, optname,
827 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000828 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000829 return PySocket_Err();
830 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000831 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000832 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000833 PyErr_SetString(PySocket_Error,
834 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000835 return NULL;
836 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000837 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000838 if (buf == NULL)
839 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000840 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000841 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000842 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000843 Py_DECREF(buf);
844 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000845 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000846 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000847 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000848#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000849}
850
Guido van Rossum82a5c661998-07-07 20:45:43 +0000851static char getsockopt_doc[] =
852"getsockopt(level, option[, buffersize]) -> value\n\
853\n\
854Get a socket option. See the Unix manual for level and option.\n\
855If a nonzero buffersize argument is given, the return value is a\n\
856string of that length; otherwise it is an integer.";
857
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000858
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000859/* s.bind(sockaddr...) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000860
Guido van Rossum73624e91994-10-10 17:59:00 +0000861static PyObject *
862BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000863{
864 struct sockaddr *addr;
865 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000866 int res;
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000867 if (!getsockaddrarg(s, args, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000868 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000869 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000870 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000871 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000872 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000873 return PySocket_Err();
874 Py_INCREF(Py_None);
875 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000876}
877
Guido van Rossum82a5c661998-07-07 20:45:43 +0000878static char bind_doc[] =
879"bind(address)\n\
880\n\
881Bind the socket to a local address. For IP sockets, the address is a\n\
882pair (host, port); the host must refer to the local host.";
883
Guido van Rossum30a685f1991-06-27 15:51:29 +0000884
885/* s.close() method.
886 Set the file descriptor to -1 so operations tried subsequently
887 will surely fail. */
888
Guido van Rossum73624e91994-10-10 17:59:00 +0000889static PyObject *
890BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000891{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000892 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000893 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000894 if (s->sock_fd != -1) {
895 Py_BEGIN_ALLOW_THREADS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000896 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum08481461996-10-12 14:07:22 +0000897 Py_END_ALLOW_THREADS
898 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000899 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000900 Py_INCREF(Py_None);
901 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000902}
903
Guido van Rossum82a5c661998-07-07 20:45:43 +0000904static char close_doc[] =
905"close()\n\
906\n\
907Close the socket. It cannot be used after this call.";
908
Guido van Rossum30a685f1991-06-27 15:51:29 +0000909
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000910/* s.connect(sockaddr...) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000911
Guido van Rossum73624e91994-10-10 17:59:00 +0000912static PyObject *
913BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000914{
915 struct sockaddr *addr;
916 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000917 int res;
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000918 if (!getsockaddrarg(s, args, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000919 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000920 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000921 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000922 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000923 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000924 return PySocket_Err();
925 Py_INCREF(Py_None);
926 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000927}
928
Guido van Rossum82a5c661998-07-07 20:45:43 +0000929static char connect_doc[] =
930"connect(address)\n\
931\n\
932Connect the socket to a remote address. For IP sockets, the address\n\
933is a pair (host, port).";
934
Guido van Rossum30a685f1991-06-27 15:51:29 +0000935
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000936/* s.connect_ex(sockaddr...) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000937
938static PyObject *
939BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
940{
941 struct sockaddr *addr;
942 int addrlen;
943 int res;
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000944 if (!getsockaddrarg(s, args, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000945 return NULL;
946 Py_BEGIN_ALLOW_THREADS
947 res = connect(s->sock_fd, addr, addrlen);
948 Py_END_ALLOW_THREADS
949 if (res != 0)
950 res = errno;
951 return PyInt_FromLong((long) res);
952}
953
Guido van Rossum82a5c661998-07-07 20:45:43 +0000954static char connect_ex_doc[] =
955"connect_ex(address)\n\
956\n\
957This is like connect(address), but returns an error code (the errno value)\n\
958instead of raising an exception when an error occurs.";
959
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000960
Guido van Rossumed233a51992-06-23 09:07:03 +0000961/* s.fileno() method */
962
Guido van Rossum73624e91994-10-10 17:59:00 +0000963static PyObject *
964BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000965{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000966 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +0000967 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +0000968#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +0000969 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +0000970#else
971 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
972#endif
Guido van Rossumed233a51992-06-23 09:07:03 +0000973}
974
Guido van Rossum82a5c661998-07-07 20:45:43 +0000975static char fileno_doc[] =
976"fileno() -> integer\n\
977\n\
978Return the integer file descriptor of the socket.";
979
Guido van Rossumed233a51992-06-23 09:07:03 +0000980
Guido van Rossumbe32c891996-06-20 16:25:29 +0000981#ifndef NO_DUP
982/* s.dup() method */
983
984static PyObject *
985BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
986{
Fred Drakea04eaad2000-06-30 02:46:07 +0000987 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000988 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000989 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000990 return NULL;
991 newfd = dup(s->sock_fd);
992 if (newfd < 0)
993 return PySocket_Err();
994 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000995 s->sock_family,
996 s->sock_type,
997 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000998 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000999 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001000 return sock;
1001}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001002
1003static char dup_doc[] =
1004"dup() -> socket object\n\
1005\n\
1006Return a new socket object connected to the same system resource.";
1007
Guido van Rossumbe32c891996-06-20 16:25:29 +00001008#endif
1009
1010
Guido van Rossumc89705d1992-11-26 08:54:07 +00001011/* s.getsockname() method */
1012
Guido van Rossum73624e91994-10-10 17:59:00 +00001013static PyObject *
1014BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001015{
1016 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001017 int res;
1018 socklen_t addrlen;
1019
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001020 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001021 return NULL;
1022 if (!getsockaddrlen(s, &addrlen))
1023 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001024 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001025 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001026 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001027 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001028 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001029 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001030 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1031}
1032
Guido van Rossum82a5c661998-07-07 20:45:43 +00001033static char getsockname_doc[] =
1034"getsockname() -> address info\n\
1035\n\
1036Return the address of the local endpoint. For IP sockets, the address\n\
1037info is a pair (hostaddr, port).";
1038
Guido van Rossumc89705d1992-11-26 08:54:07 +00001039
Guido van Rossumb6775db1994-08-01 11:34:53 +00001040#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001041/* s.getpeername() method */
1042
Guido van Rossum73624e91994-10-10 17:59:00 +00001043static PyObject *
1044BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001045{
1046 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001047 int res;
1048 socklen_t addrlen;
1049
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001050 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001051 return NULL;
1052 if (!getsockaddrlen(s, &addrlen))
1053 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001054 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001055 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001056 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001057 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001058 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001059 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1060}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001061
1062static char getpeername_doc[] =
1063"getpeername() -> address info\n\
1064\n\
1065Return the address of the remote endpoint. For IP sockets, the address\n\
1066info is a pair (hostaddr, port).";
1067
Guido van Rossumb6775db1994-08-01 11:34:53 +00001068#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001069
1070
Guido van Rossum30a685f1991-06-27 15:51:29 +00001071/* s.listen(n) method */
1072
Guido van Rossum73624e91994-10-10 17:59:00 +00001073static PyObject *
1074BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001075{
1076 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001077 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001078 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001079 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001080 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001081 if (backlog < 1)
1082 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001083 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001084 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001085 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001086 return PySocket_Err();
1087 Py_INCREF(Py_None);
1088 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001089}
1090
Guido van Rossum82a5c661998-07-07 20:45:43 +00001091static char listen_doc[] =
1092"listen(backlog)\n\
1093\n\
1094Enable a server to accept connections. The backlog argument must be at\n\
1095least 1; it specifies the number of unaccepted connection that the system\n\
1096will allow before refusing new connections.";
1097
1098
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001099#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001100/* s.makefile(mode) method.
1101 Create a new open file object referring to a dupped version of
1102 the socket's file descriptor. (The dup() call is necessary so
1103 that the open file and socket objects may be closed independent
1104 of each other.)
1105 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1106
Guido van Rossum73624e91994-10-10 17:59:00 +00001107static PyObject *
1108BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001109{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001110 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +00001111 char *mode = "r";
1112 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001113#ifdef MS_WIN32
1114 intptr_t fd;
1115#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001116 int fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001117#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001118 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001119 PyObject *f;
1120
Guido van Rossum43713e52000-02-29 13:59:29 +00001121 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001122 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001123#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001124 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1125 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001126#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001127 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001128#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001129 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001130 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001131 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001132 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001133 }
1134 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1135 if (f != NULL)
1136 PyFile_SetBufSize(f, bufsize);
1137 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001138}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001139
1140static char makefile_doc[] =
1141"makefile([mode[, buffersize]]) -> file object\n\
1142\n\
1143Return a regular file object corresponding to the socket.\n\
1144The mode and buffersize arguments are as for the built-in open() function.";
1145
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001146#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001147
Guido van Rossum82a5c661998-07-07 20:45:43 +00001148
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001149/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001150
Guido van Rossum73624e91994-10-10 17:59:00 +00001151static PyObject *
1152BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001153{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001154 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001155 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001156 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001157 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001158 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001159 if (buf == NULL)
1160 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001161 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001162 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001163 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001164 if (n < 0) {
1165 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001166 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001167 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001168 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001169 return NULL;
1170 return buf;
1171}
1172
Guido van Rossum82a5c661998-07-07 20:45:43 +00001173static char recv_doc[] =
1174"recv(buffersize[, flags]) -> data\n\
1175\n\
1176Receive up to buffersize bytes from the socket. For the optional flags\n\
1177argument, see the Unix manual. When no data is available, block until\n\
1178at least one byte is available or until the remote end is closed. When\n\
1179the remote end is closed and all data is read, return the empty string.";
1180
Guido van Rossum30a685f1991-06-27 15:51:29 +00001181
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001182/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001183
Guido van Rossum73624e91994-10-10 17:59:00 +00001184static PyObject *
1185BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001186{
1187 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001188 PyObject *buf = NULL;
1189 PyObject *addr = NULL;
1190 PyObject *ret = NULL;
1191
Guido van Rossumff3ab422000-04-24 15:16:03 +00001192 int len, n, flags = 0;
1193 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001194 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001195 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001196 if (!getsockaddrlen(s, &addrlen))
1197 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001198 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001199 if (buf == NULL)
1200 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001201 Py_BEGIN_ALLOW_THREADS
1202 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001203#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001204#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001205 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001206#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001207 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001208#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001209#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001210 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001211#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001212 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001213 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001214 if (n < 0) {
1215 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001216 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001217 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001218 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001219 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001220
1221 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1222 goto finally;
1223
Guido van Rossum73624e91994-10-10 17:59:00 +00001224 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001225 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001226 Py_XDECREF(addr);
1227 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001228 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001229}
1230
Guido van Rossum82a5c661998-07-07 20:45:43 +00001231static char recvfrom_doc[] =
1232"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1233\n\
1234Like recv(buffersize, flags) but also return the sender's address info.";
1235
Guido van Rossum30a685f1991-06-27 15:51:29 +00001236
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001237/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001238
Guido van Rossum73624e91994-10-10 17:59:00 +00001239static PyObject *
1240BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001241{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001242 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001243 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001244 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001245 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001246 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001247 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001248 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001249 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001250 return PySocket_Err();
1251 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001252}
1253
Guido van Rossum82a5c661998-07-07 20:45:43 +00001254static char send_doc[] =
1255"send(data[, flags])\n\
1256\n\
1257Send a data string to the socket. For the optional flags\n\
1258argument, see the Unix manual.";
1259
Guido van Rossum30a685f1991-06-27 15:51:29 +00001260
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001261/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001262
Guido van Rossum73624e91994-10-10 17:59:00 +00001263static PyObject *
1264BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001265{
Guido van Rossum73624e91994-10-10 17:59:00 +00001266 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001267 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001268 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001269 int addrlen, len, n, flags;
1270 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001271 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001272 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001273 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1274 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001275 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001276 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001277 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001278 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001279 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001280 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001281 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001282 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001283 return PySocket_Err();
1284 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001285}
1286
Guido van Rossum82a5c661998-07-07 20:45:43 +00001287static char sendto_doc[] =
1288"sendto(data[, flags], address)\n\
1289\n\
1290Like send(data, flags) but allows specifying the destination address.\n\
1291For IP sockets, the address is a pair (hostaddr, port).";
1292
Guido van Rossum30a685f1991-06-27 15:51:29 +00001293
1294/* s.shutdown(how) method */
1295
Guido van Rossum73624e91994-10-10 17:59:00 +00001296static PyObject *
1297BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001298{
1299 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001300 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001301 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001302 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001303 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001304 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001305 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001306 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001307 return PySocket_Err();
1308 Py_INCREF(Py_None);
1309 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001310}
1311
Guido van Rossum82a5c661998-07-07 20:45:43 +00001312static char shutdown_doc[] =
1313"shutdown(flag)\n\
1314\n\
1315Shut down the reading side of the socket (flag == 0), the writing side\n\
1316of the socket (flag == 1), or both ends (flag == 2).";
1317
Guido van Rossum30a685f1991-06-27 15:51:29 +00001318
1319/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001320
Guido van Rossum73624e91994-10-10 17:59:00 +00001321static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001322 {"accept", (PyCFunction)PySocketSock_accept, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001323 accept_doc},
Guido van Rossum527c9bd2000-04-04 14:10:20 +00001324 {"bind", (PyCFunction)PySocketSock_bind, 0,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001325 bind_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001326 {"close", (PyCFunction)PySocketSock_close, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001327 close_doc},
Guido van Rossum527c9bd2000-04-04 14:10:20 +00001328 {"connect", (PyCFunction)PySocketSock_connect, 0,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001329 connect_doc},
Guido van Rossum527c9bd2000-04-04 14:10:20 +00001330 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 0,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001331 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001332#ifndef NO_DUP
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001333 {"dup", (PyCFunction)PySocketSock_dup, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001334 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001335#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001336 {"fileno", (PyCFunction)PySocketSock_fileno, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001337 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001338#ifdef HAVE_GETPEERNAME
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001339 {"getpeername", (PyCFunction)PySocketSock_getpeername, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001340 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001341#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001342 {"getsockname", (PyCFunction)PySocketSock_getsockname, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001343 getsockname_doc},
1344 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1345 getsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001346 {"listen", (PyCFunction)PySocketSock_listen, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001347 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001348#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001349 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1350 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001351#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001352 {"recv", (PyCFunction)PySocketSock_recv, 1,
1353 recv_doc},
1354 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1355 recvfrom_doc},
1356 {"send", (PyCFunction)PySocketSock_send, 1,
1357 send_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001358 {"sendto", (PyCFunction)PySocketSock_sendto, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001359 sendto_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001360 {"setblocking", (PyCFunction)PySocketSock_setblocking, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001361 setblocking_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001362 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001363 setsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001364 {"shutdown", (PyCFunction)PySocketSock_shutdown, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001365 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001366 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001367};
1368
Guido van Rossum30a685f1991-06-27 15:51:29 +00001369
Guido van Rossum73624e91994-10-10 17:59:00 +00001370/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001371 First close the file description. */
1372
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001373static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001374BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001375{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001376 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001377 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001378 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001379}
1380
Guido van Rossum30a685f1991-06-27 15:51:29 +00001381
1382/* Return a socket object's named attribute. */
1383
Guido van Rossum73624e91994-10-10 17:59:00 +00001384static PyObject *
1385BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001386{
Guido van Rossum73624e91994-10-10 17:59:00 +00001387 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001388}
1389
Guido van Rossum30a685f1991-06-27 15:51:29 +00001390
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001391static PyObject *
1392BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1393{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001394 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001395#if SIZEOF_SOCKET_T > SIZEOF_LONG
1396 if (s->sock_fd > LONG_MAX) {
1397 /* this can occur on Win64, and actually there is a special
1398 ugly printf formatter for decimal pointer length integer
1399 printing, only bother if necessary*/
1400 PyErr_SetString(PyExc_OverflowError,
1401 "no printf formatter to display the socket descriptor in decimal");
1402 return NULL;
1403 }
1404#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001405 sprintf(buf,
Fred Drakea04eaad2000-06-30 02:46:07 +00001406 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1407 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001408 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001409}
1410
1411
Guido van Rossumb6775db1994-08-01 11:34:53 +00001412/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001413
Guido van Rossum73624e91994-10-10 17:59:00 +00001414static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001415 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001416 0,
1417 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001418 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001419 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001420 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001421 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001422 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001423 0, /*tp_setattr*/
1424 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001425 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001426 0, /*tp_as_number*/
1427 0, /*tp_as_sequence*/
1428 0, /*tp_as_mapping*/
1429};
1430
Guido van Rossum30a685f1991-06-27 15:51:29 +00001431
Guido van Rossum81194471991-07-27 21:42:02 +00001432/* Python interface to gethostname(). */
1433
1434/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001435static PyObject *
1436BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001437{
1438 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001439 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001440 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001441 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001442 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001443 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001444 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001445 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001446 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001447 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001448 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001449}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001450
Guido van Rossum82a5c661998-07-07 20:45:43 +00001451static char gethostname_doc[] =
1452"gethostname() -> string\n\
1453\n\
1454Return the current host name.";
1455
Guido van Rossumff4949e1992-08-05 19:58:53 +00001456
Guido van Rossum30a685f1991-06-27 15:51:29 +00001457/* Python interface to gethostbyname(name). */
1458
1459/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001460static PyObject *
1461BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001462{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001463 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001464 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001465 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001466 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001467 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001468 return NULL;
1469 return makeipaddr(&addrbuf);
1470}
1471
Guido van Rossum82a5c661998-07-07 20:45:43 +00001472static char gethostbyname_doc[] =
1473"gethostbyname(host) -> address\n\
1474\n\
1475Return the IP address (a string of the form '255.255.255.255') for a host.";
1476
1477
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001478/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1479
1480static PyObject *
1481gethost_common(h, addr)
1482 struct hostent *h;
1483 struct sockaddr_in *addr;
1484{
1485 char **pch;
1486 PyObject *rtn_tuple = (PyObject *)NULL;
1487 PyObject *name_list = (PyObject *)NULL;
1488 PyObject *addr_list = (PyObject *)NULL;
1489 PyObject *tmp;
1490 if (h == NULL) {
1491#ifdef HAVE_HSTRERROR
1492 /* Let's get real error message to return */
1493 extern int h_errno;
1494 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1495#else
1496 PyErr_SetString(PySocket_Error, "host not found");
1497#endif
1498 return NULL;
1499 }
1500 if ((name_list = PyList_New(0)) == NULL)
1501 goto err;
1502 if ((addr_list = PyList_New(0)) == NULL)
1503 goto err;
1504 for (pch = h->h_aliases; *pch != NULL; pch++) {
1505 int status;
1506 tmp = PyString_FromString(*pch);
1507 if (tmp == NULL)
1508 goto err;
1509 status = PyList_Append(name_list, tmp);
1510 Py_DECREF(tmp);
1511 if (status)
1512 goto err;
1513 }
1514 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1515 int status;
1516 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1517 tmp = makeipaddr(addr);
1518 if (tmp == NULL)
1519 goto err;
1520 status = PyList_Append(addr_list, tmp);
1521 Py_DECREF(tmp);
1522 if (status)
1523 goto err;
1524 }
1525 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1526 err:
1527 Py_XDECREF(name_list);
1528 Py_XDECREF(addr_list);
1529 return rtn_tuple;
1530}
1531
1532
1533/* Python interface to gethostbyname_ex(name). */
1534
1535/*ARGSUSED*/
1536static PyObject *
1537BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1538{
1539 char *name;
1540 struct hostent *h;
1541 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001542 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001543#ifdef HAVE_GETHOSTBYNAME_R
1544 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001545#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1546 struct hostent_data data;
1547#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001548 char buf[16384];
1549 int buf_len = (sizeof buf) - 1;
1550 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001551#endif
1552#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001553 int result;
1554#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001555#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001556 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001557 return NULL;
1558 if (setipaddr(name, &addr) < 0)
1559 return NULL;
1560 Py_BEGIN_ALLOW_THREADS
1561#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001562#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001563 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001564#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001565 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001566#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001567 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001568 result = gethostbyname_r(name, &hp_allocated, &data);
1569 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001570#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001571#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001572#ifdef USE_GETHOSTBYNAME_LOCK
1573 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001574#endif
1575 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001576#endif /* HAVE_GETHOSTBYNAME_R */
1577 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001578 ret = gethost_common(h, &addr);
1579#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001580 PyThread_release_lock(gethostbyname_lock);
1581#endif
1582 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001583}
1584
1585static char ghbn_ex_doc[] =
1586"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1587\n\
1588Return the true host name, a list of aliases, and a list of IP addresses,\n\
1589for a host. The host argument is a string giving a host name or IP number.";
1590
1591
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001592/* Python interface to gethostbyaddr(IP). */
1593
1594/*ARGSUSED*/
1595static PyObject *
1596BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1597{
1598 struct sockaddr_in addr;
1599 char *ip_num;
1600 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001601 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001602#ifdef HAVE_GETHOSTBYNAME_R
1603 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001604#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1605 struct hostent_data data;
1606#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001607 char buf[16384];
1608 int buf_len = (sizeof buf) - 1;
1609 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001610#endif
1611#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001612 int result;
1613#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001614#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001615
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001616 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001617 return NULL;
1618 if (setipaddr(ip_num, &addr) < 0)
1619 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001620 Py_BEGIN_ALLOW_THREADS
1621#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001622#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001623 result = gethostbyaddr_r((char *)&addr.sin_addr,
1624 sizeof(addr.sin_addr),
1625 AF_INET, &hp_allocated, buf, buf_len,
1626 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001627#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001628 h = gethostbyaddr_r((char *)&addr.sin_addr,
1629 sizeof(addr.sin_addr),
1630 AF_INET,
1631 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001632#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001633 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001634 result = gethostbyaddr_r((char *)&addr.sin_addr,
1635 sizeof(addr.sin_addr),
1636 AF_INET, &hp_allocated, &data);
1637 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001638#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001639#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001640#ifdef USE_GETHOSTBYNAME_LOCK
1641 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001642#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001643 h = gethostbyaddr((char *)&addr.sin_addr,
1644 sizeof(addr.sin_addr),
1645 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001646#endif /* HAVE_GETHOSTBYNAME_R */
1647 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001648 ret = gethost_common(h, &addr);
1649#ifdef USE_GETHOSTBYNAME_LOCK
1650 PyThread_release_lock(gethostbyname_lock);
1651#endif
1652 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001653}
1654
Guido van Rossum82a5c661998-07-07 20:45:43 +00001655static char gethostbyaddr_doc[] =
1656"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1657\n\
1658Return the true host name, a list of aliases, and a list of IP addresses,\n\
1659for a host. The host argument is a string giving a host name or IP number.";
1660
Guido van Rossum30a685f1991-06-27 15:51:29 +00001661
1662/* Python interface to getservbyname(name).
1663 This only returns the port number, since the other info is already
1664 known or not useful (like the list of aliases). */
1665
1666/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001667static PyObject *
1668BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001669{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001670 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001671 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001672 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001673 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001674 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001675 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001676 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001677 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001678 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001679 return NULL;
1680 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001681 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001682}
1683
Guido van Rossum82a5c661998-07-07 20:45:43 +00001684static char getservbyname_doc[] =
1685"getservbyname(servicename, protocolname) -> integer\n\
1686\n\
1687Return a port number from a service name and protocol name.\n\
1688The protocol name should be 'tcp' or 'udp'.";
1689
Guido van Rossum30a685f1991-06-27 15:51:29 +00001690
Guido van Rossum3901d851996-12-19 16:35:04 +00001691/* Python interface to getprotobyname(name).
1692 This only returns the protocol number, since the other info is
1693 already known or not useful (like the list of aliases). */
1694
1695/*ARGSUSED*/
1696static PyObject *
1697BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1698{
1699 char *name;
1700 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001701#ifdef __BEOS__
1702/* Not available in BeOS yet. - [cjh] */
1703 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1704 return NULL;
1705#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001706 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001707 return NULL;
1708 Py_BEGIN_ALLOW_THREADS
1709 sp = getprotobyname(name);
1710 Py_END_ALLOW_THREADS
1711 if (sp == NULL) {
1712 PyErr_SetString(PySocket_Error, "protocol not found");
1713 return NULL;
1714 }
1715 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001716#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001717}
1718
Guido van Rossum82a5c661998-07-07 20:45:43 +00001719static char getprotobyname_doc[] =
1720"getprotobyname(name) -> integer\n\
1721\n\
1722Return the protocol number for the named protocol. (Rarely used.)";
1723
Guido van Rossum3901d851996-12-19 16:35:04 +00001724
Guido van Rossum30a685f1991-06-27 15:51:29 +00001725/* Python interface to socket(family, type, proto).
1726 The third (protocol) argument is optional.
1727 Return a new socket object. */
1728
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001729/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001730static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001731BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001732{
Guido van Rossum73624e91994-10-10 17:59:00 +00001733 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001734 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001735 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001736 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001737 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001738 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001739 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001740 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001741#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001742 if (fd == INVALID_SOCKET)
1743#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001744 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001745#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001746 return PySocket_Err();
1747 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001748 /* If the object can't be created, don't forget to close the
1749 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001750 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001751 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001752 /* From now on, ignore SIGPIPE and let the error checking
1753 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001754#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001755 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001756#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001757 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001758}
1759
Guido van Rossum82a5c661998-07-07 20:45:43 +00001760static char socket_doc[] =
1761"socket(family, type[, proto]) -> socket object\n\
1762\n\
1763Open a socket of the given type. The family argument specifies the\n\
1764address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1765The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1766or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1767specifying the default protocol.";
1768
1769
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001770#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001771/* Create a socket object from a numeric file description.
1772 Useful e.g. if stdin is a socket.
1773 Additional arguments as for socket(). */
1774
1775/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001776static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001777BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001778{
Guido van Rossum73624e91994-10-10 17:59:00 +00001779 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001780 SOCKET_T fd;
1781 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001782 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1783 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001784 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001785 /* Dup the fd so it and the socket can be closed independently */
1786 fd = dup(fd);
1787 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001788 return PySocket_Err();
1789 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001790 /* From now on, ignore SIGPIPE and let the error checking
1791 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001792#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001793 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001794#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001795 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001796}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001797
1798static char fromfd_doc[] =
1799"fromfd(fd, family, type[, proto]) -> socket object\n\
1800\n\
1801Create a socket object from the given file descriptor.\n\
1802The remaining arguments are the same as for socket().";
1803
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001804#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001805
Guido van Rossum82a5c661998-07-07 20:45:43 +00001806
Guido van Rossum006bf911996-06-12 04:04:55 +00001807static PyObject *
1808BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1809{
1810 int x1, x2;
1811
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001812 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001813 return NULL;
1814 }
1815 x2 = (int)ntohs((short)x1);
1816 return PyInt_FromLong(x2);
1817}
1818
Guido van Rossum82a5c661998-07-07 20:45:43 +00001819static char ntohs_doc[] =
1820"ntohs(integer) -> integer\n\
1821\n\
1822Convert a 16-bit integer from network to host byte order.";
1823
1824
Guido van Rossum006bf911996-06-12 04:04:55 +00001825static PyObject *
1826BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1827{
1828 int x1, x2;
1829
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001830 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001831 return NULL;
1832 }
1833 x2 = ntohl(x1);
1834 return PyInt_FromLong(x2);
1835}
1836
Guido van Rossum82a5c661998-07-07 20:45:43 +00001837static char ntohl_doc[] =
1838"ntohl(integer) -> integer\n\
1839\n\
1840Convert a 32-bit integer from network to host byte order.";
1841
1842
Guido van Rossum006bf911996-06-12 04:04:55 +00001843static PyObject *
1844BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1845{
1846 int x1, x2;
1847
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001848 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001849 return NULL;
1850 }
1851 x2 = (int)htons((short)x1);
1852 return PyInt_FromLong(x2);
1853}
1854
Guido van Rossum82a5c661998-07-07 20:45:43 +00001855static char htons_doc[] =
1856"htons(integer) -> integer\n\
1857\n\
1858Convert a 16-bit integer from host to network byte order.";
1859
1860
Guido van Rossum006bf911996-06-12 04:04:55 +00001861static PyObject *
1862BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1863{
1864 int x1, x2;
1865
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001866 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001867 return NULL;
1868 }
1869 x2 = htonl(x1);
1870 return PyInt_FromLong(x2);
1871}
1872
Guido van Rossum82a5c661998-07-07 20:45:43 +00001873static char htonl_doc[] =
1874"htonl(integer) -> integer\n\
1875\n\
1876Convert a 32-bit integer from host to network byte order.";
1877
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001878/*
1879 * socket.inet_aton() and socket.inet_ntoa() functions
1880 *
1881 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
1882 *
1883 */
1884
1885static char inet_aton_doc[] =
1886"inet_aton(string) -> packed 32-bit IP representation\n\
1887\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001888Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001889binary format used in low-level network functions.";
1890
1891static PyObject*
1892BUILD_FUNC_DEF_2(PySocket_inet_aton, PyObject *, self, PyObject *, args)
1893{
Guido van Rossuma2e48551999-09-09 15:42:59 +00001894#ifndef INADDR_NONE
1895#define INADDR_NONE (-1)
1896#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001897
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001898 /* Have to use inet_addr() instead */
1899 char *ip_addr;
1900 long packed_addr;
1901
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001902 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001903 return NULL;
1904 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00001905#ifdef USE_GUSI1
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001906 packed_addr = (long)inet_addr(ip_addr).s_addr;
1907#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001908 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001909#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001910
1911 if (packed_addr == INADDR_NONE) { /* invalid address */
1912 PyErr_SetString(PySocket_Error,
1913 "illegal IP address string passed to inet_aton");
1914 return NULL;
1915 }
1916
1917 return PyString_FromStringAndSize((char *) &packed_addr,
1918 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001919}
1920
1921static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00001922"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001923\n\
1924Convert an IP address from 32-bit packed binary format to string format";
1925
1926static PyObject*
1927BUILD_FUNC_DEF_2(PySocket_inet_ntoa, PyObject *, self, PyObject *, args)
1928{
1929 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001930 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001931 struct in_addr packed_addr;
1932
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001933 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001934 return NULL;
1935 }
1936
1937 if (addr_len != sizeof(packed_addr)) {
1938 PyErr_SetString(PySocket_Error,
1939 "packed IP wrong length for inet_ntoa");
1940 return NULL;
1941 }
1942
1943 memcpy(&packed_addr, packed_str, addr_len);
1944
1945 return PyString_FromString(inet_ntoa(packed_addr));
1946}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001947
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001948
1949#ifdef USE_SSL
1950
1951/* This is a C function to be called for new object initialization */
1952static SSLObject *
1953BUILD_FUNC_DEF_3(newSSLObject,
1954 PySocketSockObject *,Sock, char*,key_file, char*,cert_file)
1955{
1956 SSLObject *self;
1957 char *str;
1958
1959#if 0
1960 meth=SSLv23_client_method();
1961 meth=SSLv3_client_method();
1962 meth=SSLv2_client_method();
1963#endif
1964
Guido van Rossumb18618d2000-05-03 23:44:39 +00001965 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001966 if (self == NULL){
1967 PyErr_SetObject(SSLErrorObject,
1968 PyString_FromString("newSSLObject error"));
1969 return NULL;
1970 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001971 memset(self->server, '\0', sizeof(char) * 256);
1972 memset(self->issuer, '\0', sizeof(char) * 256);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001973
1974 self->x_attr = PyDict_New();
1975 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
1976 if (self->ctx == NULL) {
1977 PyErr_SetObject(SSLErrorObject,
1978 PyString_FromString("SSL_CTX_new error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00001979 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001980 return NULL;
1981 }
1982
1983 if ( (key_file && !cert_file) || (!key_file && cert_file) )
1984 {
1985 PyErr_SetObject(SSLErrorObject,
1986 PyString_FromString(
1987 "Both the key & certificate files must be specified"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00001988 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001989 return NULL;
1990 }
1991
1992 if (key_file && cert_file)
1993 {
1994 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
1995 SSL_FILETYPE_PEM) < 1)
1996 {
1997 PyErr_SetObject(SSLErrorObject,
1998 PyString_FromString(
1999 "SSL_CTX_use_PrivateKey_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002000 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002001 return NULL;
2002 }
2003
2004 if (SSL_CTX_use_certificate_chain_file(self->ctx,
2005 cert_file) < 1)
2006 {
2007 PyErr_SetObject(SSLErrorObject,
2008 PyString_FromString(
2009 "SSL_CTX_use_certificate_chain_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002010 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002011 return NULL;
2012 }
2013 }
2014
2015 SSL_CTX_set_verify(self->ctx,
2016 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2017 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2018 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2019 SSL_set_connect_state(self->ssl);
2020
2021 if ((SSL_connect(self->ssl)) == -1) {
2022 /* Actually negotiate SSL connection */
2023 PyErr_SetObject(SSLErrorObject,
2024 PyString_FromString("SSL_connect error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002025 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002026 return NULL;
2027 }
2028 self->ssl->debug = 1;
2029
2030 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2031 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2032 self->server, 256);
2033 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2034 self->issuer, 256);
2035 }
2036 self->x_attr = NULL;
2037 self->Socket = Sock;
2038 Py_INCREF(self->Socket);
2039 return self;
2040}
2041
2042/* This is the Python function called for new object initialization */
2043static PyObject *
2044BUILD_FUNC_DEF_2(PySocket_ssl, PyObject *, self, PyObject *, args)
2045{
2046 SSLObject *rv;
2047 PySocketSockObject *Sock;
2048 char *key_file;
2049 char *cert_file;
2050
Guido van Rossum43713e52000-02-29 13:59:29 +00002051 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002052 &PySocketSock_Type, (PyObject*)&Sock,
2053 &key_file, &cert_file) )
2054 return NULL;
2055
2056 rv = newSSLObject(Sock, key_file, cert_file);
2057 if ( rv == NULL )
2058 return NULL;
2059 return (PyObject *)rv;
2060}
2061
2062static char ssl_doc[] =
2063"ssl(socket, keyfile, certfile) -> sslobject";
2064
2065static PyObject *
2066BUILD_FUNC_DEF_2(SSL_server, SSLObject *, self, PyObject *, args)
2067{
2068 return PyString_FromString(self->server);
2069}
2070
2071static PyObject *
2072BUILD_FUNC_DEF_2(SSL_issuer, SSLObject *, self, PyObject *, args)
2073{
2074 return PyString_FromString(self->issuer);
2075}
2076
2077
2078/* SSL object methods */
2079
2080static PyMethodDef SSLMethods[] = {
2081 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2082 { "read", (PyCFunction)SSL_SSLread, 1 },
2083 { "server", (PyCFunction)SSL_server, 1 },
2084 { "issuer", (PyCFunction)SSL_issuer, 1 },
2085 { NULL, NULL}
2086};
2087
2088static void SSL_dealloc(SSLObject *self)
2089{
2090 if (self->server_cert) /* Possible not to have one? */
2091 X509_free (self->server_cert);
2092 SSL_CTX_free(self->ctx);
2093 SSL_free(self->ssl);
2094 Py_XDECREF(self->x_attr);
2095 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002096 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002097}
2098
2099static PyObject *SSL_getattr(SSLObject *self, char *name)
2100{
2101 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2102}
2103
2104staticforward PyTypeObject SSL_Type = {
2105 PyObject_HEAD_INIT(&PyType_Type)
2106 0, /*ob_size*/
2107 "SSL", /*tp_name*/
2108 sizeof(SSLObject), /*tp_basicsize*/
2109 0, /*tp_itemsize*/
2110 /* methods */
2111 (destructor)SSL_dealloc, /*tp_dealloc*/
2112 0, /*tp_print*/
2113 (getattrfunc)SSL_getattr, /*tp_getattr*/
2114 0, /*tp_setattr*/
2115 0, /*tp_compare*/
2116 0, /*tp_repr*/
2117 0, /*tp_as_number*/
2118 0, /*tp_as_sequence*/
2119 0, /*tp_as_mapping*/
2120 0, /*tp_hash*/
2121};
2122
2123
2124
2125static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2126{
2127 char *data;
Fred Drakea04eaad2000-06-30 02:46:07 +00002128 size_t len = 0;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002129
Guido van Rossum43713e52000-02-29 13:59:29 +00002130 if (!PyArg_ParseTuple(args, "s|i:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002131 return NULL;
2132
2133 if (!len)
2134 len = strlen(data);
2135
2136 len = SSL_write(self->ssl, data, len);
2137 return PyInt_FromLong((long)len);
2138}
2139
2140static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2141{
2142 PyObject *buf;
2143 int count = 0;
2144 int len = 1024;
2145 int res;
2146
Guido van Rossum43713e52000-02-29 13:59:29 +00002147 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002148
2149 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2150 return NULL; /* Error object should already be set */
2151
2152 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2153 res = SSL_get_error(self->ssl, count);
2154
2155 switch (res) {
2156 case 0: /* Good return value! */
2157 break;
2158 case 6:
2159 PyErr_SetString(SSLErrorObject, "EOF");
2160 Py_DECREF(buf);
2161 return NULL;
2162 break;
2163 case 5:
2164 default:
2165 return PyErr_SetFromErrno(SSLErrorObject);
2166 break;
2167 }
2168
2169 fflush(stderr);
2170
2171 if (count < 0) {
2172 Py_DECREF(buf);
2173 return PyErr_SetFromErrno(SSLErrorObject);
2174 }
2175
2176 if (count != len && _PyString_Resize(&buf, count) < 0)
2177 return NULL;
2178 return buf;
2179}
2180
2181#endif /* USE_SSL */
2182
2183
Guido van Rossum30a685f1991-06-27 15:51:29 +00002184/* List of functions exported by this module. */
2185
Guido van Rossum73624e91994-10-10 17:59:00 +00002186static PyMethodDef PySocket_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002187 {"gethostbyname", PySocket_gethostbyname, 1, gethostbyname_doc},
2188 {"gethostbyname_ex", PySocket_gethostbyname_ex, 1, ghbn_ex_doc},
2189 {"gethostbyaddr", PySocket_gethostbyaddr, 1, gethostbyaddr_doc},
2190 {"gethostname", PySocket_gethostname, 1, gethostname_doc},
2191 {"getservbyname", PySocket_getservbyname, 1, getservbyname_doc},
2192 {"getprotobyname", PySocket_getprotobyname, 1,getprotobyname_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00002193 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002194#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00002195 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002196#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002197 {"ntohs", PySocket_ntohs, 1, ntohs_doc},
2198 {"ntohl", PySocket_ntohl, 1, ntohl_doc},
2199 {"htons", PySocket_htons, 1, htons_doc},
2200 {"htonl", PySocket_htonl, 1, htonl_doc},
2201 {"inet_aton", PySocket_inet_aton, 1, inet_aton_doc},
2202 {"inet_ntoa", PySocket_inet_ntoa, 1, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002203#ifdef USE_SSL
2204 {"ssl", PySocket_ssl, 1, ssl_doc},
2205#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002206 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002207};
2208
Guido van Rossum30a685f1991-06-27 15:51:29 +00002209
2210/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002211 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002212 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002213 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002214static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002215BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002216{
Guido van Rossum73624e91994-10-10 17:59:00 +00002217 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002218 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002219 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002220
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002221 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002222}
2223
Guido van Rossum30a685f1991-06-27 15:51:29 +00002224
Guido van Rossum8d665e61996-06-26 18:22:49 +00002225#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002226
2227/* Additional initialization and cleanup for NT/Windows */
2228
2229static void
2230NTcleanup()
2231{
2232 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002233}
2234
2235static int
2236NTinit()
2237{
2238 WSADATA WSAData;
2239 int ret;
2240 char buf[100];
2241 ret = WSAStartup(0x0101, &WSAData);
2242 switch (ret) {
2243 case 0: /* no error */
2244 atexit(NTcleanup);
2245 return 1;
2246 case WSASYSNOTREADY:
2247 PyErr_SetString(PyExc_ImportError,
2248 "WSAStartup failed: network not ready");
2249 break;
2250 case WSAVERNOTSUPPORTED:
2251 case WSAEINVAL:
2252 PyErr_SetString(PyExc_ImportError,
2253 "WSAStartup failed: requested version not supported");
2254 break;
2255 default:
2256 sprintf(buf, "WSAStartup failed: error code %d", ret);
2257 PyErr_SetString(PyExc_ImportError, buf);
2258 break;
2259 }
2260 return 0;
2261}
2262
Guido van Rossum8d665e61996-06-26 18:22:49 +00002263#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002264
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002265#if defined(PYOS_OS2)
2266
2267/* Additional initialization and cleanup for OS/2 */
2268
2269static void
2270OS2cleanup()
2271{
2272 /* No cleanup is necessary for OS/2 Sockets */
2273}
2274
2275static int
2276OS2init()
2277{
2278 char reason[64];
2279 int rc = sock_init();
2280
2281 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002282 atexit(OS2cleanup);
2283 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002284 }
2285
2286 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2287 PyErr_SetString(PyExc_ImportError, reason);
2288
Guido van Rossum32c575d1997-12-02 20:37:32 +00002289 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002290}
2291
2292#endif /* PYOS_OS2 */
2293
Guido van Rossum30a685f1991-06-27 15:51:29 +00002294/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002295 * This is called when the first 'import socket' is done,
2296 * via a table in config.c, if config.c is compiled with USE_SOCKET
2297 * defined.
2298 *
2299 * For MS_WINDOWS (which means any Windows variant), this module
2300 * is actually called "_socket", and there's a wrapper "socket.py"
2301 * which implements some missing functionality (such as makefile(),
2302 * dup() and fromfd()). The import of "_socket" may fail with an
2303 * ImportError exception if initialization of WINSOCK fails. When
2304 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2305 * scheduled to be made at exit time.
2306 *
2307 * For OS/2, this module is also called "_socket" and uses a wrapper
2308 * "socket.py" which implements that functionality that is missing
2309 * when PC operating systems don't put socket descriptors in the
2310 * operating system's filesystem layer.
2311 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002312
Guido van Rossum82a5c661998-07-07 20:45:43 +00002313static char module_doc[] =
2314"This module provides socket operations and some related functions.\n\
2315On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
2316On other systems, it only supports IP.\n\
2317\n\
2318Functions:\n\
2319\n\
2320socket() -- create a new socket object\n\
2321fromfd() -- create a socket object from an open file descriptor (*)\n\
2322gethostname() -- return the current hostname\n\
2323gethostbyname() -- map a hostname to its IP number\n\
2324gethostbyaddr() -- map an IP number or hostname to DNS info\n\
2325getservbyname() -- map a service name and a protocol name to a port number\n\
2326getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
2327ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
2328htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002329inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format\n\
2330inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)\n\
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002331ssl() -- secure socket layer support (only available if configured)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002332\n\
2333(*) not available on all platforms!)\n\
2334\n\
2335Special objects:\n\
2336\n\
2337SocketType -- type object for socket objects\n\
2338error -- exception raised for I/O errors\n\
2339\n\
2340Integer constants:\n\
2341\n\
2342AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
2343SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
2344\n\
2345Many other constants may be defined; these may be used in calls to\n\
2346the setsockopt() and getsockopt() methods.\n\
2347";
2348
2349static char sockettype_doc[] =
2350"A socket represents one endpoint of a network connection.\n\
2351\n\
2352Methods:\n\
2353\n\
2354accept() -- accept a connection, returning new socket and client address\n\
2355bind() -- bind the socket to a local address\n\
2356close() -- close the socket\n\
2357connect() -- connect the socket to a remote address\n\
2358connect_ex() -- connect, return an error code instead of an exception \n\
2359dup() -- return a new socket object identical to the current one (*)\n\
2360fileno() -- return underlying file descriptor\n\
2361getpeername() -- return remote address (*)\n\
2362getsockname() -- return local address\n\
2363getsockopt() -- get socket options\n\
2364listen() -- start listening for incoming connections\n\
2365makefile() -- return a file object corresponding tot the socket (*)\n\
2366recv() -- receive data\n\
2367recvfrom() -- receive data and sender's address\n\
2368send() -- send data\n\
2369sendto() -- send data to a given address\n\
2370setblocking() -- set or clear the blocking I/O flag\n\
2371setsockopt() -- set socket options\n\
2372shutdown() -- shut down traffic in one or both directions\n\
2373\n\
2374(*) not available on all platforms!)";
2375
Guido van Rossum3886bb61998-12-04 18:50:17 +00002376DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00002377#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002378init_socket()
2379#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002380initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00002381#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002382{
Guido van Rossum73624e91994-10-10 17:59:00 +00002383 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00002384#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002385 if (!NTinit())
2386 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002387 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002388#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002389#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002390 if (!OS2init())
2391 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002392 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002393#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00002394#if defined(__BEOS__)
2395 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
2396#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002397 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002398#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00002399#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00002400#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002401 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002402 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2403 if (PySocket_Error == NULL)
2404 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002405#ifdef USE_SSL
2406 SSL_load_error_strings();
2407 SSLeay_add_ssl_algorithms();
2408 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2409 if (SSLErrorObject == NULL)
2410 return;
2411 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2412 Py_INCREF(&SSL_Type);
2413 if (PyDict_SetItemString(d, "SSLType",
2414 (PyObject *)&SSL_Type) != 0)
2415 return;
2416#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002417 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002418 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002419 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002420 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002421 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002422 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002423 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002424
2425 /* Address families (we only support AF_INET and AF_UNIX) */
2426#ifdef AF_UNSPEC
2427 insint(d, "AF_UNSPEC", AF_UNSPEC);
2428#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002429 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002430#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002431 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002432#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002433#ifdef AF_AX25
2434 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2435#endif
2436#ifdef AF_IPX
2437 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2438#endif
2439#ifdef AF_APPLETALK
2440 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2441#endif
2442#ifdef AF_NETROM
2443 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2444#endif
2445#ifdef AF_BRIDGE
2446 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2447#endif
2448#ifdef AF_AAL5
2449 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2450#endif
2451#ifdef AF_X25
2452 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2453#endif
2454#ifdef AF_INET6
2455 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2456#endif
2457#ifdef AF_ROSE
2458 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2459#endif
2460
2461 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002462 insint(d, "SOCK_STREAM", SOCK_STREAM);
2463 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002464#ifndef __BEOS__
2465/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002466 insint(d, "SOCK_RAW", SOCK_RAW);
2467 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2468 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002469#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002470
2471#ifdef SO_DEBUG
2472 insint(d, "SO_DEBUG", SO_DEBUG);
2473#endif
2474#ifdef SO_ACCEPTCONN
2475 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2476#endif
2477#ifdef SO_REUSEADDR
2478 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2479#endif
2480#ifdef SO_KEEPALIVE
2481 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2482#endif
2483#ifdef SO_DONTROUTE
2484 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2485#endif
2486#ifdef SO_BROADCAST
2487 insint(d, "SO_BROADCAST", SO_BROADCAST);
2488#endif
2489#ifdef SO_USELOOPBACK
2490 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2491#endif
2492#ifdef SO_LINGER
2493 insint(d, "SO_LINGER", SO_LINGER);
2494#endif
2495#ifdef SO_OOBINLINE
2496 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2497#endif
2498#ifdef SO_REUSEPORT
2499 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2500#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002501#ifdef SO_SNDBUF
2502 insint(d, "SO_SNDBUF", SO_SNDBUF);
2503#endif
2504#ifdef SO_RCVBUF
2505 insint(d, "SO_RCVBUF", SO_RCVBUF);
2506#endif
2507#ifdef SO_SNDLOWAT
2508 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2509#endif
2510#ifdef SO_RCVLOWAT
2511 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2512#endif
2513#ifdef SO_SNDTIMEO
2514 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2515#endif
2516#ifdef SO_RCVTIMEO
2517 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2518#endif
2519#ifdef SO_ERROR
2520 insint(d, "SO_ERROR", SO_ERROR);
2521#endif
2522#ifdef SO_TYPE
2523 insint(d, "SO_TYPE", SO_TYPE);
2524#endif
2525
2526 /* Maximum number of connections for "listen" */
2527#ifdef SOMAXCONN
2528 insint(d, "SOMAXCONN", SOMAXCONN);
2529#else
2530 insint(d, "SOMAXCONN", 5); /* Common value */
2531#endif
2532
2533 /* Flags for send, recv */
2534#ifdef MSG_OOB
2535 insint(d, "MSG_OOB", MSG_OOB);
2536#endif
2537#ifdef MSG_PEEK
2538 insint(d, "MSG_PEEK", MSG_PEEK);
2539#endif
2540#ifdef MSG_DONTROUTE
2541 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2542#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002543#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00002544 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002545#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002546#ifdef MSG_EOR
2547 insint(d, "MSG_EOR", MSG_EOR);
2548#endif
2549#ifdef MSG_TRUNC
2550 insint(d, "MSG_TRUNC", MSG_TRUNC);
2551#endif
2552#ifdef MSG_CTRUNC
2553 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2554#endif
2555#ifdef MSG_WAITALL
2556 insint(d, "MSG_WAITALL", MSG_WAITALL);
2557#endif
2558#ifdef MSG_BTAG
2559 insint(d, "MSG_BTAG", MSG_BTAG);
2560#endif
2561#ifdef MSG_ETAG
2562 insint(d, "MSG_ETAG", MSG_ETAG);
2563#endif
2564
2565 /* Protocol level and numbers, usable for [gs]etsockopt */
2566#ifdef SOL_SOCKET
2567 insint(d, "SOL_SOCKET", SOL_SOCKET);
2568#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002569#ifdef SOL_IP
2570 insint(d, "SOL_IP", SOL_IP);
2571#else
2572 insint(d, "SOL_IP", 0);
2573#endif
2574#ifdef SOL_IPX
2575 insint(d, "SOL_IPX", SOL_IPX);
2576#endif
2577#ifdef SOL_AX25
2578 insint(d, "SOL_AX25", SOL_AX25);
2579#endif
2580#ifdef SOL_ATALK
2581 insint(d, "SOL_ATALK", SOL_ATALK);
2582#endif
2583#ifdef SOL_NETROM
2584 insint(d, "SOL_NETROM", SOL_NETROM);
2585#endif
2586#ifdef SOL_ROSE
2587 insint(d, "SOL_ROSE", SOL_ROSE);
2588#endif
2589#ifdef SOL_TCP
2590 insint(d, "SOL_TCP", SOL_TCP);
2591#else
2592 insint(d, "SOL_TCP", 6);
2593#endif
2594#ifdef SOL_UDP
2595 insint(d, "SOL_UDP", SOL_UDP);
2596#else
2597 insint(d, "SOL_UDP", 17);
2598#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002599#ifdef IPPROTO_IP
2600 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002601#else
2602 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002603#endif
2604#ifdef IPPROTO_ICMP
2605 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002606#else
2607 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002608#endif
2609#ifdef IPPROTO_IGMP
2610 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2611#endif
2612#ifdef IPPROTO_GGP
2613 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2614#endif
2615#ifdef IPPROTO_TCP
2616 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002617#else
2618 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002619#endif
2620#ifdef IPPROTO_EGP
2621 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2622#endif
2623#ifdef IPPROTO_PUP
2624 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2625#endif
2626#ifdef IPPROTO_UDP
2627 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002628#else
2629 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002630#endif
2631#ifdef IPPROTO_IDP
2632 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2633#endif
2634#ifdef IPPROTO_HELLO
2635 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2636#endif
2637#ifdef IPPROTO_ND
2638 insint(d, "IPPROTO_ND", IPPROTO_ND);
2639#endif
2640#ifdef IPPROTO_TP
2641 insint(d, "IPPROTO_TP", IPPROTO_TP);
2642#endif
2643#ifdef IPPROTO_XTP
2644 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2645#endif
2646#ifdef IPPROTO_EON
2647 insint(d, "IPPROTO_EON", IPPROTO_EON);
2648#endif
2649#ifdef IPPROTO_BIP
2650 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2651#endif
2652/**/
2653#ifdef IPPROTO_RAW
2654 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002655#else
2656 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002657#endif
2658#ifdef IPPROTO_MAX
2659 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2660#endif
2661
2662 /* Some port configuration */
2663#ifdef IPPORT_RESERVED
2664 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2665#else
2666 insint(d, "IPPORT_RESERVED", 1024);
2667#endif
2668#ifdef IPPORT_USERRESERVED
2669 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2670#else
2671 insint(d, "IPPORT_USERRESERVED", 5000);
2672#endif
2673
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002674 /* Some reserved IP v.4 addresses */
2675#ifdef INADDR_ANY
2676 insint(d, "INADDR_ANY", INADDR_ANY);
2677#else
2678 insint(d, "INADDR_ANY", 0x00000000);
2679#endif
2680#ifdef INADDR_BROADCAST
2681 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2682#else
2683 insint(d, "INADDR_BROADCAST", 0xffffffff);
2684#endif
2685#ifdef INADDR_LOOPBACK
2686 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2687#else
2688 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2689#endif
2690#ifdef INADDR_UNSPEC_GROUP
2691 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2692#else
2693 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2694#endif
2695#ifdef INADDR_ALLHOSTS_GROUP
2696 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2697#else
2698 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2699#endif
2700#ifdef INADDR_MAX_LOCAL_GROUP
2701 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2702#else
2703 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2704#endif
2705#ifdef INADDR_NONE
2706 insint(d, "INADDR_NONE", INADDR_NONE);
2707#else
2708 insint(d, "INADDR_NONE", 0xffffffff);
2709#endif
2710
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002711 /* IP [gs]etsockopt options */
2712#ifdef IP_OPTIONS
2713 insint(d, "IP_OPTIONS", IP_OPTIONS);
2714#endif
2715#ifdef IP_HDRINCL
2716 insint(d, "IP_HDRINCL", IP_HDRINCL);
2717#endif
2718#ifdef IP_TOS
2719 insint(d, "IP_TOS", IP_TOS);
2720#endif
2721#ifdef IP_TTL
2722 insint(d, "IP_TTL", IP_TTL);
2723#endif
2724#ifdef IP_RECVOPTS
2725 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2726#endif
2727#ifdef IP_RECVRETOPTS
2728 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2729#endif
2730#ifdef IP_RECVDSTADDR
2731 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2732#endif
2733#ifdef IP_RETOPTS
2734 insint(d, "IP_RETOPTS", IP_RETOPTS);
2735#endif
2736#ifdef IP_MULTICAST_IF
2737 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2738#endif
2739#ifdef IP_MULTICAST_TTL
2740 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2741#endif
2742#ifdef IP_MULTICAST_LOOP
2743 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2744#endif
2745#ifdef IP_ADD_MEMBERSHIP
2746 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2747#endif
2748#ifdef IP_DROP_MEMBERSHIP
2749 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2750#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002751#ifdef IP_DEFAULT_MULTICAST_TTL
2752 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2753#endif
2754#ifdef IP_DEFAULT_MULTICAST_LOOP
2755 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2756#endif
2757#ifdef IP_MAX_MEMBERSHIPS
2758 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2759#endif
2760
2761 /* TCP options */
2762#ifdef TCP_NODELAY
2763 insint(d, "TCP_NODELAY", TCP_NODELAY);
2764#endif
2765#ifdef TCP_MAXSEG
2766 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2767#endif
2768
2769 /* IPX options */
2770#ifdef IPX_TYPE
2771 insint(d, "IPX_TYPE", IPX_TYPE);
2772#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002773
2774 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002775#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002776 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002777#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002778}