blob: f23a3bee0a112efed6288df6efd364c813e8083c [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 Rossum1b6e4631999-11-04 18:22:29 +0000175#ifndef macintosh
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
Jack Jansen508537b1996-02-14 15:57:45 +0000195#ifdef USE_GUSI
196/* 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];
667 int addrlen, newfd;
Barry Warsaw752300b1997-01-03 17:18:10 +0000668 PyObject *sock = NULL;
669 PyObject *addr = NULL;
670 PyObject *res = NULL;
671
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000672 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000673 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000674 if (!getsockaddrlen(s, &addrlen))
675 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000676 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000677 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000678 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000679 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000680 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000681
Guido van Rossum30a685f1991-06-27 15:51:29 +0000682 /* Create the new object with unspecified family,
683 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000684 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000685 s->sock_family,
686 s->sock_type,
687 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000688 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000689 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000690 goto finally;
691 }
692 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
693 goto finally;
694
695 if (!(res = Py_BuildValue("OO", sock, addr)))
696 goto finally;
697
698 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000699 Py_XDECREF(sock);
700 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000701 return res;
702}
703
Guido van Rossum82a5c661998-07-07 20:45:43 +0000704static char accept_doc[] =
705"accept() -> (socket object, address info)\n\
706\n\
707Wait for an incoming connection. Return a new socket representing the\n\
708connection, and the address of the client. For IP sockets, the address\n\
709info is a pair (hostaddr, port).";
710
Guido van Rossum30a685f1991-06-27 15:51:29 +0000711
Guido van Rossume4485b01994-09-07 14:32:49 +0000712/* s.setblocking(1 | 0) method */
713
Guido van Rossum73624e91994-10-10 17:59:00 +0000714static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000715BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000716{
717 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000718#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000719 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000720#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000721 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000722 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000723 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000724#ifdef __BEOS__
725 block = !block;
726 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
727 (void *)(&block), sizeof( int ) );
728#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000729#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000730#ifdef PYOS_OS2
731 block = !block;
732 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
733#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000734 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
735 if (block)
736 delay_flag &= (~O_NDELAY);
737 else
738 delay_flag |= O_NDELAY;
739 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000740#endif /* !PYOS_OS2 */
741#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000742 block = !block;
743 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000744#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000745#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000746 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000747
Guido van Rossum73624e91994-10-10 17:59:00 +0000748 Py_INCREF(Py_None);
749 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000750}
Guido van Rossume4485b01994-09-07 14:32:49 +0000751
Guido van Rossum82a5c661998-07-07 20:45:43 +0000752static char setblocking_doc[] =
753"setblocking(flag)\n\
754\n\
755Set the socket to blocking (flag is true) or non-blocking (false).\n\
756This uses the FIONBIO ioctl with the O_NDELAY flag.";
757
Guido van Rossume4485b01994-09-07 14:32:49 +0000758
Guido van Rossumaee08791992-09-08 09:05:33 +0000759/* s.setsockopt() method.
760 With an integer third argument, sets an integer option.
761 With a string third argument, sets an option from a buffer;
762 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000763
Guido van Rossum73624e91994-10-10 17:59:00 +0000764static PyObject *
765BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000766{
767 int level;
768 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000769 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000770 char *buf;
771 int buflen;
772 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000773
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000774 if (PyArg_ParseTuple(args, "iii:setsockopt",
775 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000776 buf = (char *) &flag;
777 buflen = sizeof flag;
778 }
779 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000780 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000781 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
782 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000783 return NULL;
784 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000785 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000786 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000787 return PySocket_Err();
788 Py_INCREF(Py_None);
789 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000790}
791
Guido van Rossum82a5c661998-07-07 20:45:43 +0000792static char setsockopt_doc[] =
793"setsockopt(level, option, value)\n\
794\n\
795Set a socket option. See the Unix manual for level and option.\n\
796The value argument can either be an integer or a string.";
797
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000798
Guido van Rossumaee08791992-09-08 09:05:33 +0000799/* s.getsockopt() method.
800 With two arguments, retrieves an integer option.
801 With a third integer argument, retrieves a string buffer of that size;
802 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000803
Guido van Rossum73624e91994-10-10 17:59:00 +0000804static PyObject *
805BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000806{
807 int level;
808 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000809 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000810 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000811 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000812
Guido van Rossumbcc20741998-08-04 22:53:56 +0000813#ifdef __BEOS__
814/* We have incomplete socket support. */
815 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
816 return NULL;
817#else
818
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000819 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
820 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000821 return NULL;
822
823 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000824 int flag = 0;
825 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000826 res = getsockopt(s->sock_fd, level, optname,
827 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000828 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000829 return PySocket_Err();
830 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000831 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000832 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000833 PyErr_SetString(PySocket_Error,
834 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000835 return NULL;
836 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000837 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000838 if (buf == NULL)
839 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000840 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000841 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000842 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000843 Py_DECREF(buf);
844 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000845 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000846 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000847 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000848#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000849}
850
Guido van Rossum82a5c661998-07-07 20:45:43 +0000851static char getsockopt_doc[] =
852"getsockopt(level, option[, buffersize]) -> value\n\
853\n\
854Get a socket option. See the Unix manual for level and option.\n\
855If a nonzero buffersize argument is given, the return value is a\n\
856string of that length; otherwise it is an integer.";
857
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000858
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000859/* s.bind(sockaddr...) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000860
Guido van Rossum73624e91994-10-10 17:59:00 +0000861static PyObject *
862BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000863{
864 struct sockaddr *addr;
865 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000866 int res;
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000867 if (!getsockaddrarg(s, args, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000868 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000869 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000870 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000871 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000872 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000873 return PySocket_Err();
874 Py_INCREF(Py_None);
875 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000876}
877
Guido van Rossum82a5c661998-07-07 20:45:43 +0000878static char bind_doc[] =
879"bind(address)\n\
880\n\
881Bind the socket to a local address. For IP sockets, the address is a\n\
882pair (host, port); the host must refer to the local host.";
883
Guido van Rossum30a685f1991-06-27 15:51:29 +0000884
885/* s.close() method.
886 Set the file descriptor to -1 so operations tried subsequently
887 will surely fail. */
888
Guido van Rossum73624e91994-10-10 17:59:00 +0000889static PyObject *
890BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000891{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000892 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000893 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000894 if (s->sock_fd != -1) {
895 Py_BEGIN_ALLOW_THREADS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000896 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum08481461996-10-12 14:07:22 +0000897 Py_END_ALLOW_THREADS
898 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000899 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000900 Py_INCREF(Py_None);
901 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000902}
903
Guido van Rossum82a5c661998-07-07 20:45:43 +0000904static char close_doc[] =
905"close()\n\
906\n\
907Close the socket. It cannot be used after this call.";
908
Guido van Rossum30a685f1991-06-27 15:51:29 +0000909
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000910/* s.connect(sockaddr...) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000911
Guido van Rossum73624e91994-10-10 17:59:00 +0000912static PyObject *
913BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000914{
915 struct sockaddr *addr;
916 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000917 int res;
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000918 if (!getsockaddrarg(s, args, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000919 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000920 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000921 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000922 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000923 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000924 return PySocket_Err();
925 Py_INCREF(Py_None);
926 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000927}
928
Guido van Rossum82a5c661998-07-07 20:45:43 +0000929static char connect_doc[] =
930"connect(address)\n\
931\n\
932Connect the socket to a remote address. For IP sockets, the address\n\
933is a pair (host, port).";
934
Guido van Rossum30a685f1991-06-27 15:51:29 +0000935
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000936/* s.connect_ex(sockaddr...) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000937
938static PyObject *
939BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
940{
941 struct sockaddr *addr;
942 int addrlen;
943 int res;
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000944 if (!getsockaddrarg(s, args, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000945 return NULL;
946 Py_BEGIN_ALLOW_THREADS
947 res = connect(s->sock_fd, addr, addrlen);
948 Py_END_ALLOW_THREADS
949 if (res != 0)
950 res = errno;
951 return PyInt_FromLong((long) res);
952}
953
Guido van Rossum82a5c661998-07-07 20:45:43 +0000954static char connect_ex_doc[] =
955"connect_ex(address)\n\
956\n\
957This is like connect(address), but returns an error code (the errno value)\n\
958instead of raising an exception when an error occurs.";
959
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000960
Guido van Rossumed233a51992-06-23 09:07:03 +0000961/* s.fileno() method */
962
Guido van Rossum73624e91994-10-10 17:59:00 +0000963static PyObject *
964BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000965{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000966 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +0000967 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000968 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000969}
970
Guido van Rossum82a5c661998-07-07 20:45:43 +0000971static char fileno_doc[] =
972"fileno() -> integer\n\
973\n\
974Return the integer file descriptor of the socket.";
975
Guido van Rossumed233a51992-06-23 09:07:03 +0000976
Guido van Rossumbe32c891996-06-20 16:25:29 +0000977#ifndef NO_DUP
978/* s.dup() method */
979
980static PyObject *
981BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
982{
983 int newfd;
984 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000985 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000986 return NULL;
987 newfd = dup(s->sock_fd);
988 if (newfd < 0)
989 return PySocket_Err();
990 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000991 s->sock_family,
992 s->sock_type,
993 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000994 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000995 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000996 return sock;
997}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000998
999static char dup_doc[] =
1000"dup() -> socket object\n\
1001\n\
1002Return a new socket object connected to the same system resource.";
1003
Guido van Rossumbe32c891996-06-20 16:25:29 +00001004#endif
1005
1006
Guido van Rossumc89705d1992-11-26 08:54:07 +00001007/* s.getsockname() method */
1008
Guido van Rossum73624e91994-10-10 17:59:00 +00001009static PyObject *
1010BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001011{
1012 char addrbuf[256];
1013 int addrlen, res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001014 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001015 return NULL;
1016 if (!getsockaddrlen(s, &addrlen))
1017 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001018 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001019 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001020 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001021 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001022 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001023 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001024 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1025}
1026
Guido van Rossum82a5c661998-07-07 20:45:43 +00001027static char getsockname_doc[] =
1028"getsockname() -> address info\n\
1029\n\
1030Return the address of the local endpoint. For IP sockets, the address\n\
1031info is a pair (hostaddr, port).";
1032
Guido van Rossumc89705d1992-11-26 08:54:07 +00001033
Guido van Rossumb6775db1994-08-01 11:34:53 +00001034#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001035/* s.getpeername() method */
1036
Guido van Rossum73624e91994-10-10 17:59:00 +00001037static PyObject *
1038BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001039{
1040 char addrbuf[256];
1041 int addrlen, res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001042 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001043 return NULL;
1044 if (!getsockaddrlen(s, &addrlen))
1045 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001046 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001047 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001048 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001049 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001050 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001051 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1052}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001053
1054static char getpeername_doc[] =
1055"getpeername() -> address info\n\
1056\n\
1057Return the address of the remote endpoint. For IP sockets, the address\n\
1058info is a pair (hostaddr, port).";
1059
Guido van Rossumb6775db1994-08-01 11:34:53 +00001060#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001061
1062
Guido van Rossum30a685f1991-06-27 15:51:29 +00001063/* s.listen(n) method */
1064
Guido van Rossum73624e91994-10-10 17:59:00 +00001065static PyObject *
1066BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001067{
1068 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001069 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001070 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001071 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001072 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001073 if (backlog < 1)
1074 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001075 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001076 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001077 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001078 return PySocket_Err();
1079 Py_INCREF(Py_None);
1080 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001081}
1082
Guido van Rossum82a5c661998-07-07 20:45:43 +00001083static char listen_doc[] =
1084"listen(backlog)\n\
1085\n\
1086Enable a server to accept connections. The backlog argument must be at\n\
1087least 1; it specifies the number of unaccepted connection that the system\n\
1088will allow before refusing new connections.";
1089
1090
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001091#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001092/* s.makefile(mode) method.
1093 Create a new open file object referring to a dupped version of
1094 the socket's file descriptor. (The dup() call is necessary so
1095 that the open file and socket objects may be closed independent
1096 of each other.)
1097 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1098
Guido van Rossum73624e91994-10-10 17:59:00 +00001099static PyObject *
1100BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001101{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001102 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +00001103 char *mode = "r";
1104 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001105 int fd;
1106 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001107 PyObject *f;
1108
Guido van Rossum43713e52000-02-29 13:59:29 +00001109 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001110 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001111#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001112 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1113 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001114#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001115 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001116#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001117 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001118 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001119 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001120 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001121 }
1122 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1123 if (f != NULL)
1124 PyFile_SetBufSize(f, bufsize);
1125 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001126}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001127
1128static char makefile_doc[] =
1129"makefile([mode[, buffersize]]) -> file object\n\
1130\n\
1131Return a regular file object corresponding to the socket.\n\
1132The mode and buffersize arguments are as for the built-in open() function.";
1133
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001134#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001135
Guido van Rossum82a5c661998-07-07 20:45:43 +00001136
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001137/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001138
Guido van Rossum73624e91994-10-10 17:59:00 +00001139static PyObject *
1140BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001141{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001142 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001143 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001144 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001145 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001146 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001147 if (buf == NULL)
1148 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001149 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001150 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001151 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001152 if (n < 0) {
1153 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001154 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001155 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001156 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001157 return NULL;
1158 return buf;
1159}
1160
Guido van Rossum82a5c661998-07-07 20:45:43 +00001161static char recv_doc[] =
1162"recv(buffersize[, flags]) -> data\n\
1163\n\
1164Receive up to buffersize bytes from the socket. For the optional flags\n\
1165argument, see the Unix manual. When no data is available, block until\n\
1166at least one byte is available or until the remote end is closed. When\n\
1167the remote end is closed and all data is read, return the empty string.";
1168
Guido van Rossum30a685f1991-06-27 15:51:29 +00001169
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001170/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001171
Guido van Rossum73624e91994-10-10 17:59:00 +00001172static PyObject *
1173BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001174{
1175 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001176 PyObject *buf = NULL;
1177 PyObject *addr = NULL;
1178 PyObject *ret = NULL;
1179
Guido van Rossumbe32c891996-06-20 16:25:29 +00001180 int addrlen, len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001181 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001182 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001183 if (!getsockaddrlen(s, &addrlen))
1184 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001185 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001186 if (buf == NULL)
1187 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001188 Py_BEGIN_ALLOW_THREADS
1189 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001190#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001191#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001192 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001193#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001194 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001195#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001196#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001197 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001198#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001199 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001200 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001201 if (n < 0) {
1202 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001203 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001204 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001205 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001206 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001207
1208 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1209 goto finally;
1210
Guido van Rossum73624e91994-10-10 17:59:00 +00001211 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001212 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001213 Py_XDECREF(addr);
1214 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001215 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001216}
1217
Guido van Rossum82a5c661998-07-07 20:45:43 +00001218static char recvfrom_doc[] =
1219"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1220\n\
1221Like recv(buffersize, flags) but also return the sender's address info.";
1222
Guido van Rossum30a685f1991-06-27 15:51:29 +00001223
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001224/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001225
Guido van Rossum73624e91994-10-10 17:59:00 +00001226static PyObject *
1227BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001228{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001229 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001230 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001231 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001232 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001233 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001234 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001235 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001236 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001237 return PySocket_Err();
1238 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001239}
1240
Guido van Rossum82a5c661998-07-07 20:45:43 +00001241static char send_doc[] =
1242"send(data[, flags])\n\
1243\n\
1244Send a data string to the socket. For the optional flags\n\
1245argument, see the Unix manual.";
1246
Guido van Rossum30a685f1991-06-27 15:51:29 +00001247
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001248/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001249
Guido van Rossum73624e91994-10-10 17:59:00 +00001250static PyObject *
1251BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001252{
Guido van Rossum73624e91994-10-10 17:59:00 +00001253 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001254 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001255 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001256 int addrlen, len, n, flags;
1257 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001258 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001259 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001260 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1261 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001262 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001263 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001264 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001265 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001266 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001267 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001268 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001269 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001270 return PySocket_Err();
1271 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001272}
1273
Guido van Rossum82a5c661998-07-07 20:45:43 +00001274static char sendto_doc[] =
1275"sendto(data[, flags], address)\n\
1276\n\
1277Like send(data, flags) but allows specifying the destination address.\n\
1278For IP sockets, the address is a pair (hostaddr, port).";
1279
Guido van Rossum30a685f1991-06-27 15:51:29 +00001280
1281/* s.shutdown(how) method */
1282
Guido van Rossum73624e91994-10-10 17:59:00 +00001283static PyObject *
1284BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001285{
1286 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001287 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001288 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001289 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001290 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001291 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001292 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001293 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001294 return PySocket_Err();
1295 Py_INCREF(Py_None);
1296 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001297}
1298
Guido van Rossum82a5c661998-07-07 20:45:43 +00001299static char shutdown_doc[] =
1300"shutdown(flag)\n\
1301\n\
1302Shut down the reading side of the socket (flag == 0), the writing side\n\
1303of the socket (flag == 1), or both ends (flag == 2).";
1304
Guido van Rossum30a685f1991-06-27 15:51:29 +00001305
1306/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001307
Guido van Rossum73624e91994-10-10 17:59:00 +00001308static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001309 {"accept", (PyCFunction)PySocketSock_accept, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001310 accept_doc},
Guido van Rossum527c9bd2000-04-04 14:10:20 +00001311 {"bind", (PyCFunction)PySocketSock_bind, 0,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001312 bind_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001313 {"close", (PyCFunction)PySocketSock_close, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001314 close_doc},
Guido van Rossum527c9bd2000-04-04 14:10:20 +00001315 {"connect", (PyCFunction)PySocketSock_connect, 0,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001316 connect_doc},
Guido van Rossum527c9bd2000-04-04 14:10:20 +00001317 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 0,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001318 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001319#ifndef NO_DUP
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001320 {"dup", (PyCFunction)PySocketSock_dup, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001321 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001322#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001323 {"fileno", (PyCFunction)PySocketSock_fileno, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001324 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001325#ifdef HAVE_GETPEERNAME
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001326 {"getpeername", (PyCFunction)PySocketSock_getpeername, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001327 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001328#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001329 {"getsockname", (PyCFunction)PySocketSock_getsockname, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001330 getsockname_doc},
1331 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1332 getsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001333 {"listen", (PyCFunction)PySocketSock_listen, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001334 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001335#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001336 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1337 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001338#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001339 {"recv", (PyCFunction)PySocketSock_recv, 1,
1340 recv_doc},
1341 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1342 recvfrom_doc},
1343 {"send", (PyCFunction)PySocketSock_send, 1,
1344 send_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001345 {"sendto", (PyCFunction)PySocketSock_sendto, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001346 sendto_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001347 {"setblocking", (PyCFunction)PySocketSock_setblocking, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001348 setblocking_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001349 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001350 setsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001351 {"shutdown", (PyCFunction)PySocketSock_shutdown, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001352 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001353 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001354};
1355
Guido van Rossum30a685f1991-06-27 15:51:29 +00001356
Guido van Rossum73624e91994-10-10 17:59:00 +00001357/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001358 First close the file description. */
1359
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001360static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001361BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001362{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001363 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001364 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001365 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001366}
1367
Guido van Rossum30a685f1991-06-27 15:51:29 +00001368
1369/* Return a socket object's named attribute. */
1370
Guido van Rossum73624e91994-10-10 17:59:00 +00001371static PyObject *
1372BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001373{
Guido van Rossum73624e91994-10-10 17:59:00 +00001374 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001375}
1376
Guido van Rossum30a685f1991-06-27 15:51:29 +00001377
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001378static PyObject *
1379BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1380{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001381 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001382 sprintf(buf,
1383 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1384 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001385 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001386}
1387
1388
Guido van Rossumb6775db1994-08-01 11:34:53 +00001389/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001390
Guido van Rossum73624e91994-10-10 17:59:00 +00001391static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001392 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001393 0,
1394 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001395 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001396 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001397 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001398 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001399 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001400 0, /*tp_setattr*/
1401 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001402 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001403 0, /*tp_as_number*/
1404 0, /*tp_as_sequence*/
1405 0, /*tp_as_mapping*/
1406};
1407
Guido van Rossum30a685f1991-06-27 15:51:29 +00001408
Guido van Rossum81194471991-07-27 21:42:02 +00001409/* Python interface to gethostname(). */
1410
1411/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001412static PyObject *
1413BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001414{
1415 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001416 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001417 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001418 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001419 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001420 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001421 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001422 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001423 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001424 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001425 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001426}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001427
Guido van Rossum82a5c661998-07-07 20:45:43 +00001428static char gethostname_doc[] =
1429"gethostname() -> string\n\
1430\n\
1431Return the current host name.";
1432
Guido van Rossumff4949e1992-08-05 19:58:53 +00001433
Guido van Rossum30a685f1991-06-27 15:51:29 +00001434/* Python interface to gethostbyname(name). */
1435
1436/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001437static PyObject *
1438BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001439{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001440 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001441 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001442 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001443 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001444 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001445 return NULL;
1446 return makeipaddr(&addrbuf);
1447}
1448
Guido van Rossum82a5c661998-07-07 20:45:43 +00001449static char gethostbyname_doc[] =
1450"gethostbyname(host) -> address\n\
1451\n\
1452Return the IP address (a string of the form '255.255.255.255') for a host.";
1453
1454
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001455/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1456
1457static PyObject *
1458gethost_common(h, addr)
1459 struct hostent *h;
1460 struct sockaddr_in *addr;
1461{
1462 char **pch;
1463 PyObject *rtn_tuple = (PyObject *)NULL;
1464 PyObject *name_list = (PyObject *)NULL;
1465 PyObject *addr_list = (PyObject *)NULL;
1466 PyObject *tmp;
1467 if (h == NULL) {
1468#ifdef HAVE_HSTRERROR
1469 /* Let's get real error message to return */
1470 extern int h_errno;
1471 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1472#else
1473 PyErr_SetString(PySocket_Error, "host not found");
1474#endif
1475 return NULL;
1476 }
1477 if ((name_list = PyList_New(0)) == NULL)
1478 goto err;
1479 if ((addr_list = PyList_New(0)) == NULL)
1480 goto err;
1481 for (pch = h->h_aliases; *pch != NULL; pch++) {
1482 int status;
1483 tmp = PyString_FromString(*pch);
1484 if (tmp == NULL)
1485 goto err;
1486 status = PyList_Append(name_list, tmp);
1487 Py_DECREF(tmp);
1488 if (status)
1489 goto err;
1490 }
1491 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1492 int status;
1493 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1494 tmp = makeipaddr(addr);
1495 if (tmp == NULL)
1496 goto err;
1497 status = PyList_Append(addr_list, tmp);
1498 Py_DECREF(tmp);
1499 if (status)
1500 goto err;
1501 }
1502 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1503 err:
1504 Py_XDECREF(name_list);
1505 Py_XDECREF(addr_list);
1506 return rtn_tuple;
1507}
1508
1509
1510/* Python interface to gethostbyname_ex(name). */
1511
1512/*ARGSUSED*/
1513static PyObject *
1514BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1515{
1516 char *name;
1517 struct hostent *h;
1518 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001519 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001520#ifdef HAVE_GETHOSTBYNAME_R
1521 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001522#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1523 struct hostent_data data;
1524#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001525 char buf[16384];
1526 int buf_len = (sizeof buf) - 1;
1527 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001528#endif
1529#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001530 int result;
1531#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001532#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001533 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001534 return NULL;
1535 if (setipaddr(name, &addr) < 0)
1536 return NULL;
1537 Py_BEGIN_ALLOW_THREADS
1538#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001539#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001540 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001541#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001542 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001543#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001544 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001545 result = gethostbyname_r(name, &hp_allocated, &data);
1546 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001547#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001548#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001549#ifdef USE_GETHOSTBYNAME_LOCK
1550 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001551#endif
1552 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001553#endif /* HAVE_GETHOSTBYNAME_R */
1554 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001555 ret = gethost_common(h, &addr);
1556#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001557 PyThread_release_lock(gethostbyname_lock);
1558#endif
1559 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001560}
1561
1562static char ghbn_ex_doc[] =
1563"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1564\n\
1565Return the true host name, a list of aliases, and a list of IP addresses,\n\
1566for a host. The host argument is a string giving a host name or IP number.";
1567
1568
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001569/* Python interface to gethostbyaddr(IP). */
1570
1571/*ARGSUSED*/
1572static PyObject *
1573BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1574{
1575 struct sockaddr_in addr;
1576 char *ip_num;
1577 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001578 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001579#ifdef HAVE_GETHOSTBYNAME_R
1580 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001581#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1582 struct hostent_data data;
1583#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001584 char buf[16384];
1585 int buf_len = (sizeof buf) - 1;
1586 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001587#endif
1588#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001589 int result;
1590#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001591#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001592
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001593 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001594 return NULL;
1595 if (setipaddr(ip_num, &addr) < 0)
1596 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001597 Py_BEGIN_ALLOW_THREADS
1598#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001599#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001600 result = gethostbyaddr_r((char *)&addr.sin_addr,
1601 sizeof(addr.sin_addr),
1602 AF_INET, &hp_allocated, buf, buf_len,
1603 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001604#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001605 h = gethostbyaddr_r((char *)&addr.sin_addr,
1606 sizeof(addr.sin_addr),
1607 AF_INET,
1608 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001609#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001610 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001611 result = gethostbyaddr_r((char *)&addr.sin_addr,
1612 sizeof(addr.sin_addr),
1613 AF_INET, &hp_allocated, &data);
1614 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001615#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001616#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001617#ifdef USE_GETHOSTBYNAME_LOCK
1618 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001619#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001620 h = gethostbyaddr((char *)&addr.sin_addr,
1621 sizeof(addr.sin_addr),
1622 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001623#endif /* HAVE_GETHOSTBYNAME_R */
1624 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001625 ret = gethost_common(h, &addr);
1626#ifdef USE_GETHOSTBYNAME_LOCK
1627 PyThread_release_lock(gethostbyname_lock);
1628#endif
1629 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001630}
1631
Guido van Rossum82a5c661998-07-07 20:45:43 +00001632static char gethostbyaddr_doc[] =
1633"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1634\n\
1635Return the true host name, a list of aliases, and a list of IP addresses,\n\
1636for a host. The host argument is a string giving a host name or IP number.";
1637
Guido van Rossum30a685f1991-06-27 15:51:29 +00001638
1639/* Python interface to getservbyname(name).
1640 This only returns the port number, since the other info is already
1641 known or not useful (like the list of aliases). */
1642
1643/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001644static PyObject *
1645BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001646{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001647 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001648 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001649 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001650 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001651 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001652 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001653 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001654 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001655 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001656 return NULL;
1657 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001658 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001659}
1660
Guido van Rossum82a5c661998-07-07 20:45:43 +00001661static char getservbyname_doc[] =
1662"getservbyname(servicename, protocolname) -> integer\n\
1663\n\
1664Return a port number from a service name and protocol name.\n\
1665The protocol name should be 'tcp' or 'udp'.";
1666
Guido van Rossum30a685f1991-06-27 15:51:29 +00001667
Guido van Rossum3901d851996-12-19 16:35:04 +00001668/* Python interface to getprotobyname(name).
1669 This only returns the protocol number, since the other info is
1670 already known or not useful (like the list of aliases). */
1671
1672/*ARGSUSED*/
1673static PyObject *
1674BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1675{
1676 char *name;
1677 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001678#ifdef __BEOS__
1679/* Not available in BeOS yet. - [cjh] */
1680 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1681 return NULL;
1682#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001683 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001684 return NULL;
1685 Py_BEGIN_ALLOW_THREADS
1686 sp = getprotobyname(name);
1687 Py_END_ALLOW_THREADS
1688 if (sp == NULL) {
1689 PyErr_SetString(PySocket_Error, "protocol not found");
1690 return NULL;
1691 }
1692 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001693#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001694}
1695
Guido van Rossum82a5c661998-07-07 20:45:43 +00001696static char getprotobyname_doc[] =
1697"getprotobyname(name) -> integer\n\
1698\n\
1699Return the protocol number for the named protocol. (Rarely used.)";
1700
Guido van Rossum3901d851996-12-19 16:35:04 +00001701
Guido van Rossum30a685f1991-06-27 15:51:29 +00001702/* Python interface to socket(family, type, proto).
1703 The third (protocol) argument is optional.
1704 Return a new socket object. */
1705
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001706/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001707static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001708BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001709{
Guido van Rossum73624e91994-10-10 17:59:00 +00001710 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001711#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001712 SOCKET fd;
1713#else
1714 int fd;
1715#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001716 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001717 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001718 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001719 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001720 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001721 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001722#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001723 if (fd == INVALID_SOCKET)
1724#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001725 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001726#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001727 return PySocket_Err();
1728 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001729 /* If the object can't be created, don't forget to close the
1730 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001731 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001732 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001733 /* From now on, ignore SIGPIPE and let the error checking
1734 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001735#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001736 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001737#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001738 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001739}
1740
Guido van Rossum82a5c661998-07-07 20:45:43 +00001741static char socket_doc[] =
1742"socket(family, type[, proto]) -> socket object\n\
1743\n\
1744Open a socket of the given type. The family argument specifies the\n\
1745address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1746The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1747or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1748specifying the default protocol.";
1749
1750
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001751#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001752/* Create a socket object from a numeric file description.
1753 Useful e.g. if stdin is a socket.
1754 Additional arguments as for socket(). */
1755
1756/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001757static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001758BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001759{
Guido van Rossum73624e91994-10-10 17:59:00 +00001760 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001761 int fd, family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001762 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1763 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001764 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001765 /* Dup the fd so it and the socket can be closed independently */
1766 fd = dup(fd);
1767 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001768 return PySocket_Err();
1769 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001770 /* From now on, ignore SIGPIPE and let the error checking
1771 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001772#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001773 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001774#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001775 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001776}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001777
1778static char fromfd_doc[] =
1779"fromfd(fd, family, type[, proto]) -> socket object\n\
1780\n\
1781Create a socket object from the given file descriptor.\n\
1782The remaining arguments are the same as for socket().";
1783
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001784#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001785
Guido van Rossum82a5c661998-07-07 20:45:43 +00001786
Guido van Rossum006bf911996-06-12 04:04:55 +00001787static PyObject *
1788BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1789{
1790 int x1, x2;
1791
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001792 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001793 return NULL;
1794 }
1795 x2 = (int)ntohs((short)x1);
1796 return PyInt_FromLong(x2);
1797}
1798
Guido van Rossum82a5c661998-07-07 20:45:43 +00001799static char ntohs_doc[] =
1800"ntohs(integer) -> integer\n\
1801\n\
1802Convert a 16-bit integer from network to host byte order.";
1803
1804
Guido van Rossum006bf911996-06-12 04:04:55 +00001805static PyObject *
1806BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1807{
1808 int x1, x2;
1809
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001810 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001811 return NULL;
1812 }
1813 x2 = ntohl(x1);
1814 return PyInt_FromLong(x2);
1815}
1816
Guido van Rossum82a5c661998-07-07 20:45:43 +00001817static char ntohl_doc[] =
1818"ntohl(integer) -> integer\n\
1819\n\
1820Convert a 32-bit integer from network to host byte order.";
1821
1822
Guido van Rossum006bf911996-06-12 04:04:55 +00001823static PyObject *
1824BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1825{
1826 int x1, x2;
1827
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001828 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001829 return NULL;
1830 }
1831 x2 = (int)htons((short)x1);
1832 return PyInt_FromLong(x2);
1833}
1834
Guido van Rossum82a5c661998-07-07 20:45:43 +00001835static char htons_doc[] =
1836"htons(integer) -> integer\n\
1837\n\
1838Convert a 16-bit integer from host to network byte order.";
1839
1840
Guido van Rossum006bf911996-06-12 04:04:55 +00001841static PyObject *
1842BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1843{
1844 int x1, x2;
1845
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001846 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001847 return NULL;
1848 }
1849 x2 = htonl(x1);
1850 return PyInt_FromLong(x2);
1851}
1852
Guido van Rossum82a5c661998-07-07 20:45:43 +00001853static char htonl_doc[] =
1854"htonl(integer) -> integer\n\
1855\n\
1856Convert a 32-bit integer from host to network byte order.";
1857
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001858/*
1859 * socket.inet_aton() and socket.inet_ntoa() functions
1860 *
1861 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
1862 *
1863 */
1864
1865static char inet_aton_doc[] =
1866"inet_aton(string) -> packed 32-bit IP representation\n\
1867\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001868Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001869binary format used in low-level network functions.";
1870
1871static PyObject*
1872BUILD_FUNC_DEF_2(PySocket_inet_aton, PyObject *, self, PyObject *, args)
1873{
Guido van Rossuma2e48551999-09-09 15:42:59 +00001874#ifndef INADDR_NONE
1875#define INADDR_NONE (-1)
1876#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001877
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001878 /* Have to use inet_addr() instead */
1879 char *ip_addr;
1880 long packed_addr;
1881
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001882 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001883 return NULL;
1884 }
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001885#ifdef macintosh
1886 packed_addr = (long)inet_addr(ip_addr).s_addr;
1887#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001888 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001889#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001890
1891 if (packed_addr == INADDR_NONE) { /* invalid address */
1892 PyErr_SetString(PySocket_Error,
1893 "illegal IP address string passed to inet_aton");
1894 return NULL;
1895 }
1896
1897 return PyString_FromStringAndSize((char *) &packed_addr,
1898 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001899}
1900
1901static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00001902"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001903\n\
1904Convert an IP address from 32-bit packed binary format to string format";
1905
1906static PyObject*
1907BUILD_FUNC_DEF_2(PySocket_inet_ntoa, PyObject *, self, PyObject *, args)
1908{
1909 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001910 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001911 struct in_addr packed_addr;
1912
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001913 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001914 return NULL;
1915 }
1916
1917 if (addr_len != sizeof(packed_addr)) {
1918 PyErr_SetString(PySocket_Error,
1919 "packed IP wrong length for inet_ntoa");
1920 return NULL;
1921 }
1922
1923 memcpy(&packed_addr, packed_str, addr_len);
1924
1925 return PyString_FromString(inet_ntoa(packed_addr));
1926}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001927
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001928
1929#ifdef USE_SSL
1930
1931/* This is a C function to be called for new object initialization */
1932static SSLObject *
1933BUILD_FUNC_DEF_3(newSSLObject,
1934 PySocketSockObject *,Sock, char*,key_file, char*,cert_file)
1935{
1936 SSLObject *self;
1937 char *str;
1938
1939#if 0
1940 meth=SSLv23_client_method();
1941 meth=SSLv3_client_method();
1942 meth=SSLv2_client_method();
1943#endif
1944
1945 self = PyObject_NEW(SSLObject, &SSL_Type); /* Create new object */
1946 if (self == NULL){
1947 PyErr_SetObject(SSLErrorObject,
1948 PyString_FromString("newSSLObject error"));
1949 return NULL;
1950 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001951 memset(self->server, '\0', sizeof(char) * 256);
1952 memset(self->issuer, '\0', sizeof(char) * 256);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001953
1954 self->x_attr = PyDict_New();
1955 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
1956 if (self->ctx == NULL) {
1957 PyErr_SetObject(SSLErrorObject,
1958 PyString_FromString("SSL_CTX_new error"));
1959 PyMem_DEL(self);
1960 return NULL;
1961 }
1962
1963 if ( (key_file && !cert_file) || (!key_file && cert_file) )
1964 {
1965 PyErr_SetObject(SSLErrorObject,
1966 PyString_FromString(
1967 "Both the key & certificate files must be specified"));
1968 PyMem_DEL(self);
1969 return NULL;
1970 }
1971
1972 if (key_file && cert_file)
1973 {
1974 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
1975 SSL_FILETYPE_PEM) < 1)
1976 {
1977 PyErr_SetObject(SSLErrorObject,
1978 PyString_FromString(
1979 "SSL_CTX_use_PrivateKey_file error"));
1980 PyMem_DEL(self);
1981 return NULL;
1982 }
1983
1984 if (SSL_CTX_use_certificate_chain_file(self->ctx,
1985 cert_file) < 1)
1986 {
1987 PyErr_SetObject(SSLErrorObject,
1988 PyString_FromString(
1989 "SSL_CTX_use_certificate_chain_file error"));
1990 PyMem_DEL(self);
1991 return NULL;
1992 }
1993 }
1994
1995 SSL_CTX_set_verify(self->ctx,
1996 SSL_VERIFY_NONE, NULL); /* set verify lvl */
1997 self->ssl = SSL_new(self->ctx); /* New ssl struct */
1998 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
1999 SSL_set_connect_state(self->ssl);
2000
2001 if ((SSL_connect(self->ssl)) == -1) {
2002 /* Actually negotiate SSL connection */
2003 PyErr_SetObject(SSLErrorObject,
2004 PyString_FromString("SSL_connect error"));
2005 PyMem_DEL(self);
2006 return NULL;
2007 }
2008 self->ssl->debug = 1;
2009
2010 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2011 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2012 self->server, 256);
2013 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2014 self->issuer, 256);
2015 }
2016 self->x_attr = NULL;
2017 self->Socket = Sock;
2018 Py_INCREF(self->Socket);
2019 return self;
2020}
2021
2022/* This is the Python function called for new object initialization */
2023static PyObject *
2024BUILD_FUNC_DEF_2(PySocket_ssl, PyObject *, self, PyObject *, args)
2025{
2026 SSLObject *rv;
2027 PySocketSockObject *Sock;
2028 char *key_file;
2029 char *cert_file;
2030
Guido van Rossum43713e52000-02-29 13:59:29 +00002031 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002032 &PySocketSock_Type, (PyObject*)&Sock,
2033 &key_file, &cert_file) )
2034 return NULL;
2035
2036 rv = newSSLObject(Sock, key_file, cert_file);
2037 if ( rv == NULL )
2038 return NULL;
2039 return (PyObject *)rv;
2040}
2041
2042static char ssl_doc[] =
2043"ssl(socket, keyfile, certfile) -> sslobject";
2044
2045static PyObject *
2046BUILD_FUNC_DEF_2(SSL_server, SSLObject *, self, PyObject *, args)
2047{
2048 return PyString_FromString(self->server);
2049}
2050
2051static PyObject *
2052BUILD_FUNC_DEF_2(SSL_issuer, SSLObject *, self, PyObject *, args)
2053{
2054 return PyString_FromString(self->issuer);
2055}
2056
2057
2058/* SSL object methods */
2059
2060static PyMethodDef SSLMethods[] = {
2061 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2062 { "read", (PyCFunction)SSL_SSLread, 1 },
2063 { "server", (PyCFunction)SSL_server, 1 },
2064 { "issuer", (PyCFunction)SSL_issuer, 1 },
2065 { NULL, NULL}
2066};
2067
2068static void SSL_dealloc(SSLObject *self)
2069{
2070 if (self->server_cert) /* Possible not to have one? */
2071 X509_free (self->server_cert);
2072 SSL_CTX_free(self->ctx);
2073 SSL_free(self->ssl);
2074 Py_XDECREF(self->x_attr);
2075 Py_XDECREF(self->Socket);
2076 PyMem_DEL(self);
2077}
2078
2079static PyObject *SSL_getattr(SSLObject *self, char *name)
2080{
2081 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2082}
2083
2084staticforward PyTypeObject SSL_Type = {
2085 PyObject_HEAD_INIT(&PyType_Type)
2086 0, /*ob_size*/
2087 "SSL", /*tp_name*/
2088 sizeof(SSLObject), /*tp_basicsize*/
2089 0, /*tp_itemsize*/
2090 /* methods */
2091 (destructor)SSL_dealloc, /*tp_dealloc*/
2092 0, /*tp_print*/
2093 (getattrfunc)SSL_getattr, /*tp_getattr*/
2094 0, /*tp_setattr*/
2095 0, /*tp_compare*/
2096 0, /*tp_repr*/
2097 0, /*tp_as_number*/
2098 0, /*tp_as_sequence*/
2099 0, /*tp_as_mapping*/
2100 0, /*tp_hash*/
2101};
2102
2103
2104
2105static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2106{
2107 char *data;
2108 int len = 0;
2109
Guido van Rossum43713e52000-02-29 13:59:29 +00002110 if (!PyArg_ParseTuple(args, "s|i:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002111 return NULL;
2112
2113 if (!len)
2114 len = strlen(data);
2115
2116 len = SSL_write(self->ssl, data, len);
2117 return PyInt_FromLong((long)len);
2118}
2119
2120static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2121{
2122 PyObject *buf;
2123 int count = 0;
2124 int len = 1024;
2125 int res;
2126
Guido van Rossum43713e52000-02-29 13:59:29 +00002127 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002128
2129 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2130 return NULL; /* Error object should already be set */
2131
2132 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2133 res = SSL_get_error(self->ssl, count);
2134
2135 switch (res) {
2136 case 0: /* Good return value! */
2137 break;
2138 case 6:
2139 PyErr_SetString(SSLErrorObject, "EOF");
2140 Py_DECREF(buf);
2141 return NULL;
2142 break;
2143 case 5:
2144 default:
2145 return PyErr_SetFromErrno(SSLErrorObject);
2146 break;
2147 }
2148
2149 fflush(stderr);
2150
2151 if (count < 0) {
2152 Py_DECREF(buf);
2153 return PyErr_SetFromErrno(SSLErrorObject);
2154 }
2155
2156 if (count != len && _PyString_Resize(&buf, count) < 0)
2157 return NULL;
2158 return buf;
2159}
2160
2161#endif /* USE_SSL */
2162
2163
Guido van Rossum30a685f1991-06-27 15:51:29 +00002164/* List of functions exported by this module. */
2165
Guido van Rossum73624e91994-10-10 17:59:00 +00002166static PyMethodDef PySocket_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002167 {"gethostbyname", PySocket_gethostbyname, 1, gethostbyname_doc},
2168 {"gethostbyname_ex", PySocket_gethostbyname_ex, 1, ghbn_ex_doc},
2169 {"gethostbyaddr", PySocket_gethostbyaddr, 1, gethostbyaddr_doc},
2170 {"gethostname", PySocket_gethostname, 1, gethostname_doc},
2171 {"getservbyname", PySocket_getservbyname, 1, getservbyname_doc},
2172 {"getprotobyname", PySocket_getprotobyname, 1,getprotobyname_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00002173 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002174#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00002175 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002176#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002177 {"ntohs", PySocket_ntohs, 1, ntohs_doc},
2178 {"ntohl", PySocket_ntohl, 1, ntohl_doc},
2179 {"htons", PySocket_htons, 1, htons_doc},
2180 {"htonl", PySocket_htonl, 1, htonl_doc},
2181 {"inet_aton", PySocket_inet_aton, 1, inet_aton_doc},
2182 {"inet_ntoa", PySocket_inet_ntoa, 1, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002183#ifdef USE_SSL
2184 {"ssl", PySocket_ssl, 1, ssl_doc},
2185#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002186 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002187};
2188
Guido van Rossum30a685f1991-06-27 15:51:29 +00002189
2190/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002191 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002192 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002193 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002194static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002195BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002196{
Guido van Rossum73624e91994-10-10 17:59:00 +00002197 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002198 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002199 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002200
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002201 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002202}
2203
Guido van Rossum30a685f1991-06-27 15:51:29 +00002204
Guido van Rossum8d665e61996-06-26 18:22:49 +00002205#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002206
2207/* Additional initialization and cleanup for NT/Windows */
2208
2209static void
2210NTcleanup()
2211{
2212 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002213}
2214
2215static int
2216NTinit()
2217{
2218 WSADATA WSAData;
2219 int ret;
2220 char buf[100];
2221 ret = WSAStartup(0x0101, &WSAData);
2222 switch (ret) {
2223 case 0: /* no error */
2224 atexit(NTcleanup);
2225 return 1;
2226 case WSASYSNOTREADY:
2227 PyErr_SetString(PyExc_ImportError,
2228 "WSAStartup failed: network not ready");
2229 break;
2230 case WSAVERNOTSUPPORTED:
2231 case WSAEINVAL:
2232 PyErr_SetString(PyExc_ImportError,
2233 "WSAStartup failed: requested version not supported");
2234 break;
2235 default:
2236 sprintf(buf, "WSAStartup failed: error code %d", ret);
2237 PyErr_SetString(PyExc_ImportError, buf);
2238 break;
2239 }
2240 return 0;
2241}
2242
Guido van Rossum8d665e61996-06-26 18:22:49 +00002243#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002244
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002245#if defined(PYOS_OS2)
2246
2247/* Additional initialization and cleanup for OS/2 */
2248
2249static void
2250OS2cleanup()
2251{
2252 /* No cleanup is necessary for OS/2 Sockets */
2253}
2254
2255static int
2256OS2init()
2257{
2258 char reason[64];
2259 int rc = sock_init();
2260
2261 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002262 atexit(OS2cleanup);
2263 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002264 }
2265
2266 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2267 PyErr_SetString(PyExc_ImportError, reason);
2268
Guido van Rossum32c575d1997-12-02 20:37:32 +00002269 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002270}
2271
2272#endif /* PYOS_OS2 */
2273
Guido van Rossum30a685f1991-06-27 15:51:29 +00002274/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002275 * This is called when the first 'import socket' is done,
2276 * via a table in config.c, if config.c is compiled with USE_SOCKET
2277 * defined.
2278 *
2279 * For MS_WINDOWS (which means any Windows variant), this module
2280 * is actually called "_socket", and there's a wrapper "socket.py"
2281 * which implements some missing functionality (such as makefile(),
2282 * dup() and fromfd()). The import of "_socket" may fail with an
2283 * ImportError exception if initialization of WINSOCK fails. When
2284 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2285 * scheduled to be made at exit time.
2286 *
2287 * For OS/2, this module is also called "_socket" and uses a wrapper
2288 * "socket.py" which implements that functionality that is missing
2289 * when PC operating systems don't put socket descriptors in the
2290 * operating system's filesystem layer.
2291 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002292
Guido van Rossum82a5c661998-07-07 20:45:43 +00002293static char module_doc[] =
2294"This module provides socket operations and some related functions.\n\
2295On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
2296On other systems, it only supports IP.\n\
2297\n\
2298Functions:\n\
2299\n\
2300socket() -- create a new socket object\n\
2301fromfd() -- create a socket object from an open file descriptor (*)\n\
2302gethostname() -- return the current hostname\n\
2303gethostbyname() -- map a hostname to its IP number\n\
2304gethostbyaddr() -- map an IP number or hostname to DNS info\n\
2305getservbyname() -- map a service name and a protocol name to a port number\n\
2306getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
2307ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
2308htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002309inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format\n\
2310inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)\n\
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002311ssl() -- secure socket layer support (only available if configured)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002312\n\
2313(*) not available on all platforms!)\n\
2314\n\
2315Special objects:\n\
2316\n\
2317SocketType -- type object for socket objects\n\
2318error -- exception raised for I/O errors\n\
2319\n\
2320Integer constants:\n\
2321\n\
2322AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
2323SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
2324\n\
2325Many other constants may be defined; these may be used in calls to\n\
2326the setsockopt() and getsockopt() methods.\n\
2327";
2328
2329static char sockettype_doc[] =
2330"A socket represents one endpoint of a network connection.\n\
2331\n\
2332Methods:\n\
2333\n\
2334accept() -- accept a connection, returning new socket and client address\n\
2335bind() -- bind the socket to a local address\n\
2336close() -- close the socket\n\
2337connect() -- connect the socket to a remote address\n\
2338connect_ex() -- connect, return an error code instead of an exception \n\
2339dup() -- return a new socket object identical to the current one (*)\n\
2340fileno() -- return underlying file descriptor\n\
2341getpeername() -- return remote address (*)\n\
2342getsockname() -- return local address\n\
2343getsockopt() -- get socket options\n\
2344listen() -- start listening for incoming connections\n\
2345makefile() -- return a file object corresponding tot the socket (*)\n\
2346recv() -- receive data\n\
2347recvfrom() -- receive data and sender's address\n\
2348send() -- send data\n\
2349sendto() -- send data to a given address\n\
2350setblocking() -- set or clear the blocking I/O flag\n\
2351setsockopt() -- set socket options\n\
2352shutdown() -- shut down traffic in one or both directions\n\
2353\n\
2354(*) not available on all platforms!)";
2355
Guido van Rossum3886bb61998-12-04 18:50:17 +00002356DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00002357#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002358init_socket()
2359#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002360initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00002361#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002362{
Guido van Rossum73624e91994-10-10 17:59:00 +00002363 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00002364#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002365 if (!NTinit())
2366 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002367 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002368#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002369#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002370 if (!OS2init())
2371 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002372 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002373#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00002374#if defined(__BEOS__)
2375 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
2376#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002377 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002378#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00002379#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00002380#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002381 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002382 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2383 if (PySocket_Error == NULL)
2384 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002385#ifdef USE_SSL
2386 SSL_load_error_strings();
2387 SSLeay_add_ssl_algorithms();
2388 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2389 if (SSLErrorObject == NULL)
2390 return;
2391 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2392 Py_INCREF(&SSL_Type);
2393 if (PyDict_SetItemString(d, "SSLType",
2394 (PyObject *)&SSL_Type) != 0)
2395 return;
2396#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002397 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002398 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002399 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002400 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002401 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002402 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002403 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002404
2405 /* Address families (we only support AF_INET and AF_UNIX) */
2406#ifdef AF_UNSPEC
2407 insint(d, "AF_UNSPEC", AF_UNSPEC);
2408#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002409 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002410#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002411 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002412#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002413#ifdef AF_AX25
2414 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2415#endif
2416#ifdef AF_IPX
2417 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2418#endif
2419#ifdef AF_APPLETALK
2420 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2421#endif
2422#ifdef AF_NETROM
2423 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2424#endif
2425#ifdef AF_BRIDGE
2426 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2427#endif
2428#ifdef AF_AAL5
2429 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2430#endif
2431#ifdef AF_X25
2432 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2433#endif
2434#ifdef AF_INET6
2435 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2436#endif
2437#ifdef AF_ROSE
2438 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2439#endif
2440
2441 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002442 insint(d, "SOCK_STREAM", SOCK_STREAM);
2443 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002444#ifndef __BEOS__
2445/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002446 insint(d, "SOCK_RAW", SOCK_RAW);
2447 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2448 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002449#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002450
2451#ifdef SO_DEBUG
2452 insint(d, "SO_DEBUG", SO_DEBUG);
2453#endif
2454#ifdef SO_ACCEPTCONN
2455 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2456#endif
2457#ifdef SO_REUSEADDR
2458 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2459#endif
2460#ifdef SO_KEEPALIVE
2461 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2462#endif
2463#ifdef SO_DONTROUTE
2464 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2465#endif
2466#ifdef SO_BROADCAST
2467 insint(d, "SO_BROADCAST", SO_BROADCAST);
2468#endif
2469#ifdef SO_USELOOPBACK
2470 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2471#endif
2472#ifdef SO_LINGER
2473 insint(d, "SO_LINGER", SO_LINGER);
2474#endif
2475#ifdef SO_OOBINLINE
2476 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2477#endif
2478#ifdef SO_REUSEPORT
2479 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2480#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002481#ifdef SO_SNDBUF
2482 insint(d, "SO_SNDBUF", SO_SNDBUF);
2483#endif
2484#ifdef SO_RCVBUF
2485 insint(d, "SO_RCVBUF", SO_RCVBUF);
2486#endif
2487#ifdef SO_SNDLOWAT
2488 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2489#endif
2490#ifdef SO_RCVLOWAT
2491 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2492#endif
2493#ifdef SO_SNDTIMEO
2494 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2495#endif
2496#ifdef SO_RCVTIMEO
2497 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2498#endif
2499#ifdef SO_ERROR
2500 insint(d, "SO_ERROR", SO_ERROR);
2501#endif
2502#ifdef SO_TYPE
2503 insint(d, "SO_TYPE", SO_TYPE);
2504#endif
2505
2506 /* Maximum number of connections for "listen" */
2507#ifdef SOMAXCONN
2508 insint(d, "SOMAXCONN", SOMAXCONN);
2509#else
2510 insint(d, "SOMAXCONN", 5); /* Common value */
2511#endif
2512
2513 /* Flags for send, recv */
2514#ifdef MSG_OOB
2515 insint(d, "MSG_OOB", MSG_OOB);
2516#endif
2517#ifdef MSG_PEEK
2518 insint(d, "MSG_PEEK", MSG_PEEK);
2519#endif
2520#ifdef MSG_DONTROUTE
2521 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2522#endif
2523#ifdef MSG_EOR
2524 insint(d, "MSG_EOR", MSG_EOR);
2525#endif
2526#ifdef MSG_TRUNC
2527 insint(d, "MSG_TRUNC", MSG_TRUNC);
2528#endif
2529#ifdef MSG_CTRUNC
2530 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2531#endif
2532#ifdef MSG_WAITALL
2533 insint(d, "MSG_WAITALL", MSG_WAITALL);
2534#endif
2535#ifdef MSG_BTAG
2536 insint(d, "MSG_BTAG", MSG_BTAG);
2537#endif
2538#ifdef MSG_ETAG
2539 insint(d, "MSG_ETAG", MSG_ETAG);
2540#endif
2541
2542 /* Protocol level and numbers, usable for [gs]etsockopt */
2543#ifdef SOL_SOCKET
2544 insint(d, "SOL_SOCKET", SOL_SOCKET);
2545#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002546#ifdef SOL_IP
2547 insint(d, "SOL_IP", SOL_IP);
2548#else
2549 insint(d, "SOL_IP", 0);
2550#endif
2551#ifdef SOL_IPX
2552 insint(d, "SOL_IPX", SOL_IPX);
2553#endif
2554#ifdef SOL_AX25
2555 insint(d, "SOL_AX25", SOL_AX25);
2556#endif
2557#ifdef SOL_ATALK
2558 insint(d, "SOL_ATALK", SOL_ATALK);
2559#endif
2560#ifdef SOL_NETROM
2561 insint(d, "SOL_NETROM", SOL_NETROM);
2562#endif
2563#ifdef SOL_ROSE
2564 insint(d, "SOL_ROSE", SOL_ROSE);
2565#endif
2566#ifdef SOL_TCP
2567 insint(d, "SOL_TCP", SOL_TCP);
2568#else
2569 insint(d, "SOL_TCP", 6);
2570#endif
2571#ifdef SOL_UDP
2572 insint(d, "SOL_UDP", SOL_UDP);
2573#else
2574 insint(d, "SOL_UDP", 17);
2575#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002576#ifdef IPPROTO_IP
2577 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002578#else
2579 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002580#endif
2581#ifdef IPPROTO_ICMP
2582 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002583#else
2584 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002585#endif
2586#ifdef IPPROTO_IGMP
2587 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2588#endif
2589#ifdef IPPROTO_GGP
2590 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2591#endif
2592#ifdef IPPROTO_TCP
2593 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002594#else
2595 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002596#endif
2597#ifdef IPPROTO_EGP
2598 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2599#endif
2600#ifdef IPPROTO_PUP
2601 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2602#endif
2603#ifdef IPPROTO_UDP
2604 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002605#else
2606 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002607#endif
2608#ifdef IPPROTO_IDP
2609 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2610#endif
2611#ifdef IPPROTO_HELLO
2612 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2613#endif
2614#ifdef IPPROTO_ND
2615 insint(d, "IPPROTO_ND", IPPROTO_ND);
2616#endif
2617#ifdef IPPROTO_TP
2618 insint(d, "IPPROTO_TP", IPPROTO_TP);
2619#endif
2620#ifdef IPPROTO_XTP
2621 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2622#endif
2623#ifdef IPPROTO_EON
2624 insint(d, "IPPROTO_EON", IPPROTO_EON);
2625#endif
2626#ifdef IPPROTO_BIP
2627 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2628#endif
2629/**/
2630#ifdef IPPROTO_RAW
2631 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002632#else
2633 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002634#endif
2635#ifdef IPPROTO_MAX
2636 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2637#endif
2638
2639 /* Some port configuration */
2640#ifdef IPPORT_RESERVED
2641 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2642#else
2643 insint(d, "IPPORT_RESERVED", 1024);
2644#endif
2645#ifdef IPPORT_USERRESERVED
2646 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2647#else
2648 insint(d, "IPPORT_USERRESERVED", 5000);
2649#endif
2650
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002651 /* Some reserved IP v.4 addresses */
2652#ifdef INADDR_ANY
2653 insint(d, "INADDR_ANY", INADDR_ANY);
2654#else
2655 insint(d, "INADDR_ANY", 0x00000000);
2656#endif
2657#ifdef INADDR_BROADCAST
2658 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2659#else
2660 insint(d, "INADDR_BROADCAST", 0xffffffff);
2661#endif
2662#ifdef INADDR_LOOPBACK
2663 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2664#else
2665 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2666#endif
2667#ifdef INADDR_UNSPEC_GROUP
2668 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2669#else
2670 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2671#endif
2672#ifdef INADDR_ALLHOSTS_GROUP
2673 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2674#else
2675 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2676#endif
2677#ifdef INADDR_MAX_LOCAL_GROUP
2678 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2679#else
2680 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2681#endif
2682#ifdef INADDR_NONE
2683 insint(d, "INADDR_NONE", INADDR_NONE);
2684#else
2685 insint(d, "INADDR_NONE", 0xffffffff);
2686#endif
2687
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002688 /* IP [gs]etsockopt options */
2689#ifdef IP_OPTIONS
2690 insint(d, "IP_OPTIONS", IP_OPTIONS);
2691#endif
2692#ifdef IP_HDRINCL
2693 insint(d, "IP_HDRINCL", IP_HDRINCL);
2694#endif
2695#ifdef IP_TOS
2696 insint(d, "IP_TOS", IP_TOS);
2697#endif
2698#ifdef IP_TTL
2699 insint(d, "IP_TTL", IP_TTL);
2700#endif
2701#ifdef IP_RECVOPTS
2702 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2703#endif
2704#ifdef IP_RECVRETOPTS
2705 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2706#endif
2707#ifdef IP_RECVDSTADDR
2708 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2709#endif
2710#ifdef IP_RETOPTS
2711 insint(d, "IP_RETOPTS", IP_RETOPTS);
2712#endif
2713#ifdef IP_MULTICAST_IF
2714 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2715#endif
2716#ifdef IP_MULTICAST_TTL
2717 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2718#endif
2719#ifdef IP_MULTICAST_LOOP
2720 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2721#endif
2722#ifdef IP_ADD_MEMBERSHIP
2723 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2724#endif
2725#ifdef IP_DROP_MEMBERSHIP
2726 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2727#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002728#ifdef IP_DEFAULT_MULTICAST_TTL
2729 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2730#endif
2731#ifdef IP_DEFAULT_MULTICAST_LOOP
2732 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2733#endif
2734#ifdef IP_MAX_MEMBERSHIPS
2735 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2736#endif
2737
2738 /* TCP options */
2739#ifdef TCP_NODELAY
2740 insint(d, "TCP_NODELAY", TCP_NODELAY);
2741#endif
2742#ifdef TCP_MAXSEG
2743 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2744#endif
2745
2746 /* IPX options */
2747#ifdef IPX_TYPE
2748 insint(d, "IPX_TYPE", IPX_TYPE);
2749#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002750
2751 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002752#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002753 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002754#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002755}