blob: 31ec8fcb15259ab6c5c523e7f90fe302c030cbbe [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum6574b3e1991-06-25 21:36:08 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum6574b3e1991-06-25 21:36:08 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000029
30******************************************************************/
31
32/* Socket module */
33
Guido van Rossum09c8b6c1999-12-07 21:37:17 +000034/* SSL support based on patches by Brian E Gallew and Laszlo Kovacs */
35
Guido van Rossum6574b3e1991-06-25 21:36:08 +000036/*
37This module provides an interface to Berkeley socket IPC.
38
39Limitations:
40
Guido van Rossum30a685f1991-06-27 15:51:29 +000041- only AF_INET and AF_UNIX address families are supported
Guido van Rossum81194471991-07-27 21:42:02 +000042- no read/write operations (use send/recv or makefile instead)
Guido van Rossumbe32c891996-06-20 16:25:29 +000043- additional restrictions apply on Windows
Guido van Rossum6574b3e1991-06-25 21:36:08 +000044
Guido van Rossum27e177d1995-03-16 15:43:47 +000045Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000046
Guido van Rossum27e177d1995-03-16 15:43:47 +000047- socket.error: exception raised for socket specific errors
Guido van Rossum30a685f1991-06-27 15:51:29 +000048- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000049- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000050- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000051- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000053- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000054- socket.ntohs(16 bit value) --> new int object
55- socket.ntohl(32 bit value) --> new int object
56- socket.htons(16 bit value) --> new int object
57- socket.htonl(32 bit value) --> new int object
Guido van Rossum27e177d1995-03-16 15:43:47 +000058- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +000059- socket.inet_aton(IP address) -> 32-bit packed IP representation
60- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum09c8b6c1999-12-07 21:37:17 +000061- socket.ssl(socket, keyfile, certfile) -> new ssl object
Guido van Rossum6574b3e1991-06-25 21:36:08 +000062- an Internet socket address is a pair (hostname, port)
63 where hostname can be anything recognized by gethostbyname()
64 (including the dd.dd.dd.dd notation) and port is in host byte order
65- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000066- a UNIX domain socket address is a string specifying the pathname
Guido van Rossum6574b3e1991-06-25 21:36:08 +000067
Guido van Rossum30a685f1991-06-27 15:51:29 +000068Socket methods:
Guido van Rossum527c9bd2000-04-04 14:10:20 +000069(NB: an argument list of the form (sockaddr...) means that multiple
70arguments are treated the same as a single tuple argument, for backwards
Guido van Rossumb49dc752000-04-04 15:09:07 +000071compatibility. This is deprecated, and will be removed in future versions.)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000072
Guido van Rossum81194471991-07-27 21:42:02 +000073- s.accept() --> new socket object, sockaddr
Guido van Rossum527c9bd2000-04-04 14:10:20 +000074- s.bind(sockaddr...) --> None
Guido van Rossum27e177d1995-03-16 15:43:47 +000075- s.close() --> None
Guido van Rossum527c9bd2000-04-04 14:10:20 +000076- s.connect(sockaddr...) --> None
77- s.connect_ex(sockaddr...) --> 0 or errno (handy for e.g. async connect)
Guido van Rossum27e177d1995-03-16 15:43:47 +000078- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000079- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000080- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000081- s.getsockname() --> sockaddr
82- s.getsockopt(level, optname[, buflen]) --> int or string
83- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000084- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000085- s.recv(buflen [,flags]) --> string
86- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000087- s.send(string [,flags]) --> nbytes
88- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000089- s.setblocking(0 | 1) --> None
90- s.setsockopt(level, optname, value) --> None
91- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000092- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000093
Guido van Rossum6574b3e1991-06-25 21:36:08 +000094*/
95
Guido van Rossum73624e91994-10-10 17:59:00 +000096#include "Python.h"
Guido van Rossum3baaa131999-03-22 21:44:51 +000097
Guido van Rossum9376b741999-09-15 22:01:40 +000098/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
99 script doesn't get this right, so we hardcode some platform checks below.
100 On the other hand, not all Linux versions agree, so there the settings
101 computed by the configure script are needed! */
102
103#ifndef linux
Guido van Rossume7de2061999-03-24 17:24:33 +0000104#undef HAVE_GETHOSTBYNAME_R_3_ARG
105#undef HAVE_GETHOSTBYNAME_R_5_ARG
106#undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000107#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000108
Guido van Rossum7a122991999-04-13 04:07:32 +0000109#ifndef WITH_THREAD
110#undef HAVE_GETHOSTBYNAME_R
111#endif
112
Guido van Rossume7de2061999-03-24 17:24:33 +0000113#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000114#if defined(_AIX) || defined(__osf__)
Guido van Rossume7de2061999-03-24 17:24:33 +0000115#define HAVE_GETHOSTBYNAME_R_3_ARG
116#elif defined(__sun__) || defined(__sgi)
117#define HAVE_GETHOSTBYNAME_R_5_ARG
118#elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000119/* Rely on the configure script */
Guido van Rossume7de2061999-03-24 17:24:33 +0000120#else
121#undef HAVE_GETHOSTBYNAME_R
122#endif
123#endif
124
Guido van Rossum3baaa131999-03-22 21:44:51 +0000125#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
126#define USE_GETHOSTBYNAME_LOCK
127#endif
128
129#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum49b56061998-10-01 20:42:43 +0000130#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000131#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000132
Guido van Rossuma376cc51996-12-05 23:43:35 +0000133#ifdef HAVE_UNISTD_H
134#include <unistd.h>
135#endif
136
Guido van Rossumbcc20741998-08-04 22:53:56 +0000137#if !defined(MS_WINDOWS) && !defined(PYOS_OS2) && !defined(__BEOS__)
Guido van Rossumfb4130d1996-12-10 15:17:08 +0000138extern int gethostname(); /* For Solaris, at least */
139#endif
140
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000141#if defined(PYCC_VACPP)
142#include <types.h>
143#include <io.h>
144#include <sys/ioctl.h>
145#include <utils.h>
146#include <ctype.h>
147#endif
148
149#if defined(PYOS_OS2)
150#define INCL_DOS
151#define INCL_DOSERRORS
152#define INCL_NOPMAPI
153#include <os2.h>
154#endif
155
Guido van Rossumbcc20741998-08-04 22:53:56 +0000156#if defined(__BEOS__)
157/* It's in the libs, but not the headers... - [cjh] */
158int shutdown( int, int );
159#endif
160
Guido van Rossumb6775db1994-08-01 11:34:53 +0000161#include <sys/types.h>
162#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +0000163
Guido van Rossum81194471991-07-27 21:42:02 +0000164#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000165#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000166#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000167#include <sys/socket.h>
168#include <netinet/in.h>
Fred Drake11b09362000-05-16 13:30:12 +0000169#ifndef __BEOS__
Andrew M. Kuchling52a644c2000-03-31 17:24:30 +0000170#include <netinet/tcp.h>
Fred Drake11b09362000-05-16 13:30:12 +0000171#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000172
Guido van Rossum9376b741999-09-15 22:01:40 +0000173/* Headers needed for inet_ntoa() and inet_addr() */
174#ifdef __BEOS__
175#include <net/netdb.h>
176#else
Guido van Rossumff3ab422000-04-24 15:16:03 +0000177#ifndef USE_GUSI1
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000178#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000179#endif
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000180#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000181
Guido van Rossume4485b01994-09-07 14:32:49 +0000182#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000183#else
184#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000185#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000186#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000187#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000188#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000189#else
190#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000191#endif
192
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000193#ifndef O_NDELAY
194#define O_NDELAY O_NONBLOCK /* For QNX only? */
195#endif
196
Guido van Rossumff3ab422000-04-24 15:16:03 +0000197#ifdef USE_GUSI1
Jack Jansen508537b1996-02-14 15:57:45 +0000198/* fdopen() isn't declared in stdio.h (sigh) */
199#include <GUSI.h>
200#endif
201
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000202#ifdef USE_SSL
203#include "rsa.h"
204#include "crypto.h"
205#include "x509.h"
206#include "pem.h"
207#include "ssl.h"
208#include "err.h"
209#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000210
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000211/* Here we have some hacks to choose between K&R or ANSI style function
212 definitions. For NT to build this as an extension module (ie, DLL)
213 it must be compiled by the C++ compiler, as it takes the address of
214 a static data item exported from the main Python DLL.
215*/
Guido van Rossumbcc20741998-08-04 22:53:56 +0000216#if defined(MS_WINDOWS) || defined(__BEOS__)
217/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000218/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000219#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000220#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000221#define FORCE_ANSI_FUNC_DEFS
222#endif
223
Fred Drakea04eaad2000-06-30 02:46:07 +0000224/* abstract the socket file descriptor type */
225#ifdef MS_WINDOWS
226typedef SOCKET SOCKET_T;
227# ifdef MS_WIN64
228# define SIZEOF_SOCKET_T 8
229# else
230# define SIZEOF_SOCKET_T 4
231# endif
232#else
233typedef int SOCKET_T;
234# define SIZEOF_SOCKET_T SIZEOF_INT
235#endif
236
237
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000238#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000239#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000240#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
241#define FORCE_ANSI_FUNC_DEFS
242#endif
243
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000244#ifndef SOCKETCLOSE
245#define SOCKETCLOSE close
246#endif
247
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000248#ifdef FORCE_ANSI_FUNC_DEFS
249#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
250fnname( arg1type arg1name )
251
252#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
253fnname( arg1type arg1name, arg2type arg2name )
254
255#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
256fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
257
258#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
259fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
260
261#else /* !FORCE_ANSI_FN_DEFS */
262#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
263fnname( arg1name ) \
264 arg1type arg1name;
265
266#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
267fnname( arg1name, arg2name ) \
268 arg1type arg1name; \
269 arg2type arg2name;
270
271#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
272fnname( arg1name, arg2name, arg3name ) \
273 arg1type arg1name; \
274 arg2type arg2name; \
275 arg3type arg3name;
276
277#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
278fnname( arg1name, arg2name, arg3name, arg4name ) \
279 arg1type arg1name; \
280 arg2type arg2name; \
281 arg3type arg3name; \
282 arg4type arg4name;
283
284#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000285
286/* Global variable holding the exception type for errors detected
287 by this module (but not argument type or memory errors, etc.). */
288
Guido van Rossum73624e91994-10-10 17:59:00 +0000289static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000290
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000291#ifdef USE_SSL
292static PyObject *SSLErrorObject;
293#endif /* USE_SSL */
294
Guido van Rossum30a685f1991-06-27 15:51:29 +0000295
296/* Convenience function to raise an error according to errno
297 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000298
Guido van Rossum73624e91994-10-10 17:59:00 +0000299static PyObject *
300PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000301{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000302#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000303 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000304 PyObject *v;
305 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000306 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000307 PyErr_SetObject(PySocket_Error, v);
308 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000309 }
310 return NULL;
311 }
312 else
313#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000314
315#if defined(PYOS_OS2)
316 if (sock_errno() != NO_ERROR) {
317 APIRET rc;
318 ULONG msglen;
319 char outbuf[100];
320 int myerrorcode = sock_errno();
321
322 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
323 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
324 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
325 if (rc == NO_ERROR) {
326 PyObject *v;
327
328 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
329 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
330 char *lastc = &outbuf[ strlen(outbuf)-1 ];
331 while (lastc > outbuf && isspace(*lastc))
332 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
333 }
334 v = Py_BuildValue("(is)", myerrorcode, outbuf);
335 if (v != NULL) {
336 PyErr_SetObject(PySocket_Error, v);
337 Py_DECREF(v);
338 }
339 return NULL;
340 }
341 }
342#endif
343
Guido van Rossum73624e91994-10-10 17:59:00 +0000344 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000345}
346
Guido van Rossum30a685f1991-06-27 15:51:29 +0000347
348/* The object holding a socket. It holds some extra information,
349 like the address family, which is used to decode socket address
350 arguments properly. */
351
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000352typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000353 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000354 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000355 int sock_family; /* Address family, e.g., AF_INET */
356 int sock_type; /* Socket type, e.g., SOCK_STREAM */
357 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000358 union sock_addr {
359 struct sockaddr_in in;
360#ifdef AF_UNIX
361 struct sockaddr_un un;
362#endif
363 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000364} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000365
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000366#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000367
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000368typedef struct {
369 PyObject_HEAD
370 PySocketSockObject *Socket; /* Socket on which we're layered */
371 PyObject *x_attr; /* Attributes dictionary */
372 SSL_CTX* ctx;
373 SSL* ssl;
374 X509* server_cert;
375 BIO* sbio;
376 char server[256];
377 char issuer[256];
378
379} SSLObject;
380
381staticforward PyTypeObject SSL_Type;
382staticforward int SSL_setattr(SSLObject *self, char *name, PyObject *v);
383staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
384staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
385
386#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
387
388#endif /* USE_SSL */
389
Guido van Rossum30a685f1991-06-27 15:51:29 +0000390/* A forward reference to the Socktype type object.
391 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000392 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000393 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000394
Guido van Rossum73624e91994-10-10 17:59:00 +0000395staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000396
Guido van Rossum30a685f1991-06-27 15:51:29 +0000397
398/* Create a new socket object.
399 This just creates the object and initializes it.
400 If the creation fails, return NULL and set an exception (implicit
401 in NEWOBJ()). */
402
Guido van Rossum73624e91994-10-10 17:59:00 +0000403static PySocketSockObject *
Fred Drakea04eaad2000-06-30 02:46:07 +0000404BUILD_FUNC_DEF_4(PySocketSock_New,SOCKET_T,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000405{
Guido van Rossum73624e91994-10-10 17:59:00 +0000406 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000407 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000408 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000409 if (s != NULL) {
410 s->sock_fd = fd;
411 s->sock_family = family;
412 s->sock_type = type;
413 s->sock_proto = proto;
414 }
415 return s;
416}
417
Guido van Rossum30a685f1991-06-27 15:51:29 +0000418
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000419/* Lock to allow python interpreter to continue, but only allow one
420 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000421#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000422PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000423#endif
424
425
Guido van Rossum30a685f1991-06-27 15:51:29 +0000426/* Convert a string specifying a host name or one of a few symbolic
427 names to a numeric IP address. This usually calls gethostbyname()
428 to do the work; the names "" and "<broadcast>" are special.
429 Return the length (should always be 4 bytes), or negative if
430 an error occurred; then an exception is raised. */
431
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000432static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000433BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000434{
435 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000436 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000437 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000438 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000439#ifdef HAVE_GETHOSTBYNAME_R
440 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000441#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
442 struct hostent_data data;
443#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000444 char buf[1001];
445 int buf_len = (sizeof buf) - 1;
446 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000447#endif
448#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000449 int result;
450#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000451#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000452
Guido van Rossuma376cc51996-12-05 23:43:35 +0000453 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000454 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000455 addr_ret->sin_addr.s_addr = INADDR_ANY;
456 return 4;
457 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000458 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000459 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
460 return 4;
461 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000462 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
463 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
464 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
465 addr_ret->sin_addr.s_addr = htonl(
466 ((long) d1 << 24) | ((long) d2 << 16) |
467 ((long) d3 << 8) | ((long) d4 << 0));
468 return 4;
469 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000470 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000471#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000472#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000473 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000474#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000475 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000476#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000477 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000478 result = gethostbyname_r(name, &hp_allocated, &data);
479 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000480#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000481#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000482#ifdef USE_GETHOSTBYNAME_LOCK
483 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000484#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000485 hp = gethostbyname(name);
486#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000487 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000488
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000489 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000490#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000491 /* Let's get real error message to return */
492 extern int h_errno;
493 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
494#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000495 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000496#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000497#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000498 PyThread_release_lock(gethostbyname_lock);
499#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000500 return -1;
501 }
502 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000503 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000504#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000505 PyThread_release_lock(gethostbyname_lock);
506#endif
507 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000508}
509
Guido van Rossum30a685f1991-06-27 15:51:29 +0000510
Guido van Rossum30a685f1991-06-27 15:51:29 +0000511/* Create a string object representing an IP address.
512 This is always a string of the form 'dd.dd.dd.dd' (with variable
513 size numbers). */
514
Guido van Rossum73624e91994-10-10 17:59:00 +0000515static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000516BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000517{
518 long x = ntohl(addr->sin_addr.s_addr);
519 char buf[100];
520 sprintf(buf, "%d.%d.%d.%d",
521 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
522 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000523 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000524}
525
526
527/* Create an object representing the given socket address,
528 suitable for passing it back to bind(), connect() etc.
529 The family field of the sockaddr structure is inspected
530 to determine what kind of address it really is. */
531
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000532/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000533static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000534BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000535{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000536 if (addrlen == 0) {
537 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000538 Py_INCREF(Py_None);
539 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000540 }
541
Guido van Rossumbcc20741998-08-04 22:53:56 +0000542#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000543 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000544 addr->sa_family = AF_INET;
545#endif
546
Guido van Rossum30a685f1991-06-27 15:51:29 +0000547 switch (addr->sa_family) {
548
549 case AF_INET:
550 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000551 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000552 PyObject *addrobj = makeipaddr(a);
553 PyObject *ret = NULL;
554 if (addrobj) {
555 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
556 Py_DECREF(addrobj);
557 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000558 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000559 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000560
Guido van Rossumb6775db1994-08-01 11:34:53 +0000561#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000562 case AF_UNIX:
563 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000564 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000565 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000566 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000567#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000568
569 /* More cases here... */
570
571 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000572 /* If we don't know the address family, don't raise an
573 exception -- return it as a tuple. */
574 return Py_BuildValue("is#",
575 addr->sa_family,
576 addr->sa_data,
577 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000578
Guido van Rossum30a685f1991-06-27 15:51:29 +0000579 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000580}
581
Guido van Rossum30a685f1991-06-27 15:51:29 +0000582
583/* Parse a socket address argument according to the socket object's
584 address family. Return 1 if the address was in the proper format,
585 0 of not. The address is returned through addr_ret, its length
586 through len_ret. */
587
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000588static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000589BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000590getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000591{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000592 switch (s->sock_family) {
593
Guido van Rossumb6775db1994-08-01 11:34:53 +0000594#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000595 case AF_UNIX:
596 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000597 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000598 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000599 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000600 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000601 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000602 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000603 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000604 PyErr_SetString(PySocket_Error,
605 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000606 return 0;
607 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000608 addr->sun_family = AF_UNIX;
609 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000610 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000611 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000612 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000613 return 1;
614 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000615#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000616
Guido van Rossum30a685f1991-06-27 15:51:29 +0000617 case AF_INET:
618 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000619 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000620 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000621 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000622 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000623 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000624 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000625 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000626 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000627 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000628 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000629 *addr_ret = (struct sockaddr *) addr;
630 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000631 return 1;
632 }
633
Guido van Rossum30a685f1991-06-27 15:51:29 +0000634 /* More cases here... */
635
636 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000637 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000638 return 0;
639
640 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000641}
642
Guido van Rossum30a685f1991-06-27 15:51:29 +0000643
Guido van Rossum710e1df1992-06-12 10:39:36 +0000644/* Get the address length according to the socket object's address family.
645 Return 1 if the family is known, 0 otherwise. The length is returned
646 through len_ret. */
647
648static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000649BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000650{
651 switch (s->sock_family) {
652
Guido van Rossumb6775db1994-08-01 11:34:53 +0000653#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000654 case AF_UNIX:
655 {
656 *len_ret = sizeof (struct sockaddr_un);
657 return 1;
658 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000659#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000660
661 case AF_INET:
662 {
663 *len_ret = sizeof (struct sockaddr_in);
664 return 1;
665 }
666
667 /* More cases here... */
668
669 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000670 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000671 return 0;
672
673 }
674}
675
676
Guido van Rossum30a685f1991-06-27 15:51:29 +0000677/* s.accept() method */
678
Guido van Rossum73624e91994-10-10 17:59:00 +0000679static PyObject *
680BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000681{
682 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000683 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000684 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000685 PyObject *sock = NULL;
686 PyObject *addr = NULL;
687 PyObject *res = NULL;
688
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000689 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000690 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000691 if (!getsockaddrlen(s, &addrlen))
692 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000693 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000694 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000695 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000696#ifdef MS_WINDOWS
697 if (newfd == INVALID_SOCKET)
698#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000699 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000700#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000701 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000702
Guido van Rossum30a685f1991-06-27 15:51:29 +0000703 /* Create the new object with unspecified family,
704 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000705 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000706 s->sock_family,
707 s->sock_type,
708 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000709 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000710 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000711 goto finally;
712 }
713 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
714 goto finally;
715
716 if (!(res = Py_BuildValue("OO", sock, addr)))
717 goto finally;
718
719 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000720 Py_XDECREF(sock);
721 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000722 return res;
723}
724
Guido van Rossum82a5c661998-07-07 20:45:43 +0000725static char accept_doc[] =
726"accept() -> (socket object, address info)\n\
727\n\
728Wait for an incoming connection. Return a new socket representing the\n\
729connection, and the address of the client. For IP sockets, the address\n\
730info is a pair (hostaddr, port).";
731
Guido van Rossum30a685f1991-06-27 15:51:29 +0000732
Guido van Rossume4485b01994-09-07 14:32:49 +0000733/* s.setblocking(1 | 0) method */
734
Guido van Rossum73624e91994-10-10 17:59:00 +0000735static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000736BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000737{
738 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000739#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000740 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000741#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000742 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000743 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000744 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000745#ifdef __BEOS__
746 block = !block;
747 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
748 (void *)(&block), sizeof( int ) );
749#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000750#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000751#ifdef PYOS_OS2
752 block = !block;
753 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
754#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000755 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
756 if (block)
757 delay_flag &= (~O_NDELAY);
758 else
759 delay_flag |= O_NDELAY;
760 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000761#endif /* !PYOS_OS2 */
762#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000763 block = !block;
764 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000765#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000766#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000767 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000768
Guido van Rossum73624e91994-10-10 17:59:00 +0000769 Py_INCREF(Py_None);
770 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000771}
Guido van Rossume4485b01994-09-07 14:32:49 +0000772
Guido van Rossum82a5c661998-07-07 20:45:43 +0000773static char setblocking_doc[] =
774"setblocking(flag)\n\
775\n\
776Set the socket to blocking (flag is true) or non-blocking (false).\n\
777This uses the FIONBIO ioctl with the O_NDELAY flag.";
778
Guido van Rossume4485b01994-09-07 14:32:49 +0000779
Guido van Rossumaee08791992-09-08 09:05:33 +0000780/* s.setsockopt() method.
781 With an integer third argument, sets an integer option.
782 With a string third argument, sets an option from a buffer;
783 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000784
Guido van Rossum73624e91994-10-10 17:59:00 +0000785static PyObject *
786BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000787{
788 int level;
789 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000790 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000791 char *buf;
792 int buflen;
793 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000794
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000795 if (PyArg_ParseTuple(args, "iii:setsockopt",
796 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000797 buf = (char *) &flag;
798 buflen = sizeof flag;
799 }
800 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000801 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000802 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
803 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000804 return NULL;
805 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000806 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000807 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000808 return PySocket_Err();
809 Py_INCREF(Py_None);
810 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000811}
812
Guido van Rossum82a5c661998-07-07 20:45:43 +0000813static char setsockopt_doc[] =
814"setsockopt(level, option, value)\n\
815\n\
816Set a socket option. See the Unix manual for level and option.\n\
817The value argument can either be an integer or a string.";
818
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000819
Guido van Rossumaee08791992-09-08 09:05:33 +0000820/* s.getsockopt() method.
821 With two arguments, retrieves an integer option.
822 With a third integer argument, retrieves a string buffer of that size;
823 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000824
Guido van Rossum73624e91994-10-10 17:59:00 +0000825static PyObject *
826BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000827{
828 int level;
829 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000830 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000831 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000832 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000833
Guido van Rossumbcc20741998-08-04 22:53:56 +0000834#ifdef __BEOS__
835/* We have incomplete socket support. */
836 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
837 return NULL;
838#else
839
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000840 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
841 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000842 return NULL;
843
844 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000845 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000846 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000847 res = getsockopt(s->sock_fd, level, optname,
848 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000849 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000850 return PySocket_Err();
851 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000852 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000853 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000854 PyErr_SetString(PySocket_Error,
855 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000856 return NULL;
857 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000858 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000859 if (buf == NULL)
860 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000861 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000862 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000863 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000864 Py_DECREF(buf);
865 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000866 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000867 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000868 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000869#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000870}
871
Guido van Rossum82a5c661998-07-07 20:45:43 +0000872static char getsockopt_doc[] =
873"getsockopt(level, option[, buffersize]) -> value\n\
874\n\
875Get a socket option. See the Unix manual for level and option.\n\
876If a nonzero buffersize argument is given, the return value is a\n\
877string of that length; otherwise it is an integer.";
878
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000879
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000880/* s.bind(sockaddr...) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000881
Guido van Rossum73624e91994-10-10 17:59:00 +0000882static PyObject *
883BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000884{
885 struct sockaddr *addr;
886 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000887 int res;
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000888 if (!getsockaddrarg(s, args, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000889 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000890 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000891 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000892 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000893 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000894 return PySocket_Err();
895 Py_INCREF(Py_None);
896 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000897}
898
Guido van Rossum82a5c661998-07-07 20:45:43 +0000899static char bind_doc[] =
900"bind(address)\n\
901\n\
902Bind the socket to a local address. For IP sockets, the address is a\n\
903pair (host, port); the host must refer to the local host.";
904
Guido van Rossum30a685f1991-06-27 15:51:29 +0000905
906/* s.close() method.
907 Set the file descriptor to -1 so operations tried subsequently
908 will surely fail. */
909
Guido van Rossum73624e91994-10-10 17:59:00 +0000910static PyObject *
911BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000912{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000913 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000914 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000915 if (s->sock_fd != -1) {
916 Py_BEGIN_ALLOW_THREADS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000917 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum08481461996-10-12 14:07:22 +0000918 Py_END_ALLOW_THREADS
919 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000920 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000921 Py_INCREF(Py_None);
922 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000923}
924
Guido van Rossum82a5c661998-07-07 20:45:43 +0000925static char close_doc[] =
926"close()\n\
927\n\
928Close the socket. It cannot be used after this call.";
929
Guido van Rossum30a685f1991-06-27 15:51:29 +0000930
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000931/* s.connect(sockaddr...) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000932
Guido van Rossum73624e91994-10-10 17:59:00 +0000933static PyObject *
934BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000935{
936 struct sockaddr *addr;
937 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000938 int res;
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000939 if (!getsockaddrarg(s, args, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000940 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000941 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000942 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000943 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000944 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000945 return PySocket_Err();
946 Py_INCREF(Py_None);
947 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000948}
949
Guido van Rossum82a5c661998-07-07 20:45:43 +0000950static char connect_doc[] =
951"connect(address)\n\
952\n\
953Connect the socket to a remote address. For IP sockets, the address\n\
954is a pair (host, port).";
955
Guido van Rossum30a685f1991-06-27 15:51:29 +0000956
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000957/* s.connect_ex(sockaddr...) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000958
959static PyObject *
960BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
961{
962 struct sockaddr *addr;
963 int addrlen;
964 int res;
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000965 if (!getsockaddrarg(s, args, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000966 return NULL;
967 Py_BEGIN_ALLOW_THREADS
968 res = connect(s->sock_fd, addr, addrlen);
969 Py_END_ALLOW_THREADS
970 if (res != 0)
971 res = errno;
972 return PyInt_FromLong((long) res);
973}
974
Guido van Rossum82a5c661998-07-07 20:45:43 +0000975static char connect_ex_doc[] =
976"connect_ex(address)\n\
977\n\
978This is like connect(address), but returns an error code (the errno value)\n\
979instead of raising an exception when an error occurs.";
980
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000981
Guido van Rossumed233a51992-06-23 09:07:03 +0000982/* s.fileno() method */
983
Guido van Rossum73624e91994-10-10 17:59:00 +0000984static PyObject *
985BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000986{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000987 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +0000988 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +0000989#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +0000990 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +0000991#else
992 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
993#endif
Guido van Rossumed233a51992-06-23 09:07:03 +0000994}
995
Guido van Rossum82a5c661998-07-07 20:45:43 +0000996static char fileno_doc[] =
997"fileno() -> integer\n\
998\n\
999Return the integer file descriptor of the socket.";
1000
Guido van Rossumed233a51992-06-23 09:07:03 +00001001
Guido van Rossumbe32c891996-06-20 16:25:29 +00001002#ifndef NO_DUP
1003/* s.dup() method */
1004
1005static PyObject *
1006BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
1007{
Fred Drakea04eaad2000-06-30 02:46:07 +00001008 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001009 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001010 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001011 return NULL;
1012 newfd = dup(s->sock_fd);
1013 if (newfd < 0)
1014 return PySocket_Err();
1015 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001016 s->sock_family,
1017 s->sock_type,
1018 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001019 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001020 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001021 return sock;
1022}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001023
1024static char dup_doc[] =
1025"dup() -> socket object\n\
1026\n\
1027Return a new socket object connected to the same system resource.";
1028
Guido van Rossumbe32c891996-06-20 16:25:29 +00001029#endif
1030
1031
Guido van Rossumc89705d1992-11-26 08:54:07 +00001032/* s.getsockname() method */
1033
Guido van Rossum73624e91994-10-10 17:59:00 +00001034static PyObject *
1035BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001036{
1037 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001038 int res;
1039 socklen_t addrlen;
1040
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001041 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001042 return NULL;
1043 if (!getsockaddrlen(s, &addrlen))
1044 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001045 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001046 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001047 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001048 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001049 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001050 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001051 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1052}
1053
Guido van Rossum82a5c661998-07-07 20:45:43 +00001054static char getsockname_doc[] =
1055"getsockname() -> address info\n\
1056\n\
1057Return the address of the local endpoint. For IP sockets, the address\n\
1058info is a pair (hostaddr, port).";
1059
Guido van Rossumc89705d1992-11-26 08:54:07 +00001060
Guido van Rossumb6775db1994-08-01 11:34:53 +00001061#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001062/* s.getpeername() method */
1063
Guido van Rossum73624e91994-10-10 17:59:00 +00001064static PyObject *
1065BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001066{
1067 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001068 int res;
1069 socklen_t addrlen;
1070
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001071 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001072 return NULL;
1073 if (!getsockaddrlen(s, &addrlen))
1074 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001075 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001076 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001077 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001078 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001079 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001080 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1081}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001082
1083static char getpeername_doc[] =
1084"getpeername() -> address info\n\
1085\n\
1086Return the address of the remote endpoint. For IP sockets, the address\n\
1087info is a pair (hostaddr, port).";
1088
Guido van Rossumb6775db1994-08-01 11:34:53 +00001089#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001090
1091
Guido van Rossum30a685f1991-06-27 15:51:29 +00001092/* s.listen(n) method */
1093
Guido van Rossum73624e91994-10-10 17:59:00 +00001094static PyObject *
1095BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001096{
1097 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001098 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001099 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001100 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001101 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001102 if (backlog < 1)
1103 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001104 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001105 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001106 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001107 return PySocket_Err();
1108 Py_INCREF(Py_None);
1109 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001110}
1111
Guido van Rossum82a5c661998-07-07 20:45:43 +00001112static char listen_doc[] =
1113"listen(backlog)\n\
1114\n\
1115Enable a server to accept connections. The backlog argument must be at\n\
1116least 1; it specifies the number of unaccepted connection that the system\n\
1117will allow before refusing new connections.";
1118
1119
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001120#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001121/* s.makefile(mode) method.
1122 Create a new open file object referring to a dupped version of
1123 the socket's file descriptor. (The dup() call is necessary so
1124 that the open file and socket objects may be closed independent
1125 of each other.)
1126 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1127
Guido van Rossum73624e91994-10-10 17:59:00 +00001128static PyObject *
1129BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001130{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001131 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +00001132 char *mode = "r";
1133 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001134#ifdef MS_WIN32
1135 intptr_t fd;
1136#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001137 int fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001138#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001139 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001140 PyObject *f;
1141
Guido van Rossum43713e52000-02-29 13:59:29 +00001142 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001143 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001144#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001145 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1146 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001147#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001148 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001149#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001150 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001151 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001152 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001153 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001154 }
1155 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1156 if (f != NULL)
1157 PyFile_SetBufSize(f, bufsize);
1158 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001159}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001160
1161static char makefile_doc[] =
1162"makefile([mode[, buffersize]]) -> file object\n\
1163\n\
1164Return a regular file object corresponding to the socket.\n\
1165The mode and buffersize arguments are as for the built-in open() function.";
1166
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001167#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001168
Guido van Rossum82a5c661998-07-07 20:45:43 +00001169
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001170/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001171
Guido van Rossum73624e91994-10-10 17:59:00 +00001172static PyObject *
1173BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001174{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001175 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001176 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001177 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001178 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001179 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001180 if (buf == NULL)
1181 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001182 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001183 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001184 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001185 if (n < 0) {
1186 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001187 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001188 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001189 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001190 return NULL;
1191 return buf;
1192}
1193
Guido van Rossum82a5c661998-07-07 20:45:43 +00001194static char recv_doc[] =
1195"recv(buffersize[, flags]) -> data\n\
1196\n\
1197Receive up to buffersize bytes from the socket. For the optional flags\n\
1198argument, see the Unix manual. When no data is available, block until\n\
1199at least one byte is available or until the remote end is closed. When\n\
1200the remote end is closed and all data is read, return the empty string.";
1201
Guido van Rossum30a685f1991-06-27 15:51:29 +00001202
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001203/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001204
Guido van Rossum73624e91994-10-10 17:59:00 +00001205static PyObject *
1206BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001207{
1208 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001209 PyObject *buf = NULL;
1210 PyObject *addr = NULL;
1211 PyObject *ret = NULL;
1212
Guido van Rossumff3ab422000-04-24 15:16:03 +00001213 int len, n, flags = 0;
1214 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001215 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001216 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001217 if (!getsockaddrlen(s, &addrlen))
1218 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001219 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001220 if (buf == NULL)
1221 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001222 Py_BEGIN_ALLOW_THREADS
1223 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001224#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001225#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001226 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001227#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001228 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001229#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001230#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001231 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001232#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001233 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001234 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001235 if (n < 0) {
1236 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001237 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001238 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001239 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001240 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001241
1242 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1243 goto finally;
1244
Guido van Rossum73624e91994-10-10 17:59:00 +00001245 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001246 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001247 Py_XDECREF(addr);
1248 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001249 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001250}
1251
Guido van Rossum82a5c661998-07-07 20:45:43 +00001252static char recvfrom_doc[] =
1253"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1254\n\
1255Like recv(buffersize, flags) but also return the sender's address info.";
1256
Guido van Rossum30a685f1991-06-27 15:51:29 +00001257
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001258/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001259
Guido van Rossum73624e91994-10-10 17:59:00 +00001260static PyObject *
1261BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001262{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001263 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001264 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001265 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001266 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001267 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001268 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001269 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001270 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001271 return PySocket_Err();
1272 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001273}
1274
Guido van Rossum82a5c661998-07-07 20:45:43 +00001275static char send_doc[] =
1276"send(data[, flags])\n\
1277\n\
1278Send a data string to the socket. For the optional flags\n\
1279argument, see the Unix manual.";
1280
Guido van Rossum30a685f1991-06-27 15:51:29 +00001281
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001282/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001283
Guido van Rossum73624e91994-10-10 17:59:00 +00001284static PyObject *
1285BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001286{
Guido van Rossum73624e91994-10-10 17:59:00 +00001287 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001288 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001289 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001290 int addrlen, len, n, flags;
1291 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001292 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001293 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001294 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1295 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001296 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001297 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001298 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001299 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001300 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001301 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001302 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001303 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001304 return PySocket_Err();
1305 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001306}
1307
Guido van Rossum82a5c661998-07-07 20:45:43 +00001308static char sendto_doc[] =
1309"sendto(data[, flags], address)\n\
1310\n\
1311Like send(data, flags) but allows specifying the destination address.\n\
1312For IP sockets, the address is a pair (hostaddr, port).";
1313
Guido van Rossum30a685f1991-06-27 15:51:29 +00001314
1315/* s.shutdown(how) method */
1316
Guido van Rossum73624e91994-10-10 17:59:00 +00001317static PyObject *
1318BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001319{
1320 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001321 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001322 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001323 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001324 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001325 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001326 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001327 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001328 return PySocket_Err();
1329 Py_INCREF(Py_None);
1330 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001331}
1332
Guido van Rossum82a5c661998-07-07 20:45:43 +00001333static char shutdown_doc[] =
1334"shutdown(flag)\n\
1335\n\
1336Shut down the reading side of the socket (flag == 0), the writing side\n\
1337of the socket (flag == 1), or both ends (flag == 2).";
1338
Guido van Rossum30a685f1991-06-27 15:51:29 +00001339
1340/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001341
Guido van Rossum73624e91994-10-10 17:59:00 +00001342static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001343 {"accept", (PyCFunction)PySocketSock_accept, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001344 accept_doc},
Guido van Rossum527c9bd2000-04-04 14:10:20 +00001345 {"bind", (PyCFunction)PySocketSock_bind, 0,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001346 bind_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001347 {"close", (PyCFunction)PySocketSock_close, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001348 close_doc},
Guido van Rossum527c9bd2000-04-04 14:10:20 +00001349 {"connect", (PyCFunction)PySocketSock_connect, 0,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001350 connect_doc},
Guido van Rossum527c9bd2000-04-04 14:10:20 +00001351 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 0,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001352 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001353#ifndef NO_DUP
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001354 {"dup", (PyCFunction)PySocketSock_dup, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001355 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001356#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001357 {"fileno", (PyCFunction)PySocketSock_fileno, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001358 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001359#ifdef HAVE_GETPEERNAME
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001360 {"getpeername", (PyCFunction)PySocketSock_getpeername, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001361 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001362#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001363 {"getsockname", (PyCFunction)PySocketSock_getsockname, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001364 getsockname_doc},
1365 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1366 getsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001367 {"listen", (PyCFunction)PySocketSock_listen, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001368 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001369#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001370 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1371 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001372#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001373 {"recv", (PyCFunction)PySocketSock_recv, 1,
1374 recv_doc},
1375 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1376 recvfrom_doc},
1377 {"send", (PyCFunction)PySocketSock_send, 1,
1378 send_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001379 {"sendto", (PyCFunction)PySocketSock_sendto, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001380 sendto_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001381 {"setblocking", (PyCFunction)PySocketSock_setblocking, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001382 setblocking_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001383 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001384 setsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001385 {"shutdown", (PyCFunction)PySocketSock_shutdown, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001386 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001387 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001388};
1389
Guido van Rossum30a685f1991-06-27 15:51:29 +00001390
Guido van Rossum73624e91994-10-10 17:59:00 +00001391/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001392 First close the file description. */
1393
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001394static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001395BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001396{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001397 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001398 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001399 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001400}
1401
Guido van Rossum30a685f1991-06-27 15:51:29 +00001402
1403/* Return a socket object's named attribute. */
1404
Guido van Rossum73624e91994-10-10 17:59:00 +00001405static PyObject *
1406BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001407{
Guido van Rossum73624e91994-10-10 17:59:00 +00001408 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001409}
1410
Guido van Rossum30a685f1991-06-27 15:51:29 +00001411
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001412static PyObject *
1413BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1414{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001415 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001416#if SIZEOF_SOCKET_T > SIZEOF_LONG
1417 if (s->sock_fd > LONG_MAX) {
1418 /* this can occur on Win64, and actually there is a special
1419 ugly printf formatter for decimal pointer length integer
1420 printing, only bother if necessary*/
1421 PyErr_SetString(PyExc_OverflowError,
1422 "no printf formatter to display the socket descriptor in decimal");
1423 return NULL;
1424 }
1425#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001426 sprintf(buf,
Fred Drakea04eaad2000-06-30 02:46:07 +00001427 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1428 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001429 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001430}
1431
1432
Guido van Rossumb6775db1994-08-01 11:34:53 +00001433/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001434
Guido van Rossum73624e91994-10-10 17:59:00 +00001435static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001436 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001437 0,
1438 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001439 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001440 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001441 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001442 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001443 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001444 0, /*tp_setattr*/
1445 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001446 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001447 0, /*tp_as_number*/
1448 0, /*tp_as_sequence*/
1449 0, /*tp_as_mapping*/
1450};
1451
Guido van Rossum30a685f1991-06-27 15:51:29 +00001452
Guido van Rossum81194471991-07-27 21:42:02 +00001453/* Python interface to gethostname(). */
1454
1455/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001456static PyObject *
1457BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001458{
1459 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001460 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001461 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001462 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001463 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001464 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001465 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001466 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001467 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001468 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001469 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001470}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001471
Guido van Rossum82a5c661998-07-07 20:45:43 +00001472static char gethostname_doc[] =
1473"gethostname() -> string\n\
1474\n\
1475Return the current host name.";
1476
Guido van Rossumff4949e1992-08-05 19:58:53 +00001477
Guido van Rossum30a685f1991-06-27 15:51:29 +00001478/* Python interface to gethostbyname(name). */
1479
1480/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001481static PyObject *
1482BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001483{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001484 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001485 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001486 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001487 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001488 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001489 return NULL;
1490 return makeipaddr(&addrbuf);
1491}
1492
Guido van Rossum82a5c661998-07-07 20:45:43 +00001493static char gethostbyname_doc[] =
1494"gethostbyname(host) -> address\n\
1495\n\
1496Return the IP address (a string of the form '255.255.255.255') for a host.";
1497
1498
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001499/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1500
1501static PyObject *
1502gethost_common(h, addr)
1503 struct hostent *h;
1504 struct sockaddr_in *addr;
1505{
1506 char **pch;
1507 PyObject *rtn_tuple = (PyObject *)NULL;
1508 PyObject *name_list = (PyObject *)NULL;
1509 PyObject *addr_list = (PyObject *)NULL;
1510 PyObject *tmp;
1511 if (h == NULL) {
1512#ifdef HAVE_HSTRERROR
1513 /* Let's get real error message to return */
1514 extern int h_errno;
1515 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1516#else
1517 PyErr_SetString(PySocket_Error, "host not found");
1518#endif
1519 return NULL;
1520 }
1521 if ((name_list = PyList_New(0)) == NULL)
1522 goto err;
1523 if ((addr_list = PyList_New(0)) == NULL)
1524 goto err;
1525 for (pch = h->h_aliases; *pch != NULL; pch++) {
1526 int status;
1527 tmp = PyString_FromString(*pch);
1528 if (tmp == NULL)
1529 goto err;
1530 status = PyList_Append(name_list, tmp);
1531 Py_DECREF(tmp);
1532 if (status)
1533 goto err;
1534 }
1535 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1536 int status;
1537 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1538 tmp = makeipaddr(addr);
1539 if (tmp == NULL)
1540 goto err;
1541 status = PyList_Append(addr_list, tmp);
1542 Py_DECREF(tmp);
1543 if (status)
1544 goto err;
1545 }
1546 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1547 err:
1548 Py_XDECREF(name_list);
1549 Py_XDECREF(addr_list);
1550 return rtn_tuple;
1551}
1552
1553
1554/* Python interface to gethostbyname_ex(name). */
1555
1556/*ARGSUSED*/
1557static PyObject *
1558BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1559{
1560 char *name;
1561 struct hostent *h;
1562 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001563 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001564#ifdef HAVE_GETHOSTBYNAME_R
1565 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001566#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1567 struct hostent_data data;
1568#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001569 char buf[16384];
1570 int buf_len = (sizeof buf) - 1;
1571 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001572#endif
1573#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001574 int result;
1575#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001576#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001577 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001578 return NULL;
1579 if (setipaddr(name, &addr) < 0)
1580 return NULL;
1581 Py_BEGIN_ALLOW_THREADS
1582#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001583#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001584 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001585#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001586 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001587#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001588 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001589 result = gethostbyname_r(name, &hp_allocated, &data);
1590 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001591#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001592#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001593#ifdef USE_GETHOSTBYNAME_LOCK
1594 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001595#endif
1596 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001597#endif /* HAVE_GETHOSTBYNAME_R */
1598 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001599 ret = gethost_common(h, &addr);
1600#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001601 PyThread_release_lock(gethostbyname_lock);
1602#endif
1603 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001604}
1605
1606static char ghbn_ex_doc[] =
1607"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1608\n\
1609Return the true host name, a list of aliases, and a list of IP addresses,\n\
1610for a host. The host argument is a string giving a host name or IP number.";
1611
1612
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001613/* Python interface to gethostbyaddr(IP). */
1614
1615/*ARGSUSED*/
1616static PyObject *
1617BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1618{
1619 struct sockaddr_in addr;
1620 char *ip_num;
1621 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001622 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001623#ifdef HAVE_GETHOSTBYNAME_R
1624 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001625#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1626 struct hostent_data data;
1627#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001628 char buf[16384];
1629 int buf_len = (sizeof buf) - 1;
1630 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001631#endif
1632#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001633 int result;
1634#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001635#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001636
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001637 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001638 return NULL;
1639 if (setipaddr(ip_num, &addr) < 0)
1640 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001641 Py_BEGIN_ALLOW_THREADS
1642#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001643#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001644 result = gethostbyaddr_r((char *)&addr.sin_addr,
1645 sizeof(addr.sin_addr),
1646 AF_INET, &hp_allocated, buf, buf_len,
1647 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001648#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001649 h = gethostbyaddr_r((char *)&addr.sin_addr,
1650 sizeof(addr.sin_addr),
1651 AF_INET,
1652 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001653#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001654 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001655 result = gethostbyaddr_r((char *)&addr.sin_addr,
1656 sizeof(addr.sin_addr),
1657 AF_INET, &hp_allocated, &data);
1658 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001659#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001660#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001661#ifdef USE_GETHOSTBYNAME_LOCK
1662 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001663#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001664 h = gethostbyaddr((char *)&addr.sin_addr,
1665 sizeof(addr.sin_addr),
1666 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001667#endif /* HAVE_GETHOSTBYNAME_R */
1668 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001669 ret = gethost_common(h, &addr);
1670#ifdef USE_GETHOSTBYNAME_LOCK
1671 PyThread_release_lock(gethostbyname_lock);
1672#endif
1673 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001674}
1675
Guido van Rossum82a5c661998-07-07 20:45:43 +00001676static char gethostbyaddr_doc[] =
1677"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1678\n\
1679Return the true host name, a list of aliases, and a list of IP addresses,\n\
1680for a host. The host argument is a string giving a host name or IP number.";
1681
Guido van Rossum30a685f1991-06-27 15:51:29 +00001682
1683/* Python interface to getservbyname(name).
1684 This only returns the port number, since the other info is already
1685 known or not useful (like the list of aliases). */
1686
1687/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001688static PyObject *
1689BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001690{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001691 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001692 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001693 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001694 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001695 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001696 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001697 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001698 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001699 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001700 return NULL;
1701 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001702 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001703}
1704
Guido van Rossum82a5c661998-07-07 20:45:43 +00001705static char getservbyname_doc[] =
1706"getservbyname(servicename, protocolname) -> integer\n\
1707\n\
1708Return a port number from a service name and protocol name.\n\
1709The protocol name should be 'tcp' or 'udp'.";
1710
Guido van Rossum30a685f1991-06-27 15:51:29 +00001711
Guido van Rossum3901d851996-12-19 16:35:04 +00001712/* Python interface to getprotobyname(name).
1713 This only returns the protocol number, since the other info is
1714 already known or not useful (like the list of aliases). */
1715
1716/*ARGSUSED*/
1717static PyObject *
1718BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1719{
1720 char *name;
1721 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001722#ifdef __BEOS__
1723/* Not available in BeOS yet. - [cjh] */
1724 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1725 return NULL;
1726#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001727 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001728 return NULL;
1729 Py_BEGIN_ALLOW_THREADS
1730 sp = getprotobyname(name);
1731 Py_END_ALLOW_THREADS
1732 if (sp == NULL) {
1733 PyErr_SetString(PySocket_Error, "protocol not found");
1734 return NULL;
1735 }
1736 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001737#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001738}
1739
Guido van Rossum82a5c661998-07-07 20:45:43 +00001740static char getprotobyname_doc[] =
1741"getprotobyname(name) -> integer\n\
1742\n\
1743Return the protocol number for the named protocol. (Rarely used.)";
1744
Guido van Rossum3901d851996-12-19 16:35:04 +00001745
Guido van Rossum30a685f1991-06-27 15:51:29 +00001746/* Python interface to socket(family, type, proto).
1747 The third (protocol) argument is optional.
1748 Return a new socket object. */
1749
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001750/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001751static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001752BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001753{
Guido van Rossum73624e91994-10-10 17:59:00 +00001754 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001755 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001756 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001757 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001758 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001759 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001760 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001761 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001762#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001763 if (fd == INVALID_SOCKET)
1764#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001765 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001766#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001767 return PySocket_Err();
1768 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001769 /* If the object can't be created, don't forget to close the
1770 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001771 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001772 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001773 /* From now on, ignore SIGPIPE and let the error checking
1774 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001775#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001776 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001777#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001778 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001779}
1780
Guido van Rossum82a5c661998-07-07 20:45:43 +00001781static char socket_doc[] =
1782"socket(family, type[, proto]) -> socket object\n\
1783\n\
1784Open a socket of the given type. The family argument specifies the\n\
1785address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1786The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1787or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1788specifying the default protocol.";
1789
1790
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001791#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001792/* Create a socket object from a numeric file description.
1793 Useful e.g. if stdin is a socket.
1794 Additional arguments as for socket(). */
1795
1796/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001797static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001798BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001799{
Guido van Rossum73624e91994-10-10 17:59:00 +00001800 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001801 SOCKET_T fd;
1802 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001803 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1804 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001805 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001806 /* Dup the fd so it and the socket can be closed independently */
1807 fd = dup(fd);
1808 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001809 return PySocket_Err();
1810 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001811 /* From now on, ignore SIGPIPE and let the error checking
1812 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001813#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001814 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001815#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001816 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001817}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001818
1819static char fromfd_doc[] =
1820"fromfd(fd, family, type[, proto]) -> socket object\n\
1821\n\
1822Create a socket object from the given file descriptor.\n\
1823The remaining arguments are the same as for socket().";
1824
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001825#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001826
Guido van Rossum82a5c661998-07-07 20:45:43 +00001827
Guido van Rossum006bf911996-06-12 04:04:55 +00001828static PyObject *
1829BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1830{
1831 int x1, x2;
1832
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001833 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001834 return NULL;
1835 }
1836 x2 = (int)ntohs((short)x1);
1837 return PyInt_FromLong(x2);
1838}
1839
Guido van Rossum82a5c661998-07-07 20:45:43 +00001840static char ntohs_doc[] =
1841"ntohs(integer) -> integer\n\
1842\n\
1843Convert a 16-bit integer from network to host byte order.";
1844
1845
Guido van Rossum006bf911996-06-12 04:04:55 +00001846static PyObject *
1847BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1848{
1849 int x1, x2;
1850
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001851 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001852 return NULL;
1853 }
1854 x2 = ntohl(x1);
1855 return PyInt_FromLong(x2);
1856}
1857
Guido van Rossum82a5c661998-07-07 20:45:43 +00001858static char ntohl_doc[] =
1859"ntohl(integer) -> integer\n\
1860\n\
1861Convert a 32-bit integer from network to host byte order.";
1862
1863
Guido van Rossum006bf911996-06-12 04:04:55 +00001864static PyObject *
1865BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1866{
1867 int x1, x2;
1868
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001869 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001870 return NULL;
1871 }
1872 x2 = (int)htons((short)x1);
1873 return PyInt_FromLong(x2);
1874}
1875
Guido van Rossum82a5c661998-07-07 20:45:43 +00001876static char htons_doc[] =
1877"htons(integer) -> integer\n\
1878\n\
1879Convert a 16-bit integer from host to network byte order.";
1880
1881
Guido van Rossum006bf911996-06-12 04:04:55 +00001882static PyObject *
1883BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1884{
1885 int x1, x2;
1886
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001887 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001888 return NULL;
1889 }
1890 x2 = htonl(x1);
1891 return PyInt_FromLong(x2);
1892}
1893
Guido van Rossum82a5c661998-07-07 20:45:43 +00001894static char htonl_doc[] =
1895"htonl(integer) -> integer\n\
1896\n\
1897Convert a 32-bit integer from host to network byte order.";
1898
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001899/*
1900 * socket.inet_aton() and socket.inet_ntoa() functions
1901 *
1902 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
1903 *
1904 */
1905
1906static char inet_aton_doc[] =
1907"inet_aton(string) -> packed 32-bit IP representation\n\
1908\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001909Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001910binary format used in low-level network functions.";
1911
1912static PyObject*
1913BUILD_FUNC_DEF_2(PySocket_inet_aton, PyObject *, self, PyObject *, args)
1914{
Guido van Rossuma2e48551999-09-09 15:42:59 +00001915#ifndef INADDR_NONE
1916#define INADDR_NONE (-1)
1917#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001918
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001919 /* Have to use inet_addr() instead */
1920 char *ip_addr;
1921 long packed_addr;
1922
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001923 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001924 return NULL;
1925 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00001926#ifdef USE_GUSI1
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001927 packed_addr = (long)inet_addr(ip_addr).s_addr;
1928#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001929 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001930#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001931
1932 if (packed_addr == INADDR_NONE) { /* invalid address */
1933 PyErr_SetString(PySocket_Error,
1934 "illegal IP address string passed to inet_aton");
1935 return NULL;
1936 }
1937
1938 return PyString_FromStringAndSize((char *) &packed_addr,
1939 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001940}
1941
1942static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00001943"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001944\n\
1945Convert an IP address from 32-bit packed binary format to string format";
1946
1947static PyObject*
1948BUILD_FUNC_DEF_2(PySocket_inet_ntoa, PyObject *, self, PyObject *, args)
1949{
1950 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001951 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001952 struct in_addr packed_addr;
1953
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001954 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001955 return NULL;
1956 }
1957
1958 if (addr_len != sizeof(packed_addr)) {
1959 PyErr_SetString(PySocket_Error,
1960 "packed IP wrong length for inet_ntoa");
1961 return NULL;
1962 }
1963
1964 memcpy(&packed_addr, packed_str, addr_len);
1965
1966 return PyString_FromString(inet_ntoa(packed_addr));
1967}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001968
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001969
1970#ifdef USE_SSL
1971
1972/* This is a C function to be called for new object initialization */
1973static SSLObject *
1974BUILD_FUNC_DEF_3(newSSLObject,
1975 PySocketSockObject *,Sock, char*,key_file, char*,cert_file)
1976{
1977 SSLObject *self;
1978 char *str;
1979
1980#if 0
1981 meth=SSLv23_client_method();
1982 meth=SSLv3_client_method();
1983 meth=SSLv2_client_method();
1984#endif
1985
Guido van Rossumb18618d2000-05-03 23:44:39 +00001986 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001987 if (self == NULL){
1988 PyErr_SetObject(SSLErrorObject,
1989 PyString_FromString("newSSLObject error"));
1990 return NULL;
1991 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001992 memset(self->server, '\0', sizeof(char) * 256);
1993 memset(self->issuer, '\0', sizeof(char) * 256);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001994
1995 self->x_attr = PyDict_New();
1996 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
1997 if (self->ctx == NULL) {
1998 PyErr_SetObject(SSLErrorObject,
1999 PyString_FromString("SSL_CTX_new 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 ( (key_file && !cert_file) || (!key_file && cert_file) )
2005 {
2006 PyErr_SetObject(SSLErrorObject,
2007 PyString_FromString(
2008 "Both the key & certificate files must be specified"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002009 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002010 return NULL;
2011 }
2012
2013 if (key_file && cert_file)
2014 {
2015 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
2016 SSL_FILETYPE_PEM) < 1)
2017 {
2018 PyErr_SetObject(SSLErrorObject,
2019 PyString_FromString(
2020 "SSL_CTX_use_PrivateKey_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002021 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002022 return NULL;
2023 }
2024
2025 if (SSL_CTX_use_certificate_chain_file(self->ctx,
2026 cert_file) < 1)
2027 {
2028 PyErr_SetObject(SSLErrorObject,
2029 PyString_FromString(
2030 "SSL_CTX_use_certificate_chain_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002031 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002032 return NULL;
2033 }
2034 }
2035
2036 SSL_CTX_set_verify(self->ctx,
2037 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2038 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2039 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2040 SSL_set_connect_state(self->ssl);
2041
2042 if ((SSL_connect(self->ssl)) == -1) {
2043 /* Actually negotiate SSL connection */
2044 PyErr_SetObject(SSLErrorObject,
2045 PyString_FromString("SSL_connect error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002046 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002047 return NULL;
2048 }
2049 self->ssl->debug = 1;
2050
2051 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2052 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2053 self->server, 256);
2054 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2055 self->issuer, 256);
2056 }
2057 self->x_attr = NULL;
2058 self->Socket = Sock;
2059 Py_INCREF(self->Socket);
2060 return self;
2061}
2062
2063/* This is the Python function called for new object initialization */
2064static PyObject *
2065BUILD_FUNC_DEF_2(PySocket_ssl, PyObject *, self, PyObject *, args)
2066{
2067 SSLObject *rv;
2068 PySocketSockObject *Sock;
2069 char *key_file;
2070 char *cert_file;
2071
Guido van Rossum43713e52000-02-29 13:59:29 +00002072 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002073 &PySocketSock_Type, (PyObject*)&Sock,
2074 &key_file, &cert_file) )
2075 return NULL;
2076
2077 rv = newSSLObject(Sock, key_file, cert_file);
2078 if ( rv == NULL )
2079 return NULL;
2080 return (PyObject *)rv;
2081}
2082
2083static char ssl_doc[] =
2084"ssl(socket, keyfile, certfile) -> sslobject";
2085
2086static PyObject *
2087BUILD_FUNC_DEF_2(SSL_server, SSLObject *, self, PyObject *, args)
2088{
2089 return PyString_FromString(self->server);
2090}
2091
2092static PyObject *
2093BUILD_FUNC_DEF_2(SSL_issuer, SSLObject *, self, PyObject *, args)
2094{
2095 return PyString_FromString(self->issuer);
2096}
2097
2098
2099/* SSL object methods */
2100
2101static PyMethodDef SSLMethods[] = {
2102 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2103 { "read", (PyCFunction)SSL_SSLread, 1 },
2104 { "server", (PyCFunction)SSL_server, 1 },
2105 { "issuer", (PyCFunction)SSL_issuer, 1 },
2106 { NULL, NULL}
2107};
2108
2109static void SSL_dealloc(SSLObject *self)
2110{
2111 if (self->server_cert) /* Possible not to have one? */
2112 X509_free (self->server_cert);
2113 SSL_CTX_free(self->ctx);
2114 SSL_free(self->ssl);
2115 Py_XDECREF(self->x_attr);
2116 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002117 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002118}
2119
2120static PyObject *SSL_getattr(SSLObject *self, char *name)
2121{
2122 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2123}
2124
2125staticforward PyTypeObject SSL_Type = {
2126 PyObject_HEAD_INIT(&PyType_Type)
2127 0, /*ob_size*/
2128 "SSL", /*tp_name*/
2129 sizeof(SSLObject), /*tp_basicsize*/
2130 0, /*tp_itemsize*/
2131 /* methods */
2132 (destructor)SSL_dealloc, /*tp_dealloc*/
2133 0, /*tp_print*/
2134 (getattrfunc)SSL_getattr, /*tp_getattr*/
2135 0, /*tp_setattr*/
2136 0, /*tp_compare*/
2137 0, /*tp_repr*/
2138 0, /*tp_as_number*/
2139 0, /*tp_as_sequence*/
2140 0, /*tp_as_mapping*/
2141 0, /*tp_hash*/
2142};
2143
2144
2145
2146static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2147{
2148 char *data;
Fred Drakea04eaad2000-06-30 02:46:07 +00002149 size_t len = 0;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002150
Guido van Rossum43713e52000-02-29 13:59:29 +00002151 if (!PyArg_ParseTuple(args, "s|i:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002152 return NULL;
2153
2154 if (!len)
2155 len = strlen(data);
2156
2157 len = SSL_write(self->ssl, data, len);
2158 return PyInt_FromLong((long)len);
2159}
2160
2161static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2162{
2163 PyObject *buf;
2164 int count = 0;
2165 int len = 1024;
2166 int res;
2167
Guido van Rossum43713e52000-02-29 13:59:29 +00002168 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002169
2170 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2171 return NULL; /* Error object should already be set */
2172
2173 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2174 res = SSL_get_error(self->ssl, count);
2175
2176 switch (res) {
2177 case 0: /* Good return value! */
2178 break;
2179 case 6:
2180 PyErr_SetString(SSLErrorObject, "EOF");
2181 Py_DECREF(buf);
2182 return NULL;
2183 break;
2184 case 5:
2185 default:
2186 return PyErr_SetFromErrno(SSLErrorObject);
2187 break;
2188 }
2189
2190 fflush(stderr);
2191
2192 if (count < 0) {
2193 Py_DECREF(buf);
2194 return PyErr_SetFromErrno(SSLErrorObject);
2195 }
2196
2197 if (count != len && _PyString_Resize(&buf, count) < 0)
2198 return NULL;
2199 return buf;
2200}
2201
2202#endif /* USE_SSL */
2203
2204
Guido van Rossum30a685f1991-06-27 15:51:29 +00002205/* List of functions exported by this module. */
2206
Guido van Rossum73624e91994-10-10 17:59:00 +00002207static PyMethodDef PySocket_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002208 {"gethostbyname", PySocket_gethostbyname, 1, gethostbyname_doc},
2209 {"gethostbyname_ex", PySocket_gethostbyname_ex, 1, ghbn_ex_doc},
2210 {"gethostbyaddr", PySocket_gethostbyaddr, 1, gethostbyaddr_doc},
2211 {"gethostname", PySocket_gethostname, 1, gethostname_doc},
2212 {"getservbyname", PySocket_getservbyname, 1, getservbyname_doc},
2213 {"getprotobyname", PySocket_getprotobyname, 1,getprotobyname_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00002214 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002215#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00002216 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002217#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002218 {"ntohs", PySocket_ntohs, 1, ntohs_doc},
2219 {"ntohl", PySocket_ntohl, 1, ntohl_doc},
2220 {"htons", PySocket_htons, 1, htons_doc},
2221 {"htonl", PySocket_htonl, 1, htonl_doc},
2222 {"inet_aton", PySocket_inet_aton, 1, inet_aton_doc},
2223 {"inet_ntoa", PySocket_inet_ntoa, 1, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002224#ifdef USE_SSL
2225 {"ssl", PySocket_ssl, 1, ssl_doc},
2226#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002227 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002228};
2229
Guido van Rossum30a685f1991-06-27 15:51:29 +00002230
2231/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002232 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002233 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002234 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002235static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002236BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002237{
Guido van Rossum73624e91994-10-10 17:59:00 +00002238 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002239 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002240 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002241
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002242 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002243}
2244
Guido van Rossum30a685f1991-06-27 15:51:29 +00002245
Guido van Rossum8d665e61996-06-26 18:22:49 +00002246#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002247
2248/* Additional initialization and cleanup for NT/Windows */
2249
2250static void
2251NTcleanup()
2252{
2253 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002254}
2255
2256static int
2257NTinit()
2258{
2259 WSADATA WSAData;
2260 int ret;
2261 char buf[100];
2262 ret = WSAStartup(0x0101, &WSAData);
2263 switch (ret) {
2264 case 0: /* no error */
2265 atexit(NTcleanup);
2266 return 1;
2267 case WSASYSNOTREADY:
2268 PyErr_SetString(PyExc_ImportError,
2269 "WSAStartup failed: network not ready");
2270 break;
2271 case WSAVERNOTSUPPORTED:
2272 case WSAEINVAL:
2273 PyErr_SetString(PyExc_ImportError,
2274 "WSAStartup failed: requested version not supported");
2275 break;
2276 default:
2277 sprintf(buf, "WSAStartup failed: error code %d", ret);
2278 PyErr_SetString(PyExc_ImportError, buf);
2279 break;
2280 }
2281 return 0;
2282}
2283
Guido van Rossum8d665e61996-06-26 18:22:49 +00002284#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002285
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002286#if defined(PYOS_OS2)
2287
2288/* Additional initialization and cleanup for OS/2 */
2289
2290static void
2291OS2cleanup()
2292{
2293 /* No cleanup is necessary for OS/2 Sockets */
2294}
2295
2296static int
2297OS2init()
2298{
2299 char reason[64];
2300 int rc = sock_init();
2301
2302 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002303 atexit(OS2cleanup);
2304 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002305 }
2306
2307 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2308 PyErr_SetString(PyExc_ImportError, reason);
2309
Guido van Rossum32c575d1997-12-02 20:37:32 +00002310 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002311}
2312
2313#endif /* PYOS_OS2 */
2314
Guido van Rossum30a685f1991-06-27 15:51:29 +00002315/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002316 * This is called when the first 'import socket' is done,
2317 * via a table in config.c, if config.c is compiled with USE_SOCKET
2318 * defined.
2319 *
2320 * For MS_WINDOWS (which means any Windows variant), this module
2321 * is actually called "_socket", and there's a wrapper "socket.py"
2322 * which implements some missing functionality (such as makefile(),
2323 * dup() and fromfd()). The import of "_socket" may fail with an
2324 * ImportError exception if initialization of WINSOCK fails. When
2325 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2326 * scheduled to be made at exit time.
2327 *
2328 * For OS/2, this module is also called "_socket" and uses a wrapper
2329 * "socket.py" which implements that functionality that is missing
2330 * when PC operating systems don't put socket descriptors in the
2331 * operating system's filesystem layer.
2332 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002333
Guido van Rossum82a5c661998-07-07 20:45:43 +00002334static char module_doc[] =
2335"This module provides socket operations and some related functions.\n\
2336On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
2337On other systems, it only supports IP.\n\
2338\n\
2339Functions:\n\
2340\n\
2341socket() -- create a new socket object\n\
2342fromfd() -- create a socket object from an open file descriptor (*)\n\
2343gethostname() -- return the current hostname\n\
2344gethostbyname() -- map a hostname to its IP number\n\
2345gethostbyaddr() -- map an IP number or hostname to DNS info\n\
2346getservbyname() -- map a service name and a protocol name to a port number\n\
2347getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
2348ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
2349htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002350inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format\n\
2351inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)\n\
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002352ssl() -- secure socket layer support (only available if configured)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002353\n\
2354(*) not available on all platforms!)\n\
2355\n\
2356Special objects:\n\
2357\n\
2358SocketType -- type object for socket objects\n\
2359error -- exception raised for I/O errors\n\
2360\n\
2361Integer constants:\n\
2362\n\
2363AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
2364SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
2365\n\
2366Many other constants may be defined; these may be used in calls to\n\
2367the setsockopt() and getsockopt() methods.\n\
2368";
2369
2370static char sockettype_doc[] =
2371"A socket represents one endpoint of a network connection.\n\
2372\n\
2373Methods:\n\
2374\n\
2375accept() -- accept a connection, returning new socket and client address\n\
2376bind() -- bind the socket to a local address\n\
2377close() -- close the socket\n\
2378connect() -- connect the socket to a remote address\n\
2379connect_ex() -- connect, return an error code instead of an exception \n\
2380dup() -- return a new socket object identical to the current one (*)\n\
2381fileno() -- return underlying file descriptor\n\
2382getpeername() -- return remote address (*)\n\
2383getsockname() -- return local address\n\
2384getsockopt() -- get socket options\n\
2385listen() -- start listening for incoming connections\n\
2386makefile() -- return a file object corresponding tot the socket (*)\n\
2387recv() -- receive data\n\
2388recvfrom() -- receive data and sender's address\n\
2389send() -- send data\n\
2390sendto() -- send data to a given address\n\
2391setblocking() -- set or clear the blocking I/O flag\n\
2392setsockopt() -- set socket options\n\
2393shutdown() -- shut down traffic in one or both directions\n\
2394\n\
2395(*) not available on all platforms!)";
2396
Guido van Rossum3886bb61998-12-04 18:50:17 +00002397DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00002398#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002399init_socket()
2400#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002401initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00002402#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002403{
Guido van Rossum73624e91994-10-10 17:59:00 +00002404 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00002405#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002406 if (!NTinit())
2407 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002408 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002409#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002410#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002411 if (!OS2init())
2412 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002413 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002414#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00002415#if defined(__BEOS__)
2416 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
2417#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002418 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002419#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00002420#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00002421#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002422 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002423 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2424 if (PySocket_Error == NULL)
2425 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002426#ifdef USE_SSL
2427 SSL_load_error_strings();
2428 SSLeay_add_ssl_algorithms();
2429 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2430 if (SSLErrorObject == NULL)
2431 return;
2432 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2433 Py_INCREF(&SSL_Type);
2434 if (PyDict_SetItemString(d, "SSLType",
2435 (PyObject *)&SSL_Type) != 0)
2436 return;
2437#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002438 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002439 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002440 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002441 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002442 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002443 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002444 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002445
2446 /* Address families (we only support AF_INET and AF_UNIX) */
2447#ifdef AF_UNSPEC
2448 insint(d, "AF_UNSPEC", AF_UNSPEC);
2449#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002450 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002451#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002452 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002453#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002454#ifdef AF_AX25
2455 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2456#endif
2457#ifdef AF_IPX
2458 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2459#endif
2460#ifdef AF_APPLETALK
2461 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2462#endif
2463#ifdef AF_NETROM
2464 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2465#endif
2466#ifdef AF_BRIDGE
2467 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2468#endif
2469#ifdef AF_AAL5
2470 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2471#endif
2472#ifdef AF_X25
2473 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2474#endif
2475#ifdef AF_INET6
2476 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2477#endif
2478#ifdef AF_ROSE
2479 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2480#endif
2481
2482 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002483 insint(d, "SOCK_STREAM", SOCK_STREAM);
2484 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002485#ifndef __BEOS__
2486/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002487 insint(d, "SOCK_RAW", SOCK_RAW);
2488 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2489 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002490#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002491
2492#ifdef SO_DEBUG
2493 insint(d, "SO_DEBUG", SO_DEBUG);
2494#endif
2495#ifdef SO_ACCEPTCONN
2496 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2497#endif
2498#ifdef SO_REUSEADDR
2499 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2500#endif
2501#ifdef SO_KEEPALIVE
2502 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2503#endif
2504#ifdef SO_DONTROUTE
2505 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2506#endif
2507#ifdef SO_BROADCAST
2508 insint(d, "SO_BROADCAST", SO_BROADCAST);
2509#endif
2510#ifdef SO_USELOOPBACK
2511 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2512#endif
2513#ifdef SO_LINGER
2514 insint(d, "SO_LINGER", SO_LINGER);
2515#endif
2516#ifdef SO_OOBINLINE
2517 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2518#endif
2519#ifdef SO_REUSEPORT
2520 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2521#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002522#ifdef SO_SNDBUF
2523 insint(d, "SO_SNDBUF", SO_SNDBUF);
2524#endif
2525#ifdef SO_RCVBUF
2526 insint(d, "SO_RCVBUF", SO_RCVBUF);
2527#endif
2528#ifdef SO_SNDLOWAT
2529 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2530#endif
2531#ifdef SO_RCVLOWAT
2532 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2533#endif
2534#ifdef SO_SNDTIMEO
2535 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2536#endif
2537#ifdef SO_RCVTIMEO
2538 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2539#endif
2540#ifdef SO_ERROR
2541 insint(d, "SO_ERROR", SO_ERROR);
2542#endif
2543#ifdef SO_TYPE
2544 insint(d, "SO_TYPE", SO_TYPE);
2545#endif
2546
2547 /* Maximum number of connections for "listen" */
2548#ifdef SOMAXCONN
2549 insint(d, "SOMAXCONN", SOMAXCONN);
2550#else
2551 insint(d, "SOMAXCONN", 5); /* Common value */
2552#endif
2553
2554 /* Flags for send, recv */
2555#ifdef MSG_OOB
2556 insint(d, "MSG_OOB", MSG_OOB);
2557#endif
2558#ifdef MSG_PEEK
2559 insint(d, "MSG_PEEK", MSG_PEEK);
2560#endif
2561#ifdef MSG_DONTROUTE
2562 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2563#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002564#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00002565 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002566#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002567#ifdef MSG_EOR
2568 insint(d, "MSG_EOR", MSG_EOR);
2569#endif
2570#ifdef MSG_TRUNC
2571 insint(d, "MSG_TRUNC", MSG_TRUNC);
2572#endif
2573#ifdef MSG_CTRUNC
2574 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2575#endif
2576#ifdef MSG_WAITALL
2577 insint(d, "MSG_WAITALL", MSG_WAITALL);
2578#endif
2579#ifdef MSG_BTAG
2580 insint(d, "MSG_BTAG", MSG_BTAG);
2581#endif
2582#ifdef MSG_ETAG
2583 insint(d, "MSG_ETAG", MSG_ETAG);
2584#endif
2585
2586 /* Protocol level and numbers, usable for [gs]etsockopt */
2587#ifdef SOL_SOCKET
2588 insint(d, "SOL_SOCKET", SOL_SOCKET);
2589#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002590#ifdef SOL_IP
2591 insint(d, "SOL_IP", SOL_IP);
2592#else
2593 insint(d, "SOL_IP", 0);
2594#endif
2595#ifdef SOL_IPX
2596 insint(d, "SOL_IPX", SOL_IPX);
2597#endif
2598#ifdef SOL_AX25
2599 insint(d, "SOL_AX25", SOL_AX25);
2600#endif
2601#ifdef SOL_ATALK
2602 insint(d, "SOL_ATALK", SOL_ATALK);
2603#endif
2604#ifdef SOL_NETROM
2605 insint(d, "SOL_NETROM", SOL_NETROM);
2606#endif
2607#ifdef SOL_ROSE
2608 insint(d, "SOL_ROSE", SOL_ROSE);
2609#endif
2610#ifdef SOL_TCP
2611 insint(d, "SOL_TCP", SOL_TCP);
2612#else
2613 insint(d, "SOL_TCP", 6);
2614#endif
2615#ifdef SOL_UDP
2616 insint(d, "SOL_UDP", SOL_UDP);
2617#else
2618 insint(d, "SOL_UDP", 17);
2619#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002620#ifdef IPPROTO_IP
2621 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002622#else
2623 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002624#endif
2625#ifdef IPPROTO_ICMP
2626 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002627#else
2628 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002629#endif
2630#ifdef IPPROTO_IGMP
2631 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2632#endif
2633#ifdef IPPROTO_GGP
2634 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2635#endif
2636#ifdef IPPROTO_TCP
2637 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002638#else
2639 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002640#endif
2641#ifdef IPPROTO_EGP
2642 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2643#endif
2644#ifdef IPPROTO_PUP
2645 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2646#endif
2647#ifdef IPPROTO_UDP
2648 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002649#else
2650 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002651#endif
2652#ifdef IPPROTO_IDP
2653 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2654#endif
2655#ifdef IPPROTO_HELLO
2656 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2657#endif
2658#ifdef IPPROTO_ND
2659 insint(d, "IPPROTO_ND", IPPROTO_ND);
2660#endif
2661#ifdef IPPROTO_TP
2662 insint(d, "IPPROTO_TP", IPPROTO_TP);
2663#endif
2664#ifdef IPPROTO_XTP
2665 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2666#endif
2667#ifdef IPPROTO_EON
2668 insint(d, "IPPROTO_EON", IPPROTO_EON);
2669#endif
2670#ifdef IPPROTO_BIP
2671 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2672#endif
2673/**/
2674#ifdef IPPROTO_RAW
2675 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002676#else
2677 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002678#endif
2679#ifdef IPPROTO_MAX
2680 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2681#endif
2682
2683 /* Some port configuration */
2684#ifdef IPPORT_RESERVED
2685 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2686#else
2687 insint(d, "IPPORT_RESERVED", 1024);
2688#endif
2689#ifdef IPPORT_USERRESERVED
2690 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2691#else
2692 insint(d, "IPPORT_USERRESERVED", 5000);
2693#endif
2694
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002695 /* Some reserved IP v.4 addresses */
2696#ifdef INADDR_ANY
2697 insint(d, "INADDR_ANY", INADDR_ANY);
2698#else
2699 insint(d, "INADDR_ANY", 0x00000000);
2700#endif
2701#ifdef INADDR_BROADCAST
2702 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2703#else
2704 insint(d, "INADDR_BROADCAST", 0xffffffff);
2705#endif
2706#ifdef INADDR_LOOPBACK
2707 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2708#else
2709 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2710#endif
2711#ifdef INADDR_UNSPEC_GROUP
2712 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2713#else
2714 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2715#endif
2716#ifdef INADDR_ALLHOSTS_GROUP
2717 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2718#else
2719 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2720#endif
2721#ifdef INADDR_MAX_LOCAL_GROUP
2722 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2723#else
2724 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2725#endif
2726#ifdef INADDR_NONE
2727 insint(d, "INADDR_NONE", INADDR_NONE);
2728#else
2729 insint(d, "INADDR_NONE", 0xffffffff);
2730#endif
2731
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002732 /* IP [gs]etsockopt options */
2733#ifdef IP_OPTIONS
2734 insint(d, "IP_OPTIONS", IP_OPTIONS);
2735#endif
2736#ifdef IP_HDRINCL
2737 insint(d, "IP_HDRINCL", IP_HDRINCL);
2738#endif
2739#ifdef IP_TOS
2740 insint(d, "IP_TOS", IP_TOS);
2741#endif
2742#ifdef IP_TTL
2743 insint(d, "IP_TTL", IP_TTL);
2744#endif
2745#ifdef IP_RECVOPTS
2746 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2747#endif
2748#ifdef IP_RECVRETOPTS
2749 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2750#endif
2751#ifdef IP_RECVDSTADDR
2752 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2753#endif
2754#ifdef IP_RETOPTS
2755 insint(d, "IP_RETOPTS", IP_RETOPTS);
2756#endif
2757#ifdef IP_MULTICAST_IF
2758 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2759#endif
2760#ifdef IP_MULTICAST_TTL
2761 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2762#endif
2763#ifdef IP_MULTICAST_LOOP
2764 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2765#endif
2766#ifdef IP_ADD_MEMBERSHIP
2767 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2768#endif
2769#ifdef IP_DROP_MEMBERSHIP
2770 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2771#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002772#ifdef IP_DEFAULT_MULTICAST_TTL
2773 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2774#endif
2775#ifdef IP_DEFAULT_MULTICAST_LOOP
2776 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2777#endif
2778#ifdef IP_MAX_MEMBERSHIPS
2779 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2780#endif
2781
2782 /* TCP options */
2783#ifdef TCP_NODELAY
2784 insint(d, "TCP_NODELAY", TCP_NODELAY);
2785#endif
2786#ifdef TCP_MAXSEG
2787 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2788#endif
2789
2790 /* IPX options */
2791#ifdef IPX_TYPE
2792 insint(d, "IPX_TYPE", IPX_TYPE);
2793#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002794
2795 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002796#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002797 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002798#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002799}