blob: 2b7eb8dc0ce092be5a50bba83fcde8ccff9dbfca [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>
Andrew M. Kuchling52a644c2000-03-31 17:24:30 +0000169#include <netinet/tcp.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000170
Guido van Rossum9376b741999-09-15 22:01:40 +0000171/* Headers needed for inet_ntoa() and inet_addr() */
172#ifdef __BEOS__
173#include <net/netdb.h>
174#else
Guido van Rossumff3ab422000-04-24 15:16:03 +0000175#ifndef USE_GUSI1
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000176#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000177#endif
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000178#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000179
Guido van Rossume4485b01994-09-07 14:32:49 +0000180#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000181#else
182#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000183#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000184#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000185#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000186#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000187#else
188#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000189#endif
190
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000191#ifndef O_NDELAY
192#define O_NDELAY O_NONBLOCK /* For QNX only? */
193#endif
194
Guido van Rossumff3ab422000-04-24 15:16:03 +0000195#ifdef USE_GUSI1
Jack Jansen508537b1996-02-14 15:57:45 +0000196/* fdopen() isn't declared in stdio.h (sigh) */
197#include <GUSI.h>
198#endif
199
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000200#ifdef USE_SSL
201#include "rsa.h"
202#include "crypto.h"
203#include "x509.h"
204#include "pem.h"
205#include "ssl.h"
206#include "err.h"
207#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000208
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000209/* Here we have some hacks to choose between K&R or ANSI style function
210 definitions. For NT to build this as an extension module (ie, DLL)
211 it must be compiled by the C++ compiler, as it takes the address of
212 a static data item exported from the main Python DLL.
213*/
Guido van Rossumbcc20741998-08-04 22:53:56 +0000214#if defined(MS_WINDOWS) || defined(__BEOS__)
215/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000216/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000217#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000218#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000219#define FORCE_ANSI_FUNC_DEFS
220#endif
221
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000222#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000223#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000224#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
225#define FORCE_ANSI_FUNC_DEFS
226#endif
227
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000228#ifndef SOCKETCLOSE
229#define SOCKETCLOSE close
230#endif
231
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000232#ifdef FORCE_ANSI_FUNC_DEFS
233#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
234fnname( arg1type arg1name )
235
236#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
237fnname( arg1type arg1name, arg2type arg2name )
238
239#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
240fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
241
242#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
243fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
244
245#else /* !FORCE_ANSI_FN_DEFS */
246#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
247fnname( arg1name ) \
248 arg1type arg1name;
249
250#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
251fnname( arg1name, arg2name ) \
252 arg1type arg1name; \
253 arg2type arg2name;
254
255#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
256fnname( arg1name, arg2name, arg3name ) \
257 arg1type arg1name; \
258 arg2type arg2name; \
259 arg3type arg3name;
260
261#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
262fnname( arg1name, arg2name, arg3name, arg4name ) \
263 arg1type arg1name; \
264 arg2type arg2name; \
265 arg3type arg3name; \
266 arg4type arg4name;
267
268#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000269
270/* Global variable holding the exception type for errors detected
271 by this module (but not argument type or memory errors, etc.). */
272
Guido van Rossum73624e91994-10-10 17:59:00 +0000273static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000274
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000275#ifdef USE_SSL
276static PyObject *SSLErrorObject;
277#endif /* USE_SSL */
278
Guido van Rossum30a685f1991-06-27 15:51:29 +0000279
280/* Convenience function to raise an error according to errno
281 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000282
Guido van Rossum73624e91994-10-10 17:59:00 +0000283static PyObject *
284PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000285{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000286#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000287 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000288 PyObject *v;
289 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000290 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000291 PyErr_SetObject(PySocket_Error, v);
292 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000293 }
294 return NULL;
295 }
296 else
297#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000298
299#if defined(PYOS_OS2)
300 if (sock_errno() != NO_ERROR) {
301 APIRET rc;
302 ULONG msglen;
303 char outbuf[100];
304 int myerrorcode = sock_errno();
305
306 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
307 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
308 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
309 if (rc == NO_ERROR) {
310 PyObject *v;
311
312 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
313 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
314 char *lastc = &outbuf[ strlen(outbuf)-1 ];
315 while (lastc > outbuf && isspace(*lastc))
316 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
317 }
318 v = Py_BuildValue("(is)", myerrorcode, outbuf);
319 if (v != NULL) {
320 PyErr_SetObject(PySocket_Error, v);
321 Py_DECREF(v);
322 }
323 return NULL;
324 }
325 }
326#endif
327
Guido van Rossum73624e91994-10-10 17:59:00 +0000328 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000329}
330
Guido van Rossum30a685f1991-06-27 15:51:29 +0000331
332/* The object holding a socket. It holds some extra information,
333 like the address family, which is used to decode socket address
334 arguments properly. */
335
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000336typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000337 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000338 int sock_fd; /* Socket file descriptor */
339 int sock_family; /* Address family, e.g., AF_INET */
340 int sock_type; /* Socket type, e.g., SOCK_STREAM */
341 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000342 union sock_addr {
343 struct sockaddr_in in;
344#ifdef AF_UNIX
345 struct sockaddr_un un;
346#endif
347 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000348} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000349
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000350#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000351
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000352typedef struct {
353 PyObject_HEAD
354 PySocketSockObject *Socket; /* Socket on which we're layered */
355 PyObject *x_attr; /* Attributes dictionary */
356 SSL_CTX* ctx;
357 SSL* ssl;
358 X509* server_cert;
359 BIO* sbio;
360 char server[256];
361 char issuer[256];
362
363} SSLObject;
364
365staticforward PyTypeObject SSL_Type;
366staticforward int SSL_setattr(SSLObject *self, char *name, PyObject *v);
367staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
368staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
369
370#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
371
372#endif /* USE_SSL */
373
Guido van Rossum30a685f1991-06-27 15:51:29 +0000374/* A forward reference to the Socktype type object.
375 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000376 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000377 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000378
Guido van Rossum73624e91994-10-10 17:59:00 +0000379staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000380
Guido van Rossum30a685f1991-06-27 15:51:29 +0000381
382/* Create a new socket object.
383 This just creates the object and initializes it.
384 If the creation fails, return NULL and set an exception (implicit
385 in NEWOBJ()). */
386
Guido van Rossum73624e91994-10-10 17:59:00 +0000387static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000388BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000389{
Guido van Rossum73624e91994-10-10 17:59:00 +0000390 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000391 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000392 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000393 if (s != NULL) {
394 s->sock_fd = fd;
395 s->sock_family = family;
396 s->sock_type = type;
397 s->sock_proto = proto;
398 }
399 return s;
400}
401
Guido van Rossum30a685f1991-06-27 15:51:29 +0000402
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000403/* Lock to allow python interpreter to continue, but only allow one
404 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000405#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000406PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000407#endif
408
409
Guido van Rossum30a685f1991-06-27 15:51:29 +0000410/* Convert a string specifying a host name or one of a few symbolic
411 names to a numeric IP address. This usually calls gethostbyname()
412 to do the work; the names "" and "<broadcast>" are special.
413 Return the length (should always be 4 bytes), or negative if
414 an error occurred; then an exception is raised. */
415
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000416static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000417BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000418{
419 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000420 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000421 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000422 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000423#ifdef HAVE_GETHOSTBYNAME_R
424 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000425#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
426 struct hostent_data data;
427#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000428 char buf[1001];
429 int buf_len = (sizeof buf) - 1;
430 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000431#endif
432#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000433 int result;
434#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000435#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000436
Guido van Rossuma376cc51996-12-05 23:43:35 +0000437 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000438 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000439 addr_ret->sin_addr.s_addr = INADDR_ANY;
440 return 4;
441 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000442 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000443 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
444 return 4;
445 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000446 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
447 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
448 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
449 addr_ret->sin_addr.s_addr = htonl(
450 ((long) d1 << 24) | ((long) d2 << 16) |
451 ((long) d3 << 8) | ((long) d4 << 0));
452 return 4;
453 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000454 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000455#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000456#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000457 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000458#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000459 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000460#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000461 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000462 result = gethostbyname_r(name, &hp_allocated, &data);
463 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000464#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000465#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000466#ifdef USE_GETHOSTBYNAME_LOCK
467 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000468#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000469 hp = gethostbyname(name);
470#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000471 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000472
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000473 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000474#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000475 /* Let's get real error message to return */
476 extern int h_errno;
477 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
478#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000479 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000480#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000481#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000482 PyThread_release_lock(gethostbyname_lock);
483#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000484 return -1;
485 }
486 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000487 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000488#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000489 PyThread_release_lock(gethostbyname_lock);
490#endif
491 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000492}
493
Guido van Rossum30a685f1991-06-27 15:51:29 +0000494
Guido van Rossum30a685f1991-06-27 15:51:29 +0000495/* Create a string object representing an IP address.
496 This is always a string of the form 'dd.dd.dd.dd' (with variable
497 size numbers). */
498
Guido van Rossum73624e91994-10-10 17:59:00 +0000499static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000500BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000501{
502 long x = ntohl(addr->sin_addr.s_addr);
503 char buf[100];
504 sprintf(buf, "%d.%d.%d.%d",
505 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
506 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000507 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000508}
509
510
511/* Create an object representing the given socket address,
512 suitable for passing it back to bind(), connect() etc.
513 The family field of the sockaddr structure is inspected
514 to determine what kind of address it really is. */
515
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000516/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000517static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000518BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000519{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000520 if (addrlen == 0) {
521 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000522 Py_INCREF(Py_None);
523 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000524 }
525
Guido van Rossumbcc20741998-08-04 22:53:56 +0000526#ifdef __BEOS__
527 /* XXX: BeOS version of accept() doesn't set family coreectly */
528 addr->sa_family = AF_INET;
529#endif
530
Guido van Rossum30a685f1991-06-27 15:51:29 +0000531 switch (addr->sa_family) {
532
533 case AF_INET:
534 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000535 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000536 PyObject *addrobj = makeipaddr(a);
537 PyObject *ret = NULL;
538 if (addrobj) {
539 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
540 Py_DECREF(addrobj);
541 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000542 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000543 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000544
Guido van Rossumb6775db1994-08-01 11:34:53 +0000545#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000546 case AF_UNIX:
547 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000548 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000549 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000550 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000551#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000552
553 /* More cases here... */
554
555 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000556 /* If we don't know the address family, don't raise an
557 exception -- return it as a tuple. */
558 return Py_BuildValue("is#",
559 addr->sa_family,
560 addr->sa_data,
561 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000562
Guido van Rossum30a685f1991-06-27 15:51:29 +0000563 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000564}
565
Guido van Rossum30a685f1991-06-27 15:51:29 +0000566
567/* Parse a socket address argument according to the socket object's
568 address family. Return 1 if the address was in the proper format,
569 0 of not. The address is returned through addr_ret, its length
570 through len_ret. */
571
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000572static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000573BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000574getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000575{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000576 switch (s->sock_family) {
577
Guido van Rossumb6775db1994-08-01 11:34:53 +0000578#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000579 case AF_UNIX:
580 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000581 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000582 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000583 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000584 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000585 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000586 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000587 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000588 PyErr_SetString(PySocket_Error,
589 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000590 return 0;
591 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000592 addr->sun_family = AF_UNIX;
593 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000594 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000595 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000596 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000597 return 1;
598 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000599#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000600
Guido van Rossum30a685f1991-06-27 15:51:29 +0000601 case AF_INET:
602 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000603 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000604 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000605 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000606 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000607 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000608 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000609 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000610 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000611 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000612 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000613 *addr_ret = (struct sockaddr *) addr;
614 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000615 return 1;
616 }
617
Guido van Rossum30a685f1991-06-27 15:51:29 +0000618 /* More cases here... */
619
620 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000621 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000622 return 0;
623
624 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000625}
626
Guido van Rossum30a685f1991-06-27 15:51:29 +0000627
Guido van Rossum710e1df1992-06-12 10:39:36 +0000628/* Get the address length according to the socket object's address family.
629 Return 1 if the family is known, 0 otherwise. The length is returned
630 through len_ret. */
631
632static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000633BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000634{
635 switch (s->sock_family) {
636
Guido van Rossumb6775db1994-08-01 11:34:53 +0000637#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000638 case AF_UNIX:
639 {
640 *len_ret = sizeof (struct sockaddr_un);
641 return 1;
642 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000643#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000644
645 case AF_INET:
646 {
647 *len_ret = sizeof (struct sockaddr_in);
648 return 1;
649 }
650
651 /* More cases here... */
652
653 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000654 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000655 return 0;
656
657 }
658}
659
660
Guido van Rossum30a685f1991-06-27 15:51:29 +0000661/* s.accept() method */
662
Guido van Rossum73624e91994-10-10 17:59:00 +0000663static PyObject *
664BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000665{
666 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +0000667 int newfd;
668 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000669 PyObject *sock = NULL;
670 PyObject *addr = NULL;
671 PyObject *res = NULL;
672
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000673 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000674 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000675 if (!getsockaddrlen(s, &addrlen))
676 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000677 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000678 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000679 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000680 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000681 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000682
Guido van Rossum30a685f1991-06-27 15:51:29 +0000683 /* Create the new object with unspecified family,
684 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000685 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000686 s->sock_family,
687 s->sock_type,
688 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000689 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000690 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000691 goto finally;
692 }
693 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
694 goto finally;
695
696 if (!(res = Py_BuildValue("OO", sock, addr)))
697 goto finally;
698
699 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000700 Py_XDECREF(sock);
701 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000702 return res;
703}
704
Guido van Rossum82a5c661998-07-07 20:45:43 +0000705static char accept_doc[] =
706"accept() -> (socket object, address info)\n\
707\n\
708Wait for an incoming connection. Return a new socket representing the\n\
709connection, and the address of the client. For IP sockets, the address\n\
710info is a pair (hostaddr, port).";
711
Guido van Rossum30a685f1991-06-27 15:51:29 +0000712
Guido van Rossume4485b01994-09-07 14:32:49 +0000713/* s.setblocking(1 | 0) method */
714
Guido van Rossum73624e91994-10-10 17:59:00 +0000715static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000716BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000717{
718 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000719#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000720 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000721#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000722 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000723 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000724 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000725#ifdef __BEOS__
726 block = !block;
727 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
728 (void *)(&block), sizeof( int ) );
729#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000730#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000731#ifdef PYOS_OS2
732 block = !block;
733 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
734#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000735 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
736 if (block)
737 delay_flag &= (~O_NDELAY);
738 else
739 delay_flag |= O_NDELAY;
740 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000741#endif /* !PYOS_OS2 */
742#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000743 block = !block;
744 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000745#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000746#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000747 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000748
Guido van Rossum73624e91994-10-10 17:59:00 +0000749 Py_INCREF(Py_None);
750 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000751}
Guido van Rossume4485b01994-09-07 14:32:49 +0000752
Guido van Rossum82a5c661998-07-07 20:45:43 +0000753static char setblocking_doc[] =
754"setblocking(flag)\n\
755\n\
756Set the socket to blocking (flag is true) or non-blocking (false).\n\
757This uses the FIONBIO ioctl with the O_NDELAY flag.";
758
Guido van Rossume4485b01994-09-07 14:32:49 +0000759
Guido van Rossumaee08791992-09-08 09:05:33 +0000760/* s.setsockopt() method.
761 With an integer third argument, sets an integer option.
762 With a string third argument, sets an option from a buffer;
763 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000764
Guido van Rossum73624e91994-10-10 17:59:00 +0000765static PyObject *
766BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000767{
768 int level;
769 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000770 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000771 char *buf;
772 int buflen;
773 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000774
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000775 if (PyArg_ParseTuple(args, "iii:setsockopt",
776 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000777 buf = (char *) &flag;
778 buflen = sizeof flag;
779 }
780 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000781 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000782 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
783 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000784 return NULL;
785 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000786 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000787 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000788 return PySocket_Err();
789 Py_INCREF(Py_None);
790 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000791}
792
Guido van Rossum82a5c661998-07-07 20:45:43 +0000793static char setsockopt_doc[] =
794"setsockopt(level, option, value)\n\
795\n\
796Set a socket option. See the Unix manual for level and option.\n\
797The value argument can either be an integer or a string.";
798
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000799
Guido van Rossumaee08791992-09-08 09:05:33 +0000800/* s.getsockopt() method.
801 With two arguments, retrieves an integer option.
802 With a third integer argument, retrieves a string buffer of that size;
803 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000804
Guido van Rossum73624e91994-10-10 17:59:00 +0000805static PyObject *
806BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000807{
808 int level;
809 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000810 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000811 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000812 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000813
Guido van Rossumbcc20741998-08-04 22:53:56 +0000814#ifdef __BEOS__
815/* We have incomplete socket support. */
816 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
817 return NULL;
818#else
819
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000820 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
821 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000822 return NULL;
823
824 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000825 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000826 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000827 res = getsockopt(s->sock_fd, level, optname,
828 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000829 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000830 return PySocket_Err();
831 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000832 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000833 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000834 PyErr_SetString(PySocket_Error,
835 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000836 return NULL;
837 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000838 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000839 if (buf == NULL)
840 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000841 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000842 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000843 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000844 Py_DECREF(buf);
845 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000846 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000847 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000848 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000849#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000850}
851
Guido van Rossum82a5c661998-07-07 20:45:43 +0000852static char getsockopt_doc[] =
853"getsockopt(level, option[, buffersize]) -> value\n\
854\n\
855Get a socket option. See the Unix manual for level and option.\n\
856If a nonzero buffersize argument is given, the return value is a\n\
857string of that length; otherwise it is an integer.";
858
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000859
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000860/* s.bind(sockaddr...) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000861
Guido van Rossum73624e91994-10-10 17:59:00 +0000862static PyObject *
863BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000864{
865 struct sockaddr *addr;
866 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000867 int res;
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000868 if (!getsockaddrarg(s, args, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000869 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000870 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000871 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000872 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000873 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000874 return PySocket_Err();
875 Py_INCREF(Py_None);
876 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000877}
878
Guido van Rossum82a5c661998-07-07 20:45:43 +0000879static char bind_doc[] =
880"bind(address)\n\
881\n\
882Bind the socket to a local address. For IP sockets, the address is a\n\
883pair (host, port); the host must refer to the local host.";
884
Guido van Rossum30a685f1991-06-27 15:51:29 +0000885
886/* s.close() method.
887 Set the file descriptor to -1 so operations tried subsequently
888 will surely fail. */
889
Guido van Rossum73624e91994-10-10 17:59:00 +0000890static PyObject *
891BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000892{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000893 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000894 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000895 if (s->sock_fd != -1) {
896 Py_BEGIN_ALLOW_THREADS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000897 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum08481461996-10-12 14:07:22 +0000898 Py_END_ALLOW_THREADS
899 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000900 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000901 Py_INCREF(Py_None);
902 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000903}
904
Guido van Rossum82a5c661998-07-07 20:45:43 +0000905static char close_doc[] =
906"close()\n\
907\n\
908Close the socket. It cannot be used after this call.";
909
Guido van Rossum30a685f1991-06-27 15:51:29 +0000910
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000911/* s.connect(sockaddr...) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000912
Guido van Rossum73624e91994-10-10 17:59:00 +0000913static PyObject *
914BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000915{
916 struct sockaddr *addr;
917 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000918 int res;
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000919 if (!getsockaddrarg(s, args, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000920 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000921 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000922 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000923 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000924 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000925 return PySocket_Err();
926 Py_INCREF(Py_None);
927 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000928}
929
Guido van Rossum82a5c661998-07-07 20:45:43 +0000930static char connect_doc[] =
931"connect(address)\n\
932\n\
933Connect the socket to a remote address. For IP sockets, the address\n\
934is a pair (host, port).";
935
Guido van Rossum30a685f1991-06-27 15:51:29 +0000936
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000937/* s.connect_ex(sockaddr...) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000938
939static PyObject *
940BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
941{
942 struct sockaddr *addr;
943 int addrlen;
944 int res;
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000945 if (!getsockaddrarg(s, args, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000946 return NULL;
947 Py_BEGIN_ALLOW_THREADS
948 res = connect(s->sock_fd, addr, addrlen);
949 Py_END_ALLOW_THREADS
950 if (res != 0)
951 res = errno;
952 return PyInt_FromLong((long) res);
953}
954
Guido van Rossum82a5c661998-07-07 20:45:43 +0000955static char connect_ex_doc[] =
956"connect_ex(address)\n\
957\n\
958This is like connect(address), but returns an error code (the errno value)\n\
959instead of raising an exception when an error occurs.";
960
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000961
Guido van Rossumed233a51992-06-23 09:07:03 +0000962/* s.fileno() method */
963
Guido van Rossum73624e91994-10-10 17:59:00 +0000964static PyObject *
965BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000966{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000967 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +0000968 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000969 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000970}
971
Guido van Rossum82a5c661998-07-07 20:45:43 +0000972static char fileno_doc[] =
973"fileno() -> integer\n\
974\n\
975Return the integer file descriptor of the socket.";
976
Guido van Rossumed233a51992-06-23 09:07:03 +0000977
Guido van Rossumbe32c891996-06-20 16:25:29 +0000978#ifndef NO_DUP
979/* s.dup() method */
980
981static PyObject *
982BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
983{
984 int newfd;
985 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000986 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000987 return NULL;
988 newfd = dup(s->sock_fd);
989 if (newfd < 0)
990 return PySocket_Err();
991 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000992 s->sock_family,
993 s->sock_type,
994 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000995 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000996 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000997 return sock;
998}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000999
1000static char dup_doc[] =
1001"dup() -> socket object\n\
1002\n\
1003Return a new socket object connected to the same system resource.";
1004
Guido van Rossumbe32c891996-06-20 16:25:29 +00001005#endif
1006
1007
Guido van Rossumc89705d1992-11-26 08:54:07 +00001008/* s.getsockname() method */
1009
Guido van Rossum73624e91994-10-10 17:59:00 +00001010static PyObject *
1011BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001012{
1013 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001014 int res;
1015 socklen_t addrlen;
1016
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001017 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001018 return NULL;
1019 if (!getsockaddrlen(s, &addrlen))
1020 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001021 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001022 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001023 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001024 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001025 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001026 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001027 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1028}
1029
Guido van Rossum82a5c661998-07-07 20:45:43 +00001030static char getsockname_doc[] =
1031"getsockname() -> address info\n\
1032\n\
1033Return the address of the local endpoint. For IP sockets, the address\n\
1034info is a pair (hostaddr, port).";
1035
Guido van Rossumc89705d1992-11-26 08:54:07 +00001036
Guido van Rossumb6775db1994-08-01 11:34:53 +00001037#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001038/* s.getpeername() method */
1039
Guido van Rossum73624e91994-10-10 17:59:00 +00001040static PyObject *
1041BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001042{
1043 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001044 int res;
1045 socklen_t addrlen;
1046
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001047 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001048 return NULL;
1049 if (!getsockaddrlen(s, &addrlen))
1050 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001051 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001052 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001053 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001054 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001055 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001056 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1057}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001058
1059static char getpeername_doc[] =
1060"getpeername() -> address info\n\
1061\n\
1062Return the address of the remote endpoint. For IP sockets, the address\n\
1063info is a pair (hostaddr, port).";
1064
Guido van Rossumb6775db1994-08-01 11:34:53 +00001065#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001066
1067
Guido van Rossum30a685f1991-06-27 15:51:29 +00001068/* s.listen(n) method */
1069
Guido van Rossum73624e91994-10-10 17:59:00 +00001070static PyObject *
1071BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001072{
1073 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001074 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001075 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001076 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001077 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001078 if (backlog < 1)
1079 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001080 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001081 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001082 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001083 return PySocket_Err();
1084 Py_INCREF(Py_None);
1085 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001086}
1087
Guido van Rossum82a5c661998-07-07 20:45:43 +00001088static char listen_doc[] =
1089"listen(backlog)\n\
1090\n\
1091Enable a server to accept connections. The backlog argument must be at\n\
1092least 1; it specifies the number of unaccepted connection that the system\n\
1093will allow before refusing new connections.";
1094
1095
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001096#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001097/* s.makefile(mode) method.
1098 Create a new open file object referring to a dupped version of
1099 the socket's file descriptor. (The dup() call is necessary so
1100 that the open file and socket objects may be closed independent
1101 of each other.)
1102 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1103
Guido van Rossum73624e91994-10-10 17:59:00 +00001104static PyObject *
1105BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001106{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001107 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +00001108 char *mode = "r";
1109 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001110 int fd;
1111 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001112 PyObject *f;
1113
Guido van Rossum43713e52000-02-29 13:59:29 +00001114 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001115 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001116#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001117 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1118 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001119#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001120 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001121#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001122 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001123 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001124 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001125 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001126 }
1127 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1128 if (f != NULL)
1129 PyFile_SetBufSize(f, bufsize);
1130 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001131}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001132
1133static char makefile_doc[] =
1134"makefile([mode[, buffersize]]) -> file object\n\
1135\n\
1136Return a regular file object corresponding to the socket.\n\
1137The mode and buffersize arguments are as for the built-in open() function.";
1138
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001139#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001140
Guido van Rossum82a5c661998-07-07 20:45:43 +00001141
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001142/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001143
Guido van Rossum73624e91994-10-10 17:59:00 +00001144static PyObject *
1145BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001146{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001147 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001148 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001149 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001150 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001151 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001152 if (buf == NULL)
1153 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001154 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001155 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001156 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001157 if (n < 0) {
1158 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001159 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001160 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001161 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001162 return NULL;
1163 return buf;
1164}
1165
Guido van Rossum82a5c661998-07-07 20:45:43 +00001166static char recv_doc[] =
1167"recv(buffersize[, flags]) -> data\n\
1168\n\
1169Receive up to buffersize bytes from the socket. For the optional flags\n\
1170argument, see the Unix manual. When no data is available, block until\n\
1171at least one byte is available or until the remote end is closed. When\n\
1172the remote end is closed and all data is read, return the empty string.";
1173
Guido van Rossum30a685f1991-06-27 15:51:29 +00001174
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001175/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001176
Guido van Rossum73624e91994-10-10 17:59:00 +00001177static PyObject *
1178BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001179{
1180 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001181 PyObject *buf = NULL;
1182 PyObject *addr = NULL;
1183 PyObject *ret = NULL;
1184
Guido van Rossumff3ab422000-04-24 15:16:03 +00001185 int len, n, flags = 0;
1186 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001187 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001188 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001189 if (!getsockaddrlen(s, &addrlen))
1190 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001191 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001192 if (buf == NULL)
1193 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001194 Py_BEGIN_ALLOW_THREADS
1195 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001196#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001197#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001198 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001199#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001200 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001201#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001202#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001203 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001204#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001205 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001206 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001207 if (n < 0) {
1208 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001209 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001210 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001211 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001212 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001213
1214 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1215 goto finally;
1216
Guido van Rossum73624e91994-10-10 17:59:00 +00001217 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001218 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001219 Py_XDECREF(addr);
1220 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001221 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001222}
1223
Guido van Rossum82a5c661998-07-07 20:45:43 +00001224static char recvfrom_doc[] =
1225"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1226\n\
1227Like recv(buffersize, flags) but also return the sender's address info.";
1228
Guido van Rossum30a685f1991-06-27 15:51:29 +00001229
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001230/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001231
Guido van Rossum73624e91994-10-10 17:59:00 +00001232static PyObject *
1233BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001234{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001235 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001236 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001237 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001238 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001239 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001240 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001241 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001242 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001243 return PySocket_Err();
1244 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001245}
1246
Guido van Rossum82a5c661998-07-07 20:45:43 +00001247static char send_doc[] =
1248"send(data[, flags])\n\
1249\n\
1250Send a data string to the socket. For the optional flags\n\
1251argument, see the Unix manual.";
1252
Guido van Rossum30a685f1991-06-27 15:51:29 +00001253
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001254/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001255
Guido van Rossum73624e91994-10-10 17:59:00 +00001256static PyObject *
1257BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001258{
Guido van Rossum73624e91994-10-10 17:59:00 +00001259 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001260 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001261 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001262 int addrlen, len, n, flags;
1263 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001264 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001265 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001266 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1267 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001268 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001269 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001270 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001271 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001272 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001273 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001274 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001275 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001276 return PySocket_Err();
1277 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001278}
1279
Guido van Rossum82a5c661998-07-07 20:45:43 +00001280static char sendto_doc[] =
1281"sendto(data[, flags], address)\n\
1282\n\
1283Like send(data, flags) but allows specifying the destination address.\n\
1284For IP sockets, the address is a pair (hostaddr, port).";
1285
Guido van Rossum30a685f1991-06-27 15:51:29 +00001286
1287/* s.shutdown(how) method */
1288
Guido van Rossum73624e91994-10-10 17:59:00 +00001289static PyObject *
1290BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001291{
1292 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001293 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001294 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001295 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001296 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001297 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001298 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001299 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001300 return PySocket_Err();
1301 Py_INCREF(Py_None);
1302 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001303}
1304
Guido van Rossum82a5c661998-07-07 20:45:43 +00001305static char shutdown_doc[] =
1306"shutdown(flag)\n\
1307\n\
1308Shut down the reading side of the socket (flag == 0), the writing side\n\
1309of the socket (flag == 1), or both ends (flag == 2).";
1310
Guido van Rossum30a685f1991-06-27 15:51:29 +00001311
1312/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001313
Guido van Rossum73624e91994-10-10 17:59:00 +00001314static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001315 {"accept", (PyCFunction)PySocketSock_accept, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001316 accept_doc},
Guido van Rossum527c9bd2000-04-04 14:10:20 +00001317 {"bind", (PyCFunction)PySocketSock_bind, 0,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001318 bind_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001319 {"close", (PyCFunction)PySocketSock_close, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001320 close_doc},
Guido van Rossum527c9bd2000-04-04 14:10:20 +00001321 {"connect", (PyCFunction)PySocketSock_connect, 0,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001322 connect_doc},
Guido van Rossum527c9bd2000-04-04 14:10:20 +00001323 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 0,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001324 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001325#ifndef NO_DUP
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001326 {"dup", (PyCFunction)PySocketSock_dup, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001327 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001328#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001329 {"fileno", (PyCFunction)PySocketSock_fileno, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001330 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001331#ifdef HAVE_GETPEERNAME
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001332 {"getpeername", (PyCFunction)PySocketSock_getpeername, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001333 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001334#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001335 {"getsockname", (PyCFunction)PySocketSock_getsockname, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001336 getsockname_doc},
1337 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1338 getsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001339 {"listen", (PyCFunction)PySocketSock_listen, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001340 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001341#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001342 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1343 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001344#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001345 {"recv", (PyCFunction)PySocketSock_recv, 1,
1346 recv_doc},
1347 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1348 recvfrom_doc},
1349 {"send", (PyCFunction)PySocketSock_send, 1,
1350 send_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001351 {"sendto", (PyCFunction)PySocketSock_sendto, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001352 sendto_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001353 {"setblocking", (PyCFunction)PySocketSock_setblocking, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001354 setblocking_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001355 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001356 setsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001357 {"shutdown", (PyCFunction)PySocketSock_shutdown, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001358 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001359 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001360};
1361
Guido van Rossum30a685f1991-06-27 15:51:29 +00001362
Guido van Rossum73624e91994-10-10 17:59:00 +00001363/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001364 First close the file description. */
1365
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001366static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001367BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001368{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001369 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001370 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001371 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001372}
1373
Guido van Rossum30a685f1991-06-27 15:51:29 +00001374
1375/* Return a socket object's named attribute. */
1376
Guido van Rossum73624e91994-10-10 17:59:00 +00001377static PyObject *
1378BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001379{
Guido van Rossum73624e91994-10-10 17:59:00 +00001380 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001381}
1382
Guido van Rossum30a685f1991-06-27 15:51:29 +00001383
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001384static PyObject *
1385BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1386{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001387 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001388 sprintf(buf,
1389 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1390 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001391 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001392}
1393
1394
Guido van Rossumb6775db1994-08-01 11:34:53 +00001395/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001396
Guido van Rossum73624e91994-10-10 17:59:00 +00001397static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001398 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001399 0,
1400 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001401 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001402 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001403 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001404 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001405 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001406 0, /*tp_setattr*/
1407 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001408 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001409 0, /*tp_as_number*/
1410 0, /*tp_as_sequence*/
1411 0, /*tp_as_mapping*/
1412};
1413
Guido van Rossum30a685f1991-06-27 15:51:29 +00001414
Guido van Rossum81194471991-07-27 21:42:02 +00001415/* Python interface to gethostname(). */
1416
1417/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001418static PyObject *
1419BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001420{
1421 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001422 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001423 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001424 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001425 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001426 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001427 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001428 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001429 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001430 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001431 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001432}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001433
Guido van Rossum82a5c661998-07-07 20:45:43 +00001434static char gethostname_doc[] =
1435"gethostname() -> string\n\
1436\n\
1437Return the current host name.";
1438
Guido van Rossumff4949e1992-08-05 19:58:53 +00001439
Guido van Rossum30a685f1991-06-27 15:51:29 +00001440/* Python interface to gethostbyname(name). */
1441
1442/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001443static PyObject *
1444BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001445{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001446 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001447 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001448 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001449 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001450 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001451 return NULL;
1452 return makeipaddr(&addrbuf);
1453}
1454
Guido van Rossum82a5c661998-07-07 20:45:43 +00001455static char gethostbyname_doc[] =
1456"gethostbyname(host) -> address\n\
1457\n\
1458Return the IP address (a string of the form '255.255.255.255') for a host.";
1459
1460
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001461/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1462
1463static PyObject *
1464gethost_common(h, addr)
1465 struct hostent *h;
1466 struct sockaddr_in *addr;
1467{
1468 char **pch;
1469 PyObject *rtn_tuple = (PyObject *)NULL;
1470 PyObject *name_list = (PyObject *)NULL;
1471 PyObject *addr_list = (PyObject *)NULL;
1472 PyObject *tmp;
1473 if (h == NULL) {
1474#ifdef HAVE_HSTRERROR
1475 /* Let's get real error message to return */
1476 extern int h_errno;
1477 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1478#else
1479 PyErr_SetString(PySocket_Error, "host not found");
1480#endif
1481 return NULL;
1482 }
1483 if ((name_list = PyList_New(0)) == NULL)
1484 goto err;
1485 if ((addr_list = PyList_New(0)) == NULL)
1486 goto err;
1487 for (pch = h->h_aliases; *pch != NULL; pch++) {
1488 int status;
1489 tmp = PyString_FromString(*pch);
1490 if (tmp == NULL)
1491 goto err;
1492 status = PyList_Append(name_list, tmp);
1493 Py_DECREF(tmp);
1494 if (status)
1495 goto err;
1496 }
1497 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1498 int status;
1499 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1500 tmp = makeipaddr(addr);
1501 if (tmp == NULL)
1502 goto err;
1503 status = PyList_Append(addr_list, tmp);
1504 Py_DECREF(tmp);
1505 if (status)
1506 goto err;
1507 }
1508 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1509 err:
1510 Py_XDECREF(name_list);
1511 Py_XDECREF(addr_list);
1512 return rtn_tuple;
1513}
1514
1515
1516/* Python interface to gethostbyname_ex(name). */
1517
1518/*ARGSUSED*/
1519static PyObject *
1520BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1521{
1522 char *name;
1523 struct hostent *h;
1524 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001525 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001526#ifdef HAVE_GETHOSTBYNAME_R
1527 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001528#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1529 struct hostent_data data;
1530#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001531 char buf[16384];
1532 int buf_len = (sizeof buf) - 1;
1533 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001534#endif
1535#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001536 int result;
1537#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001538#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001539 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001540 return NULL;
1541 if (setipaddr(name, &addr) < 0)
1542 return NULL;
1543 Py_BEGIN_ALLOW_THREADS
1544#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001545#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001546 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001547#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001548 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001549#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001550 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001551 result = gethostbyname_r(name, &hp_allocated, &data);
1552 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001553#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001554#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001555#ifdef USE_GETHOSTBYNAME_LOCK
1556 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001557#endif
1558 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001559#endif /* HAVE_GETHOSTBYNAME_R */
1560 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001561 ret = gethost_common(h, &addr);
1562#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001563 PyThread_release_lock(gethostbyname_lock);
1564#endif
1565 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001566}
1567
1568static char ghbn_ex_doc[] =
1569"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1570\n\
1571Return the true host name, a list of aliases, and a list of IP addresses,\n\
1572for a host. The host argument is a string giving a host name or IP number.";
1573
1574
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001575/* Python interface to gethostbyaddr(IP). */
1576
1577/*ARGSUSED*/
1578static PyObject *
1579BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1580{
1581 struct sockaddr_in addr;
1582 char *ip_num;
1583 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001584 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001585#ifdef HAVE_GETHOSTBYNAME_R
1586 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001587#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1588 struct hostent_data data;
1589#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001590 char buf[16384];
1591 int buf_len = (sizeof buf) - 1;
1592 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001593#endif
1594#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001595 int result;
1596#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001597#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001598
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001599 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001600 return NULL;
1601 if (setipaddr(ip_num, &addr) < 0)
1602 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001603 Py_BEGIN_ALLOW_THREADS
1604#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001605#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001606 result = gethostbyaddr_r((char *)&addr.sin_addr,
1607 sizeof(addr.sin_addr),
1608 AF_INET, &hp_allocated, buf, buf_len,
1609 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001610#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001611 h = gethostbyaddr_r((char *)&addr.sin_addr,
1612 sizeof(addr.sin_addr),
1613 AF_INET,
1614 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001615#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001616 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001617 result = gethostbyaddr_r((char *)&addr.sin_addr,
1618 sizeof(addr.sin_addr),
1619 AF_INET, &hp_allocated, &data);
1620 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001621#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001622#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001623#ifdef USE_GETHOSTBYNAME_LOCK
1624 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001625#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001626 h = gethostbyaddr((char *)&addr.sin_addr,
1627 sizeof(addr.sin_addr),
1628 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001629#endif /* HAVE_GETHOSTBYNAME_R */
1630 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001631 ret = gethost_common(h, &addr);
1632#ifdef USE_GETHOSTBYNAME_LOCK
1633 PyThread_release_lock(gethostbyname_lock);
1634#endif
1635 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001636}
1637
Guido van Rossum82a5c661998-07-07 20:45:43 +00001638static char gethostbyaddr_doc[] =
1639"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1640\n\
1641Return the true host name, a list of aliases, and a list of IP addresses,\n\
1642for a host. The host argument is a string giving a host name or IP number.";
1643
Guido van Rossum30a685f1991-06-27 15:51:29 +00001644
1645/* Python interface to getservbyname(name).
1646 This only returns the port number, since the other info is already
1647 known or not useful (like the list of aliases). */
1648
1649/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001650static PyObject *
1651BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001652{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001653 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001654 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001655 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001656 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001657 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001658 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001659 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001660 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001661 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001662 return NULL;
1663 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001664 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001665}
1666
Guido van Rossum82a5c661998-07-07 20:45:43 +00001667static char getservbyname_doc[] =
1668"getservbyname(servicename, protocolname) -> integer\n\
1669\n\
1670Return a port number from a service name and protocol name.\n\
1671The protocol name should be 'tcp' or 'udp'.";
1672
Guido van Rossum30a685f1991-06-27 15:51:29 +00001673
Guido van Rossum3901d851996-12-19 16:35:04 +00001674/* Python interface to getprotobyname(name).
1675 This only returns the protocol number, since the other info is
1676 already known or not useful (like the list of aliases). */
1677
1678/*ARGSUSED*/
1679static PyObject *
1680BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1681{
1682 char *name;
1683 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001684#ifdef __BEOS__
1685/* Not available in BeOS yet. - [cjh] */
1686 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1687 return NULL;
1688#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001689 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001690 return NULL;
1691 Py_BEGIN_ALLOW_THREADS
1692 sp = getprotobyname(name);
1693 Py_END_ALLOW_THREADS
1694 if (sp == NULL) {
1695 PyErr_SetString(PySocket_Error, "protocol not found");
1696 return NULL;
1697 }
1698 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001699#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001700}
1701
Guido van Rossum82a5c661998-07-07 20:45:43 +00001702static char getprotobyname_doc[] =
1703"getprotobyname(name) -> integer\n\
1704\n\
1705Return the protocol number for the named protocol. (Rarely used.)";
1706
Guido van Rossum3901d851996-12-19 16:35:04 +00001707
Guido van Rossum30a685f1991-06-27 15:51:29 +00001708/* Python interface to socket(family, type, proto).
1709 The third (protocol) argument is optional.
1710 Return a new socket object. */
1711
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001712/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001713static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001714BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001715{
Guido van Rossum73624e91994-10-10 17:59:00 +00001716 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001717#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001718 SOCKET fd;
1719#else
1720 int fd;
1721#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001722 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001723 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001724 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001725 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001726 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001727 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001728#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001729 if (fd == INVALID_SOCKET)
1730#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001731 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001732#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001733 return PySocket_Err();
1734 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001735 /* If the object can't be created, don't forget to close the
1736 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001737 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001738 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001739 /* From now on, ignore SIGPIPE and let the error checking
1740 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001741#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001742 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001743#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001744 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001745}
1746
Guido van Rossum82a5c661998-07-07 20:45:43 +00001747static char socket_doc[] =
1748"socket(family, type[, proto]) -> socket object\n\
1749\n\
1750Open a socket of the given type. The family argument specifies the\n\
1751address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1752The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1753or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1754specifying the default protocol.";
1755
1756
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001757#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001758/* Create a socket object from a numeric file description.
1759 Useful e.g. if stdin is a socket.
1760 Additional arguments as for socket(). */
1761
1762/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001763static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001764BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001765{
Guido van Rossum73624e91994-10-10 17:59:00 +00001766 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001767 int fd, family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001768 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1769 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001770 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001771 /* Dup the fd so it and the socket can be closed independently */
1772 fd = dup(fd);
1773 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001774 return PySocket_Err();
1775 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001776 /* From now on, ignore SIGPIPE and let the error checking
1777 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001778#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001779 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001780#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001781 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001782}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001783
1784static char fromfd_doc[] =
1785"fromfd(fd, family, type[, proto]) -> socket object\n\
1786\n\
1787Create a socket object from the given file descriptor.\n\
1788The remaining arguments are the same as for socket().";
1789
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001790#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001791
Guido van Rossum82a5c661998-07-07 20:45:43 +00001792
Guido van Rossum006bf911996-06-12 04:04:55 +00001793static PyObject *
1794BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1795{
1796 int x1, x2;
1797
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001798 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001799 return NULL;
1800 }
1801 x2 = (int)ntohs((short)x1);
1802 return PyInt_FromLong(x2);
1803}
1804
Guido van Rossum82a5c661998-07-07 20:45:43 +00001805static char ntohs_doc[] =
1806"ntohs(integer) -> integer\n\
1807\n\
1808Convert a 16-bit integer from network to host byte order.";
1809
1810
Guido van Rossum006bf911996-06-12 04:04:55 +00001811static PyObject *
1812BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1813{
1814 int x1, x2;
1815
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001816 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001817 return NULL;
1818 }
1819 x2 = ntohl(x1);
1820 return PyInt_FromLong(x2);
1821}
1822
Guido van Rossum82a5c661998-07-07 20:45:43 +00001823static char ntohl_doc[] =
1824"ntohl(integer) -> integer\n\
1825\n\
1826Convert a 32-bit integer from network to host byte order.";
1827
1828
Guido van Rossum006bf911996-06-12 04:04:55 +00001829static PyObject *
1830BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1831{
1832 int x1, x2;
1833
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001834 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001835 return NULL;
1836 }
1837 x2 = (int)htons((short)x1);
1838 return PyInt_FromLong(x2);
1839}
1840
Guido van Rossum82a5c661998-07-07 20:45:43 +00001841static char htons_doc[] =
1842"htons(integer) -> integer\n\
1843\n\
1844Convert a 16-bit integer from host to network byte order.";
1845
1846
Guido van Rossum006bf911996-06-12 04:04:55 +00001847static PyObject *
1848BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1849{
1850 int x1, x2;
1851
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001852 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001853 return NULL;
1854 }
1855 x2 = htonl(x1);
1856 return PyInt_FromLong(x2);
1857}
1858
Guido van Rossum82a5c661998-07-07 20:45:43 +00001859static char htonl_doc[] =
1860"htonl(integer) -> integer\n\
1861\n\
1862Convert a 32-bit integer from host to network byte order.";
1863
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001864/*
1865 * socket.inet_aton() and socket.inet_ntoa() functions
1866 *
1867 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
1868 *
1869 */
1870
1871static char inet_aton_doc[] =
1872"inet_aton(string) -> packed 32-bit IP representation\n\
1873\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001874Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001875binary format used in low-level network functions.";
1876
1877static PyObject*
1878BUILD_FUNC_DEF_2(PySocket_inet_aton, PyObject *, self, PyObject *, args)
1879{
Guido van Rossuma2e48551999-09-09 15:42:59 +00001880#ifndef INADDR_NONE
1881#define INADDR_NONE (-1)
1882#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001883
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001884 /* Have to use inet_addr() instead */
1885 char *ip_addr;
1886 long packed_addr;
1887
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001888 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001889 return NULL;
1890 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00001891#ifdef USE_GUSI1
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001892 packed_addr = (long)inet_addr(ip_addr).s_addr;
1893#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001894 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001895#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001896
1897 if (packed_addr == INADDR_NONE) { /* invalid address */
1898 PyErr_SetString(PySocket_Error,
1899 "illegal IP address string passed to inet_aton");
1900 return NULL;
1901 }
1902
1903 return PyString_FromStringAndSize((char *) &packed_addr,
1904 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001905}
1906
1907static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00001908"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001909\n\
1910Convert an IP address from 32-bit packed binary format to string format";
1911
1912static PyObject*
1913BUILD_FUNC_DEF_2(PySocket_inet_ntoa, PyObject *, self, PyObject *, args)
1914{
1915 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001916 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001917 struct in_addr packed_addr;
1918
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001919 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001920 return NULL;
1921 }
1922
1923 if (addr_len != sizeof(packed_addr)) {
1924 PyErr_SetString(PySocket_Error,
1925 "packed IP wrong length for inet_ntoa");
1926 return NULL;
1927 }
1928
1929 memcpy(&packed_addr, packed_str, addr_len);
1930
1931 return PyString_FromString(inet_ntoa(packed_addr));
1932}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001933
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001934
1935#ifdef USE_SSL
1936
1937/* This is a C function to be called for new object initialization */
1938static SSLObject *
1939BUILD_FUNC_DEF_3(newSSLObject,
1940 PySocketSockObject *,Sock, char*,key_file, char*,cert_file)
1941{
1942 SSLObject *self;
1943 char *str;
1944
1945#if 0
1946 meth=SSLv23_client_method();
1947 meth=SSLv3_client_method();
1948 meth=SSLv2_client_method();
1949#endif
1950
1951 self = PyObject_NEW(SSLObject, &SSL_Type); /* Create new object */
1952 if (self == NULL){
1953 PyErr_SetObject(SSLErrorObject,
1954 PyString_FromString("newSSLObject error"));
1955 return NULL;
1956 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001957 memset(self->server, '\0', sizeof(char) * 256);
1958 memset(self->issuer, '\0', sizeof(char) * 256);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001959
1960 self->x_attr = PyDict_New();
1961 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
1962 if (self->ctx == NULL) {
1963 PyErr_SetObject(SSLErrorObject,
1964 PyString_FromString("SSL_CTX_new error"));
1965 PyMem_DEL(self);
1966 return NULL;
1967 }
1968
1969 if ( (key_file && !cert_file) || (!key_file && cert_file) )
1970 {
1971 PyErr_SetObject(SSLErrorObject,
1972 PyString_FromString(
1973 "Both the key & certificate files must be specified"));
1974 PyMem_DEL(self);
1975 return NULL;
1976 }
1977
1978 if (key_file && cert_file)
1979 {
1980 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
1981 SSL_FILETYPE_PEM) < 1)
1982 {
1983 PyErr_SetObject(SSLErrorObject,
1984 PyString_FromString(
1985 "SSL_CTX_use_PrivateKey_file error"));
1986 PyMem_DEL(self);
1987 return NULL;
1988 }
1989
1990 if (SSL_CTX_use_certificate_chain_file(self->ctx,
1991 cert_file) < 1)
1992 {
1993 PyErr_SetObject(SSLErrorObject,
1994 PyString_FromString(
1995 "SSL_CTX_use_certificate_chain_file error"));
1996 PyMem_DEL(self);
1997 return NULL;
1998 }
1999 }
2000
2001 SSL_CTX_set_verify(self->ctx,
2002 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2003 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2004 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2005 SSL_set_connect_state(self->ssl);
2006
2007 if ((SSL_connect(self->ssl)) == -1) {
2008 /* Actually negotiate SSL connection */
2009 PyErr_SetObject(SSLErrorObject,
2010 PyString_FromString("SSL_connect error"));
2011 PyMem_DEL(self);
2012 return NULL;
2013 }
2014 self->ssl->debug = 1;
2015
2016 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2017 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2018 self->server, 256);
2019 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2020 self->issuer, 256);
2021 }
2022 self->x_attr = NULL;
2023 self->Socket = Sock;
2024 Py_INCREF(self->Socket);
2025 return self;
2026}
2027
2028/* This is the Python function called for new object initialization */
2029static PyObject *
2030BUILD_FUNC_DEF_2(PySocket_ssl, PyObject *, self, PyObject *, args)
2031{
2032 SSLObject *rv;
2033 PySocketSockObject *Sock;
2034 char *key_file;
2035 char *cert_file;
2036
Guido van Rossum43713e52000-02-29 13:59:29 +00002037 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002038 &PySocketSock_Type, (PyObject*)&Sock,
2039 &key_file, &cert_file) )
2040 return NULL;
2041
2042 rv = newSSLObject(Sock, key_file, cert_file);
2043 if ( rv == NULL )
2044 return NULL;
2045 return (PyObject *)rv;
2046}
2047
2048static char ssl_doc[] =
2049"ssl(socket, keyfile, certfile) -> sslobject";
2050
2051static PyObject *
2052BUILD_FUNC_DEF_2(SSL_server, SSLObject *, self, PyObject *, args)
2053{
2054 return PyString_FromString(self->server);
2055}
2056
2057static PyObject *
2058BUILD_FUNC_DEF_2(SSL_issuer, SSLObject *, self, PyObject *, args)
2059{
2060 return PyString_FromString(self->issuer);
2061}
2062
2063
2064/* SSL object methods */
2065
2066static PyMethodDef SSLMethods[] = {
2067 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2068 { "read", (PyCFunction)SSL_SSLread, 1 },
2069 { "server", (PyCFunction)SSL_server, 1 },
2070 { "issuer", (PyCFunction)SSL_issuer, 1 },
2071 { NULL, NULL}
2072};
2073
2074static void SSL_dealloc(SSLObject *self)
2075{
2076 if (self->server_cert) /* Possible not to have one? */
2077 X509_free (self->server_cert);
2078 SSL_CTX_free(self->ctx);
2079 SSL_free(self->ssl);
2080 Py_XDECREF(self->x_attr);
2081 Py_XDECREF(self->Socket);
2082 PyMem_DEL(self);
2083}
2084
2085static PyObject *SSL_getattr(SSLObject *self, char *name)
2086{
2087 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2088}
2089
2090staticforward PyTypeObject SSL_Type = {
2091 PyObject_HEAD_INIT(&PyType_Type)
2092 0, /*ob_size*/
2093 "SSL", /*tp_name*/
2094 sizeof(SSLObject), /*tp_basicsize*/
2095 0, /*tp_itemsize*/
2096 /* methods */
2097 (destructor)SSL_dealloc, /*tp_dealloc*/
2098 0, /*tp_print*/
2099 (getattrfunc)SSL_getattr, /*tp_getattr*/
2100 0, /*tp_setattr*/
2101 0, /*tp_compare*/
2102 0, /*tp_repr*/
2103 0, /*tp_as_number*/
2104 0, /*tp_as_sequence*/
2105 0, /*tp_as_mapping*/
2106 0, /*tp_hash*/
2107};
2108
2109
2110
2111static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2112{
2113 char *data;
2114 int len = 0;
2115
Guido van Rossum43713e52000-02-29 13:59:29 +00002116 if (!PyArg_ParseTuple(args, "s|i:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002117 return NULL;
2118
2119 if (!len)
2120 len = strlen(data);
2121
2122 len = SSL_write(self->ssl, data, len);
2123 return PyInt_FromLong((long)len);
2124}
2125
2126static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2127{
2128 PyObject *buf;
2129 int count = 0;
2130 int len = 1024;
2131 int res;
2132
Guido van Rossum43713e52000-02-29 13:59:29 +00002133 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002134
2135 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2136 return NULL; /* Error object should already be set */
2137
2138 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2139 res = SSL_get_error(self->ssl, count);
2140
2141 switch (res) {
2142 case 0: /* Good return value! */
2143 break;
2144 case 6:
2145 PyErr_SetString(SSLErrorObject, "EOF");
2146 Py_DECREF(buf);
2147 return NULL;
2148 break;
2149 case 5:
2150 default:
2151 return PyErr_SetFromErrno(SSLErrorObject);
2152 break;
2153 }
2154
2155 fflush(stderr);
2156
2157 if (count < 0) {
2158 Py_DECREF(buf);
2159 return PyErr_SetFromErrno(SSLErrorObject);
2160 }
2161
2162 if (count != len && _PyString_Resize(&buf, count) < 0)
2163 return NULL;
2164 return buf;
2165}
2166
2167#endif /* USE_SSL */
2168
2169
Guido van Rossum30a685f1991-06-27 15:51:29 +00002170/* List of functions exported by this module. */
2171
Guido van Rossum73624e91994-10-10 17:59:00 +00002172static PyMethodDef PySocket_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002173 {"gethostbyname", PySocket_gethostbyname, 1, gethostbyname_doc},
2174 {"gethostbyname_ex", PySocket_gethostbyname_ex, 1, ghbn_ex_doc},
2175 {"gethostbyaddr", PySocket_gethostbyaddr, 1, gethostbyaddr_doc},
2176 {"gethostname", PySocket_gethostname, 1, gethostname_doc},
2177 {"getservbyname", PySocket_getservbyname, 1, getservbyname_doc},
2178 {"getprotobyname", PySocket_getprotobyname, 1,getprotobyname_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00002179 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002180#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00002181 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002182#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002183 {"ntohs", PySocket_ntohs, 1, ntohs_doc},
2184 {"ntohl", PySocket_ntohl, 1, ntohl_doc},
2185 {"htons", PySocket_htons, 1, htons_doc},
2186 {"htonl", PySocket_htonl, 1, htonl_doc},
2187 {"inet_aton", PySocket_inet_aton, 1, inet_aton_doc},
2188 {"inet_ntoa", PySocket_inet_ntoa, 1, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002189#ifdef USE_SSL
2190 {"ssl", PySocket_ssl, 1, ssl_doc},
2191#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002192 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002193};
2194
Guido van Rossum30a685f1991-06-27 15:51:29 +00002195
2196/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002197 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002198 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002199 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002200static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002201BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002202{
Guido van Rossum73624e91994-10-10 17:59:00 +00002203 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002204 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002205 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002206
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002207 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002208}
2209
Guido van Rossum30a685f1991-06-27 15:51:29 +00002210
Guido van Rossum8d665e61996-06-26 18:22:49 +00002211#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002212
2213/* Additional initialization and cleanup for NT/Windows */
2214
2215static void
2216NTcleanup()
2217{
2218 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002219}
2220
2221static int
2222NTinit()
2223{
2224 WSADATA WSAData;
2225 int ret;
2226 char buf[100];
2227 ret = WSAStartup(0x0101, &WSAData);
2228 switch (ret) {
2229 case 0: /* no error */
2230 atexit(NTcleanup);
2231 return 1;
2232 case WSASYSNOTREADY:
2233 PyErr_SetString(PyExc_ImportError,
2234 "WSAStartup failed: network not ready");
2235 break;
2236 case WSAVERNOTSUPPORTED:
2237 case WSAEINVAL:
2238 PyErr_SetString(PyExc_ImportError,
2239 "WSAStartup failed: requested version not supported");
2240 break;
2241 default:
2242 sprintf(buf, "WSAStartup failed: error code %d", ret);
2243 PyErr_SetString(PyExc_ImportError, buf);
2244 break;
2245 }
2246 return 0;
2247}
2248
Guido van Rossum8d665e61996-06-26 18:22:49 +00002249#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002250
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002251#if defined(PYOS_OS2)
2252
2253/* Additional initialization and cleanup for OS/2 */
2254
2255static void
2256OS2cleanup()
2257{
2258 /* No cleanup is necessary for OS/2 Sockets */
2259}
2260
2261static int
2262OS2init()
2263{
2264 char reason[64];
2265 int rc = sock_init();
2266
2267 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002268 atexit(OS2cleanup);
2269 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002270 }
2271
2272 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2273 PyErr_SetString(PyExc_ImportError, reason);
2274
Guido van Rossum32c575d1997-12-02 20:37:32 +00002275 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002276}
2277
2278#endif /* PYOS_OS2 */
2279
Guido van Rossum30a685f1991-06-27 15:51:29 +00002280/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002281 * This is called when the first 'import socket' is done,
2282 * via a table in config.c, if config.c is compiled with USE_SOCKET
2283 * defined.
2284 *
2285 * For MS_WINDOWS (which means any Windows variant), this module
2286 * is actually called "_socket", and there's a wrapper "socket.py"
2287 * which implements some missing functionality (such as makefile(),
2288 * dup() and fromfd()). The import of "_socket" may fail with an
2289 * ImportError exception if initialization of WINSOCK fails. When
2290 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2291 * scheduled to be made at exit time.
2292 *
2293 * For OS/2, this module is also called "_socket" and uses a wrapper
2294 * "socket.py" which implements that functionality that is missing
2295 * when PC operating systems don't put socket descriptors in the
2296 * operating system's filesystem layer.
2297 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002298
Guido van Rossum82a5c661998-07-07 20:45:43 +00002299static char module_doc[] =
2300"This module provides socket operations and some related functions.\n\
2301On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
2302On other systems, it only supports IP.\n\
2303\n\
2304Functions:\n\
2305\n\
2306socket() -- create a new socket object\n\
2307fromfd() -- create a socket object from an open file descriptor (*)\n\
2308gethostname() -- return the current hostname\n\
2309gethostbyname() -- map a hostname to its IP number\n\
2310gethostbyaddr() -- map an IP number or hostname to DNS info\n\
2311getservbyname() -- map a service name and a protocol name to a port number\n\
2312getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
2313ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
2314htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002315inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format\n\
2316inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)\n\
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002317ssl() -- secure socket layer support (only available if configured)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002318\n\
2319(*) not available on all platforms!)\n\
2320\n\
2321Special objects:\n\
2322\n\
2323SocketType -- type object for socket objects\n\
2324error -- exception raised for I/O errors\n\
2325\n\
2326Integer constants:\n\
2327\n\
2328AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
2329SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
2330\n\
2331Many other constants may be defined; these may be used in calls to\n\
2332the setsockopt() and getsockopt() methods.\n\
2333";
2334
2335static char sockettype_doc[] =
2336"A socket represents one endpoint of a network connection.\n\
2337\n\
2338Methods:\n\
2339\n\
2340accept() -- accept a connection, returning new socket and client address\n\
2341bind() -- bind the socket to a local address\n\
2342close() -- close the socket\n\
2343connect() -- connect the socket to a remote address\n\
2344connect_ex() -- connect, return an error code instead of an exception \n\
2345dup() -- return a new socket object identical to the current one (*)\n\
2346fileno() -- return underlying file descriptor\n\
2347getpeername() -- return remote address (*)\n\
2348getsockname() -- return local address\n\
2349getsockopt() -- get socket options\n\
2350listen() -- start listening for incoming connections\n\
2351makefile() -- return a file object corresponding tot the socket (*)\n\
2352recv() -- receive data\n\
2353recvfrom() -- receive data and sender's address\n\
2354send() -- send data\n\
2355sendto() -- send data to a given address\n\
2356setblocking() -- set or clear the blocking I/O flag\n\
2357setsockopt() -- set socket options\n\
2358shutdown() -- shut down traffic in one or both directions\n\
2359\n\
2360(*) not available on all platforms!)";
2361
Guido van Rossum3886bb61998-12-04 18:50:17 +00002362DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00002363#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002364init_socket()
2365#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002366initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00002367#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002368{
Guido van Rossum73624e91994-10-10 17:59:00 +00002369 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00002370#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002371 if (!NTinit())
2372 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002373 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002374#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002375#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002376 if (!OS2init())
2377 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002378 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002379#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00002380#if defined(__BEOS__)
2381 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
2382#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002383 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002384#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00002385#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00002386#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002387 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002388 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2389 if (PySocket_Error == NULL)
2390 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002391#ifdef USE_SSL
2392 SSL_load_error_strings();
2393 SSLeay_add_ssl_algorithms();
2394 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2395 if (SSLErrorObject == NULL)
2396 return;
2397 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2398 Py_INCREF(&SSL_Type);
2399 if (PyDict_SetItemString(d, "SSLType",
2400 (PyObject *)&SSL_Type) != 0)
2401 return;
2402#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002403 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002404 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002405 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002406 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002407 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002408 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002409 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002410
2411 /* Address families (we only support AF_INET and AF_UNIX) */
2412#ifdef AF_UNSPEC
2413 insint(d, "AF_UNSPEC", AF_UNSPEC);
2414#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002415 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002416#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002417 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002418#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002419#ifdef AF_AX25
2420 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2421#endif
2422#ifdef AF_IPX
2423 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2424#endif
2425#ifdef AF_APPLETALK
2426 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2427#endif
2428#ifdef AF_NETROM
2429 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2430#endif
2431#ifdef AF_BRIDGE
2432 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2433#endif
2434#ifdef AF_AAL5
2435 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2436#endif
2437#ifdef AF_X25
2438 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2439#endif
2440#ifdef AF_INET6
2441 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2442#endif
2443#ifdef AF_ROSE
2444 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2445#endif
2446
2447 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002448 insint(d, "SOCK_STREAM", SOCK_STREAM);
2449 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002450#ifndef __BEOS__
2451/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002452 insint(d, "SOCK_RAW", SOCK_RAW);
2453 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2454 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002455#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002456
2457#ifdef SO_DEBUG
2458 insint(d, "SO_DEBUG", SO_DEBUG);
2459#endif
2460#ifdef SO_ACCEPTCONN
2461 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2462#endif
2463#ifdef SO_REUSEADDR
2464 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2465#endif
2466#ifdef SO_KEEPALIVE
2467 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2468#endif
2469#ifdef SO_DONTROUTE
2470 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2471#endif
2472#ifdef SO_BROADCAST
2473 insint(d, "SO_BROADCAST", SO_BROADCAST);
2474#endif
2475#ifdef SO_USELOOPBACK
2476 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2477#endif
2478#ifdef SO_LINGER
2479 insint(d, "SO_LINGER", SO_LINGER);
2480#endif
2481#ifdef SO_OOBINLINE
2482 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2483#endif
2484#ifdef SO_REUSEPORT
2485 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2486#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002487#ifdef SO_SNDBUF
2488 insint(d, "SO_SNDBUF", SO_SNDBUF);
2489#endif
2490#ifdef SO_RCVBUF
2491 insint(d, "SO_RCVBUF", SO_RCVBUF);
2492#endif
2493#ifdef SO_SNDLOWAT
2494 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2495#endif
2496#ifdef SO_RCVLOWAT
2497 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2498#endif
2499#ifdef SO_SNDTIMEO
2500 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2501#endif
2502#ifdef SO_RCVTIMEO
2503 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2504#endif
2505#ifdef SO_ERROR
2506 insint(d, "SO_ERROR", SO_ERROR);
2507#endif
2508#ifdef SO_TYPE
2509 insint(d, "SO_TYPE", SO_TYPE);
2510#endif
2511
2512 /* Maximum number of connections for "listen" */
2513#ifdef SOMAXCONN
2514 insint(d, "SOMAXCONN", SOMAXCONN);
2515#else
2516 insint(d, "SOMAXCONN", 5); /* Common value */
2517#endif
2518
2519 /* Flags for send, recv */
2520#ifdef MSG_OOB
2521 insint(d, "MSG_OOB", MSG_OOB);
2522#endif
2523#ifdef MSG_PEEK
2524 insint(d, "MSG_PEEK", MSG_PEEK);
2525#endif
2526#ifdef MSG_DONTROUTE
2527 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2528#endif
2529#ifdef MSG_EOR
2530 insint(d, "MSG_EOR", MSG_EOR);
2531#endif
2532#ifdef MSG_TRUNC
2533 insint(d, "MSG_TRUNC", MSG_TRUNC);
2534#endif
2535#ifdef MSG_CTRUNC
2536 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2537#endif
2538#ifdef MSG_WAITALL
2539 insint(d, "MSG_WAITALL", MSG_WAITALL);
2540#endif
2541#ifdef MSG_BTAG
2542 insint(d, "MSG_BTAG", MSG_BTAG);
2543#endif
2544#ifdef MSG_ETAG
2545 insint(d, "MSG_ETAG", MSG_ETAG);
2546#endif
2547
2548 /* Protocol level and numbers, usable for [gs]etsockopt */
2549#ifdef SOL_SOCKET
2550 insint(d, "SOL_SOCKET", SOL_SOCKET);
2551#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002552#ifdef SOL_IP
2553 insint(d, "SOL_IP", SOL_IP);
2554#else
2555 insint(d, "SOL_IP", 0);
2556#endif
2557#ifdef SOL_IPX
2558 insint(d, "SOL_IPX", SOL_IPX);
2559#endif
2560#ifdef SOL_AX25
2561 insint(d, "SOL_AX25", SOL_AX25);
2562#endif
2563#ifdef SOL_ATALK
2564 insint(d, "SOL_ATALK", SOL_ATALK);
2565#endif
2566#ifdef SOL_NETROM
2567 insint(d, "SOL_NETROM", SOL_NETROM);
2568#endif
2569#ifdef SOL_ROSE
2570 insint(d, "SOL_ROSE", SOL_ROSE);
2571#endif
2572#ifdef SOL_TCP
2573 insint(d, "SOL_TCP", SOL_TCP);
2574#else
2575 insint(d, "SOL_TCP", 6);
2576#endif
2577#ifdef SOL_UDP
2578 insint(d, "SOL_UDP", SOL_UDP);
2579#else
2580 insint(d, "SOL_UDP", 17);
2581#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002582#ifdef IPPROTO_IP
2583 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002584#else
2585 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002586#endif
2587#ifdef IPPROTO_ICMP
2588 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002589#else
2590 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002591#endif
2592#ifdef IPPROTO_IGMP
2593 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2594#endif
2595#ifdef IPPROTO_GGP
2596 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2597#endif
2598#ifdef IPPROTO_TCP
2599 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002600#else
2601 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002602#endif
2603#ifdef IPPROTO_EGP
2604 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2605#endif
2606#ifdef IPPROTO_PUP
2607 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2608#endif
2609#ifdef IPPROTO_UDP
2610 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002611#else
2612 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002613#endif
2614#ifdef IPPROTO_IDP
2615 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2616#endif
2617#ifdef IPPROTO_HELLO
2618 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2619#endif
2620#ifdef IPPROTO_ND
2621 insint(d, "IPPROTO_ND", IPPROTO_ND);
2622#endif
2623#ifdef IPPROTO_TP
2624 insint(d, "IPPROTO_TP", IPPROTO_TP);
2625#endif
2626#ifdef IPPROTO_XTP
2627 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2628#endif
2629#ifdef IPPROTO_EON
2630 insint(d, "IPPROTO_EON", IPPROTO_EON);
2631#endif
2632#ifdef IPPROTO_BIP
2633 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2634#endif
2635/**/
2636#ifdef IPPROTO_RAW
2637 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002638#else
2639 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002640#endif
2641#ifdef IPPROTO_MAX
2642 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2643#endif
2644
2645 /* Some port configuration */
2646#ifdef IPPORT_RESERVED
2647 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2648#else
2649 insint(d, "IPPORT_RESERVED", 1024);
2650#endif
2651#ifdef IPPORT_USERRESERVED
2652 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2653#else
2654 insint(d, "IPPORT_USERRESERVED", 5000);
2655#endif
2656
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002657 /* Some reserved IP v.4 addresses */
2658#ifdef INADDR_ANY
2659 insint(d, "INADDR_ANY", INADDR_ANY);
2660#else
2661 insint(d, "INADDR_ANY", 0x00000000);
2662#endif
2663#ifdef INADDR_BROADCAST
2664 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2665#else
2666 insint(d, "INADDR_BROADCAST", 0xffffffff);
2667#endif
2668#ifdef INADDR_LOOPBACK
2669 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2670#else
2671 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2672#endif
2673#ifdef INADDR_UNSPEC_GROUP
2674 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2675#else
2676 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2677#endif
2678#ifdef INADDR_ALLHOSTS_GROUP
2679 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2680#else
2681 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2682#endif
2683#ifdef INADDR_MAX_LOCAL_GROUP
2684 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2685#else
2686 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2687#endif
2688#ifdef INADDR_NONE
2689 insint(d, "INADDR_NONE", INADDR_NONE);
2690#else
2691 insint(d, "INADDR_NONE", 0xffffffff);
2692#endif
2693
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002694 /* IP [gs]etsockopt options */
2695#ifdef IP_OPTIONS
2696 insint(d, "IP_OPTIONS", IP_OPTIONS);
2697#endif
2698#ifdef IP_HDRINCL
2699 insint(d, "IP_HDRINCL", IP_HDRINCL);
2700#endif
2701#ifdef IP_TOS
2702 insint(d, "IP_TOS", IP_TOS);
2703#endif
2704#ifdef IP_TTL
2705 insint(d, "IP_TTL", IP_TTL);
2706#endif
2707#ifdef IP_RECVOPTS
2708 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2709#endif
2710#ifdef IP_RECVRETOPTS
2711 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2712#endif
2713#ifdef IP_RECVDSTADDR
2714 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2715#endif
2716#ifdef IP_RETOPTS
2717 insint(d, "IP_RETOPTS", IP_RETOPTS);
2718#endif
2719#ifdef IP_MULTICAST_IF
2720 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2721#endif
2722#ifdef IP_MULTICAST_TTL
2723 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2724#endif
2725#ifdef IP_MULTICAST_LOOP
2726 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2727#endif
2728#ifdef IP_ADD_MEMBERSHIP
2729 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2730#endif
2731#ifdef IP_DROP_MEMBERSHIP
2732 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2733#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002734#ifdef IP_DEFAULT_MULTICAST_TTL
2735 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2736#endif
2737#ifdef IP_DEFAULT_MULTICAST_LOOP
2738 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2739#endif
2740#ifdef IP_MAX_MEMBERSHIPS
2741 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2742#endif
2743
2744 /* TCP options */
2745#ifdef TCP_NODELAY
2746 insint(d, "TCP_NODELAY", TCP_NODELAY);
2747#endif
2748#ifdef TCP_MAXSEG
2749 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2750#endif
2751
2752 /* IPX options */
2753#ifdef IPX_TYPE
2754 insint(d, "IPX_TYPE", IPX_TYPE);
2755#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002756
2757 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002758#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002759 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002760#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002761}