blob: bc8c9ae6175e478c83a3b27c5ee5041f6a9e6ad5 [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 */
217#define close 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)
223#define close soclose
224#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
225#define FORCE_ANSI_FUNC_DEFS
226#endif
227
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000228#ifdef FORCE_ANSI_FUNC_DEFS
229#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
230fnname( arg1type arg1name )
231
232#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
233fnname( arg1type arg1name, arg2type arg2name )
234
235#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
236fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
237
238#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
239fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
240
241#else /* !FORCE_ANSI_FN_DEFS */
242#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
243fnname( arg1name ) \
244 arg1type arg1name;
245
246#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
247fnname( arg1name, arg2name ) \
248 arg1type arg1name; \
249 arg2type arg2name;
250
251#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
252fnname( arg1name, arg2name, arg3name ) \
253 arg1type arg1name; \
254 arg2type arg2name; \
255 arg3type arg3name;
256
257#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
258fnname( arg1name, arg2name, arg3name, arg4name ) \
259 arg1type arg1name; \
260 arg2type arg2name; \
261 arg3type arg3name; \
262 arg4type arg4name;
263
264#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000265
266/* Global variable holding the exception type for errors detected
267 by this module (but not argument type or memory errors, etc.). */
268
Guido van Rossum73624e91994-10-10 17:59:00 +0000269static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000270
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000271#ifdef USE_SSL
272static PyObject *SSLErrorObject;
273#endif /* USE_SSL */
274
Guido van Rossum30a685f1991-06-27 15:51:29 +0000275
276/* Convenience function to raise an error according to errno
277 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000278
Guido van Rossum73624e91994-10-10 17:59:00 +0000279static PyObject *
280PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000281{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000282#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000283 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000284 PyObject *v;
285 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000286 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000287 PyErr_SetObject(PySocket_Error, v);
288 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000289 }
290 return NULL;
291 }
292 else
293#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000294
295#if defined(PYOS_OS2)
296 if (sock_errno() != NO_ERROR) {
297 APIRET rc;
298 ULONG msglen;
299 char outbuf[100];
300 int myerrorcode = sock_errno();
301
302 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
303 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
304 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
305 if (rc == NO_ERROR) {
306 PyObject *v;
307
308 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
309 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
310 char *lastc = &outbuf[ strlen(outbuf)-1 ];
311 while (lastc > outbuf && isspace(*lastc))
312 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
313 }
314 v = Py_BuildValue("(is)", myerrorcode, outbuf);
315 if (v != NULL) {
316 PyErr_SetObject(PySocket_Error, v);
317 Py_DECREF(v);
318 }
319 return NULL;
320 }
321 }
322#endif
323
Guido van Rossum73624e91994-10-10 17:59:00 +0000324 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000325}
326
Guido van Rossum30a685f1991-06-27 15:51:29 +0000327
328/* The object holding a socket. It holds some extra information,
329 like the address family, which is used to decode socket address
330 arguments properly. */
331
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000332typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000333 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000334 int sock_fd; /* Socket file descriptor */
335 int sock_family; /* Address family, e.g., AF_INET */
336 int sock_type; /* Socket type, e.g., SOCK_STREAM */
337 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000338 union sock_addr {
339 struct sockaddr_in in;
340#ifdef AF_UNIX
341 struct sockaddr_un un;
342#endif
343 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000344} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000345
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000346#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000347
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000348typedef struct {
349 PyObject_HEAD
350 PySocketSockObject *Socket; /* Socket on which we're layered */
351 PyObject *x_attr; /* Attributes dictionary */
352 SSL_CTX* ctx;
353 SSL* ssl;
354 X509* server_cert;
355 BIO* sbio;
356 char server[256];
357 char issuer[256];
358
359} SSLObject;
360
361staticforward PyTypeObject SSL_Type;
362staticforward int SSL_setattr(SSLObject *self, char *name, PyObject *v);
363staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
364staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
365
366#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
367
368#endif /* USE_SSL */
369
Guido van Rossum30a685f1991-06-27 15:51:29 +0000370/* A forward reference to the Socktype type object.
371 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000372 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000373 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000374
Guido van Rossum73624e91994-10-10 17:59:00 +0000375staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000376
Guido van Rossum30a685f1991-06-27 15:51:29 +0000377
378/* Create a new socket object.
379 This just creates the object and initializes it.
380 If the creation fails, return NULL and set an exception (implicit
381 in NEWOBJ()). */
382
Guido van Rossum73624e91994-10-10 17:59:00 +0000383static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000384BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000385{
Guido van Rossum73624e91994-10-10 17:59:00 +0000386 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000387 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000388 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000389 if (s != NULL) {
390 s->sock_fd = fd;
391 s->sock_family = family;
392 s->sock_type = type;
393 s->sock_proto = proto;
394 }
395 return s;
396}
397
Guido van Rossum30a685f1991-06-27 15:51:29 +0000398
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000399/* Lock to allow python interpreter to continue, but only allow one
400 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000401#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000402PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000403#endif
404
405
Guido van Rossum30a685f1991-06-27 15:51:29 +0000406/* Convert a string specifying a host name or one of a few symbolic
407 names to a numeric IP address. This usually calls gethostbyname()
408 to do the work; the names "" and "<broadcast>" are special.
409 Return the length (should always be 4 bytes), or negative if
410 an error occurred; then an exception is raised. */
411
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000412static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000413BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000414{
415 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000416 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000417 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000418 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000419#ifdef HAVE_GETHOSTBYNAME_R
420 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000421#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
422 struct hostent_data data;
423#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000424 char buf[1001];
425 int buf_len = (sizeof buf) - 1;
426 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000427#endif
428#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000429 int result;
430#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000431#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000432
Guido van Rossuma376cc51996-12-05 23:43:35 +0000433 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000434 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000435 addr_ret->sin_addr.s_addr = INADDR_ANY;
436 return 4;
437 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000438 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000439 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
440 return 4;
441 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000442 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
443 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
444 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
445 addr_ret->sin_addr.s_addr = htonl(
446 ((long) d1 << 24) | ((long) d2 << 16) |
447 ((long) d3 << 8) | ((long) d4 << 0));
448 return 4;
449 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000450 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000451#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000452#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000453 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000454#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000455 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000456#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000457 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000458 result = gethostbyname_r(name, &hp_allocated, &data);
459 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000460#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000461#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000462#ifdef USE_GETHOSTBYNAME_LOCK
463 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000464#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000465 hp = gethostbyname(name);
466#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000467 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000468
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000469 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000470#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000471 /* Let's get real error message to return */
472 extern int h_errno;
473 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
474#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000475 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000476#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000477#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000478 PyThread_release_lock(gethostbyname_lock);
479#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000480 return -1;
481 }
482 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000483 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000484#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000485 PyThread_release_lock(gethostbyname_lock);
486#endif
487 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000488}
489
Guido van Rossum30a685f1991-06-27 15:51:29 +0000490
Guido van Rossum30a685f1991-06-27 15:51:29 +0000491/* Create a string object representing an IP address.
492 This is always a string of the form 'dd.dd.dd.dd' (with variable
493 size numbers). */
494
Guido van Rossum73624e91994-10-10 17:59:00 +0000495static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000496BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000497{
498 long x = ntohl(addr->sin_addr.s_addr);
499 char buf[100];
500 sprintf(buf, "%d.%d.%d.%d",
501 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
502 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000503 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000504}
505
506
507/* Create an object representing the given socket address,
508 suitable for passing it back to bind(), connect() etc.
509 The family field of the sockaddr structure is inspected
510 to determine what kind of address it really is. */
511
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000512/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000513static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000514BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000515{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000516 if (addrlen == 0) {
517 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000518 Py_INCREF(Py_None);
519 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000520 }
521
Guido van Rossumbcc20741998-08-04 22:53:56 +0000522#ifdef __BEOS__
523 /* XXX: BeOS version of accept() doesn't set family coreectly */
524 addr->sa_family = AF_INET;
525#endif
526
Guido van Rossum30a685f1991-06-27 15:51:29 +0000527 switch (addr->sa_family) {
528
529 case AF_INET:
530 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000531 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000532 PyObject *addrobj = makeipaddr(a);
533 PyObject *ret = NULL;
534 if (addrobj) {
535 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
536 Py_DECREF(addrobj);
537 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000538 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000539 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000540
Guido van Rossumb6775db1994-08-01 11:34:53 +0000541#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000542 case AF_UNIX:
543 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000544 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000545 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000546 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000547#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000548
549 /* More cases here... */
550
551 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000552 /* If we don't know the address family, don't raise an
553 exception -- return it as a tuple. */
554 return Py_BuildValue("is#",
555 addr->sa_family,
556 addr->sa_data,
557 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000558
Guido van Rossum30a685f1991-06-27 15:51:29 +0000559 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000560}
561
Guido van Rossum30a685f1991-06-27 15:51:29 +0000562
563/* Parse a socket address argument according to the socket object's
564 address family. Return 1 if the address was in the proper format,
565 0 of not. The address is returned through addr_ret, its length
566 through len_ret. */
567
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000568static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000569BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000570getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000571{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000572 switch (s->sock_family) {
573
Guido van Rossumb6775db1994-08-01 11:34:53 +0000574#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000575 case AF_UNIX:
576 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000577 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000578 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000579 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000580 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000581 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000582 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000583 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000584 PyErr_SetString(PySocket_Error,
585 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000586 return 0;
587 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000588 addr->sun_family = AF_UNIX;
589 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000590 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000591 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000592 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000593 return 1;
594 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000595#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000596
Guido van Rossum30a685f1991-06-27 15:51:29 +0000597 case AF_INET:
598 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000599 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000600 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000601 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000602 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000603 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000604 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000605 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000606 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000607 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000608 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000609 *addr_ret = (struct sockaddr *) addr;
610 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000611 return 1;
612 }
613
Guido van Rossum30a685f1991-06-27 15:51:29 +0000614 /* More cases here... */
615
616 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000617 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000618 return 0;
619
620 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000621}
622
Guido van Rossum30a685f1991-06-27 15:51:29 +0000623
Guido van Rossum710e1df1992-06-12 10:39:36 +0000624/* Get the address length according to the socket object's address family.
625 Return 1 if the family is known, 0 otherwise. The length is returned
626 through len_ret. */
627
628static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000629BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000630{
631 switch (s->sock_family) {
632
Guido van Rossumb6775db1994-08-01 11:34:53 +0000633#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000634 case AF_UNIX:
635 {
636 *len_ret = sizeof (struct sockaddr_un);
637 return 1;
638 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000639#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000640
641 case AF_INET:
642 {
643 *len_ret = sizeof (struct sockaddr_in);
644 return 1;
645 }
646
647 /* More cases here... */
648
649 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000650 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000651 return 0;
652
653 }
654}
655
656
Guido van Rossum30a685f1991-06-27 15:51:29 +0000657/* s.accept() method */
658
Guido van Rossum73624e91994-10-10 17:59:00 +0000659static PyObject *
660BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000661{
662 char addrbuf[256];
663 int addrlen, newfd;
Barry Warsaw752300b1997-01-03 17:18:10 +0000664 PyObject *sock = NULL;
665 PyObject *addr = NULL;
666 PyObject *res = NULL;
667
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000668 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000669 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000670 if (!getsockaddrlen(s, &addrlen))
671 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000672 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000673 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000674 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000675 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000676 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000677
Guido van Rossum30a685f1991-06-27 15:51:29 +0000678 /* Create the new object with unspecified family,
679 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000680 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000681 s->sock_family,
682 s->sock_type,
683 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000684 if (sock == NULL) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000685 close(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000686 goto finally;
687 }
688 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
689 goto finally;
690
691 if (!(res = Py_BuildValue("OO", sock, addr)))
692 goto finally;
693
694 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000695 Py_XDECREF(sock);
696 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000697 return res;
698}
699
Guido van Rossum82a5c661998-07-07 20:45:43 +0000700static char accept_doc[] =
701"accept() -> (socket object, address info)\n\
702\n\
703Wait for an incoming connection. Return a new socket representing the\n\
704connection, and the address of the client. For IP sockets, the address\n\
705info is a pair (hostaddr, port).";
706
Guido van Rossum30a685f1991-06-27 15:51:29 +0000707
Guido van Rossume4485b01994-09-07 14:32:49 +0000708/* s.setblocking(1 | 0) method */
709
Guido van Rossum73624e91994-10-10 17:59:00 +0000710static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000711BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000712{
713 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000714#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000715 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000716#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000717 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000718 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000719 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000720#ifdef __BEOS__
721 block = !block;
722 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
723 (void *)(&block), sizeof( int ) );
724#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000725#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000726#ifdef PYOS_OS2
727 block = !block;
728 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
729#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000730 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
731 if (block)
732 delay_flag &= (~O_NDELAY);
733 else
734 delay_flag |= O_NDELAY;
735 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000736#endif /* !PYOS_OS2 */
737#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000738 block = !block;
739 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000740#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000741#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000742 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000743
Guido van Rossum73624e91994-10-10 17:59:00 +0000744 Py_INCREF(Py_None);
745 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000746}
Guido van Rossume4485b01994-09-07 14:32:49 +0000747
Guido van Rossum82a5c661998-07-07 20:45:43 +0000748static char setblocking_doc[] =
749"setblocking(flag)\n\
750\n\
751Set the socket to blocking (flag is true) or non-blocking (false).\n\
752This uses the FIONBIO ioctl with the O_NDELAY flag.";
753
Guido van Rossume4485b01994-09-07 14:32:49 +0000754
Guido van Rossumaee08791992-09-08 09:05:33 +0000755/* s.setsockopt() method.
756 With an integer third argument, sets an integer option.
757 With a string third argument, sets an option from a buffer;
758 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000759
Guido van Rossum73624e91994-10-10 17:59:00 +0000760static PyObject *
761BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000762{
763 int level;
764 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000765 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000766 char *buf;
767 int buflen;
768 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000769
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000770 if (PyArg_ParseTuple(args, "iii:setsockopt",
771 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000772 buf = (char *) &flag;
773 buflen = sizeof flag;
774 }
775 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000776 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000777 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
778 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000779 return NULL;
780 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000781 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000782 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000783 return PySocket_Err();
784 Py_INCREF(Py_None);
785 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000786}
787
Guido van Rossum82a5c661998-07-07 20:45:43 +0000788static char setsockopt_doc[] =
789"setsockopt(level, option, value)\n\
790\n\
791Set a socket option. See the Unix manual for level and option.\n\
792The value argument can either be an integer or a string.";
793
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000794
Guido van Rossumaee08791992-09-08 09:05:33 +0000795/* s.getsockopt() method.
796 With two arguments, retrieves an integer option.
797 With a third integer argument, retrieves a string buffer of that size;
798 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000799
Guido van Rossum73624e91994-10-10 17:59:00 +0000800static PyObject *
801BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000802{
803 int level;
804 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000805 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000806 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000807 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000808
Guido van Rossumbcc20741998-08-04 22:53:56 +0000809#ifdef __BEOS__
810/* We have incomplete socket support. */
811 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
812 return NULL;
813#else
814
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000815 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
816 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000817 return NULL;
818
819 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000820 int flag = 0;
821 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000822 res = getsockopt(s->sock_fd, level, optname,
823 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000824 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000825 return PySocket_Err();
826 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000827 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000828 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000829 PyErr_SetString(PySocket_Error,
830 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000831 return NULL;
832 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000833 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000834 if (buf == NULL)
835 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000836 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000837 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000838 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000839 Py_DECREF(buf);
840 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000841 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000842 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000843 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000844#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000845}
846
Guido van Rossum82a5c661998-07-07 20:45:43 +0000847static char getsockopt_doc[] =
848"getsockopt(level, option[, buffersize]) -> value\n\
849\n\
850Get a socket option. See the Unix manual for level and option.\n\
851If a nonzero buffersize argument is given, the return value is a\n\
852string of that length; otherwise it is an integer.";
853
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000854
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000855/* s.bind(sockaddr...) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000856
Guido van Rossum73624e91994-10-10 17:59:00 +0000857static PyObject *
858BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000859{
860 struct sockaddr *addr;
861 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000862 int res;
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000863 if (!getsockaddrarg(s, args, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000864 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000865 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000866 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000867 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000868 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000869 return PySocket_Err();
870 Py_INCREF(Py_None);
871 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000872}
873
Guido van Rossum82a5c661998-07-07 20:45:43 +0000874static char bind_doc[] =
875"bind(address)\n\
876\n\
877Bind the socket to a local address. For IP sockets, the address is a\n\
878pair (host, port); the host must refer to the local host.";
879
Guido van Rossum30a685f1991-06-27 15:51:29 +0000880
881/* s.close() method.
882 Set the file descriptor to -1 so operations tried subsequently
883 will surely fail. */
884
Guido van Rossum73624e91994-10-10 17:59:00 +0000885static PyObject *
886BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000887{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000888 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000889 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000890 if (s->sock_fd != -1) {
891 Py_BEGIN_ALLOW_THREADS
892 (void) close(s->sock_fd);
893 Py_END_ALLOW_THREADS
894 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000895 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000896 Py_INCREF(Py_None);
897 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000898}
899
Guido van Rossum82a5c661998-07-07 20:45:43 +0000900static char close_doc[] =
901"close()\n\
902\n\
903Close the socket. It cannot be used after this call.";
904
Guido van Rossum30a685f1991-06-27 15:51:29 +0000905
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000906/* s.connect(sockaddr...) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000907
Guido van Rossum73624e91994-10-10 17:59:00 +0000908static PyObject *
909BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000910{
911 struct sockaddr *addr;
912 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000913 int res;
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000914 if (!getsockaddrarg(s, args, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000915 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000916 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000917 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000918 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000919 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000920 return PySocket_Err();
921 Py_INCREF(Py_None);
922 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000923}
924
Guido van Rossum82a5c661998-07-07 20:45:43 +0000925static char connect_doc[] =
926"connect(address)\n\
927\n\
928Connect the socket to a remote address. For IP sockets, the address\n\
929is a pair (host, port).";
930
Guido van Rossum30a685f1991-06-27 15:51:29 +0000931
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000932/* s.connect_ex(sockaddr...) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000933
934static PyObject *
935BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
936{
937 struct sockaddr *addr;
938 int addrlen;
939 int res;
Guido van Rossum527c9bd2000-04-04 14:10:20 +0000940 if (!getsockaddrarg(s, args, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000941 return NULL;
942 Py_BEGIN_ALLOW_THREADS
943 res = connect(s->sock_fd, addr, addrlen);
944 Py_END_ALLOW_THREADS
945 if (res != 0)
946 res = errno;
947 return PyInt_FromLong((long) res);
948}
949
Guido van Rossum82a5c661998-07-07 20:45:43 +0000950static char connect_ex_doc[] =
951"connect_ex(address)\n\
952\n\
953This is like connect(address), but returns an error code (the errno value)\n\
954instead of raising an exception when an error occurs.";
955
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000956
Guido van Rossumed233a51992-06-23 09:07:03 +0000957/* s.fileno() method */
958
Guido van Rossum73624e91994-10-10 17:59:00 +0000959static PyObject *
960BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000961{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000962 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +0000963 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000964 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000965}
966
Guido van Rossum82a5c661998-07-07 20:45:43 +0000967static char fileno_doc[] =
968"fileno() -> integer\n\
969\n\
970Return the integer file descriptor of the socket.";
971
Guido van Rossumed233a51992-06-23 09:07:03 +0000972
Guido van Rossumbe32c891996-06-20 16:25:29 +0000973#ifndef NO_DUP
974/* s.dup() method */
975
976static PyObject *
977BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
978{
979 int newfd;
980 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000981 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000982 return NULL;
983 newfd = dup(s->sock_fd);
984 if (newfd < 0)
985 return PySocket_Err();
986 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000987 s->sock_family,
988 s->sock_type,
989 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000990 if (sock == NULL)
991 close(newfd);
992 return sock;
993}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000994
995static char dup_doc[] =
996"dup() -> socket object\n\
997\n\
998Return a new socket object connected to the same system resource.";
999
Guido van Rossumbe32c891996-06-20 16:25:29 +00001000#endif
1001
1002
Guido van Rossumc89705d1992-11-26 08:54:07 +00001003/* s.getsockname() method */
1004
Guido van Rossum73624e91994-10-10 17:59:00 +00001005static PyObject *
1006BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001007{
1008 char addrbuf[256];
1009 int addrlen, res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001010 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001011 return NULL;
1012 if (!getsockaddrlen(s, &addrlen))
1013 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001014 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001015 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001016 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001017 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001018 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001019 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001020 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1021}
1022
Guido van Rossum82a5c661998-07-07 20:45:43 +00001023static char getsockname_doc[] =
1024"getsockname() -> address info\n\
1025\n\
1026Return the address of the local endpoint. For IP sockets, the address\n\
1027info is a pair (hostaddr, port).";
1028
Guido van Rossumc89705d1992-11-26 08:54:07 +00001029
Guido van Rossumb6775db1994-08-01 11:34:53 +00001030#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001031/* s.getpeername() method */
1032
Guido van Rossum73624e91994-10-10 17:59:00 +00001033static PyObject *
1034BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001035{
1036 char addrbuf[256];
1037 int addrlen, res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001038 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001039 return NULL;
1040 if (!getsockaddrlen(s, &addrlen))
1041 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001042 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001043 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001044 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001045 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001046 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001047 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1048}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001049
1050static char getpeername_doc[] =
1051"getpeername() -> address info\n\
1052\n\
1053Return the address of the remote endpoint. For IP sockets, the address\n\
1054info is a pair (hostaddr, port).";
1055
Guido van Rossumb6775db1994-08-01 11:34:53 +00001056#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001057
1058
Guido van Rossum30a685f1991-06-27 15:51:29 +00001059/* s.listen(n) method */
1060
Guido van Rossum73624e91994-10-10 17:59:00 +00001061static PyObject *
1062BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001063{
1064 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001065 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001066 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001067 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001068 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001069 if (backlog < 1)
1070 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001071 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001072 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001073 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001074 return PySocket_Err();
1075 Py_INCREF(Py_None);
1076 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001077}
1078
Guido van Rossum82a5c661998-07-07 20:45:43 +00001079static char listen_doc[] =
1080"listen(backlog)\n\
1081\n\
1082Enable a server to accept connections. The backlog argument must be at\n\
1083least 1; it specifies the number of unaccepted connection that the system\n\
1084will allow before refusing new connections.";
1085
1086
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001087#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001088/* s.makefile(mode) method.
1089 Create a new open file object referring to a dupped version of
1090 the socket's file descriptor. (The dup() call is necessary so
1091 that the open file and socket objects may be closed independent
1092 of each other.)
1093 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1094
Guido van Rossum73624e91994-10-10 17:59:00 +00001095static PyObject *
1096BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001097{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001098 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +00001099 char *mode = "r";
1100 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001101 int fd;
1102 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001103 PyObject *f;
1104
Guido van Rossum43713e52000-02-29 13:59:29 +00001105 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001106 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001107#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001108 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1109 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001110#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001111 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001112#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001113 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001114 if (fd >= 0)
1115 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001116 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001117 }
1118 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1119 if (f != NULL)
1120 PyFile_SetBufSize(f, bufsize);
1121 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001122}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001123
1124static char makefile_doc[] =
1125"makefile([mode[, buffersize]]) -> file object\n\
1126\n\
1127Return a regular file object corresponding to the socket.\n\
1128The mode and buffersize arguments are as for the built-in open() function.";
1129
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001130#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001131
Guido van Rossum82a5c661998-07-07 20:45:43 +00001132
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001133/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001134
Guido van Rossum73624e91994-10-10 17:59:00 +00001135static PyObject *
1136BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001137{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001138 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001139 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001140 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001141 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001142 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001143 if (buf == NULL)
1144 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001145 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001146 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001147 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001148 if (n < 0) {
1149 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001150 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001151 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001152 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001153 return NULL;
1154 return buf;
1155}
1156
Guido van Rossum82a5c661998-07-07 20:45:43 +00001157static char recv_doc[] =
1158"recv(buffersize[, flags]) -> data\n\
1159\n\
1160Receive up to buffersize bytes from the socket. For the optional flags\n\
1161argument, see the Unix manual. When no data is available, block until\n\
1162at least one byte is available or until the remote end is closed. When\n\
1163the remote end is closed and all data is read, return the empty string.";
1164
Guido van Rossum30a685f1991-06-27 15:51:29 +00001165
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001166/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001167
Guido van Rossum73624e91994-10-10 17:59:00 +00001168static PyObject *
1169BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001170{
1171 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001172 PyObject *buf = NULL;
1173 PyObject *addr = NULL;
1174 PyObject *ret = NULL;
1175
Guido van Rossumbe32c891996-06-20 16:25:29 +00001176 int addrlen, len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001177 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001178 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001179 if (!getsockaddrlen(s, &addrlen))
1180 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001181 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001182 if (buf == NULL)
1183 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001184 Py_BEGIN_ALLOW_THREADS
1185 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001186#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001187#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001188 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001189#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001190 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001191#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001192#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001193 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001194#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001195 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001196 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001197 if (n < 0) {
1198 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001199 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001200 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001201 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001202 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001203
1204 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1205 goto finally;
1206
Guido van Rossum73624e91994-10-10 17:59:00 +00001207 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001208 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001209 Py_XDECREF(addr);
1210 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001211 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001212}
1213
Guido van Rossum82a5c661998-07-07 20:45:43 +00001214static char recvfrom_doc[] =
1215"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1216\n\
1217Like recv(buffersize, flags) but also return the sender's address info.";
1218
Guido van Rossum30a685f1991-06-27 15:51:29 +00001219
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001220/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001221
Guido van Rossum73624e91994-10-10 17:59:00 +00001222static PyObject *
1223BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001224{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001225 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001226 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001227 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001228 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001229 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001230 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001231 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001232 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001233 return PySocket_Err();
1234 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001235}
1236
Guido van Rossum82a5c661998-07-07 20:45:43 +00001237static char send_doc[] =
1238"send(data[, flags])\n\
1239\n\
1240Send a data string to the socket. For the optional flags\n\
1241argument, see the Unix manual.";
1242
Guido van Rossum30a685f1991-06-27 15:51:29 +00001243
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001244/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001245
Guido van Rossum73624e91994-10-10 17:59:00 +00001246static PyObject *
1247BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001248{
Guido van Rossum73624e91994-10-10 17:59:00 +00001249 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001250 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001251 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001252 int addrlen, len, n, flags;
1253 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001254 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001255 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001256 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1257 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001258 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001259 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001260 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001261 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001262 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001263 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001264 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001265 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001266 return PySocket_Err();
1267 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001268}
1269
Guido van Rossum82a5c661998-07-07 20:45:43 +00001270static char sendto_doc[] =
1271"sendto(data[, flags], address)\n\
1272\n\
1273Like send(data, flags) but allows specifying the destination address.\n\
1274For IP sockets, the address is a pair (hostaddr, port).";
1275
Guido van Rossum30a685f1991-06-27 15:51:29 +00001276
1277/* s.shutdown(how) method */
1278
Guido van Rossum73624e91994-10-10 17:59:00 +00001279static PyObject *
1280BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001281{
1282 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001283 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001284 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001285 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001286 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001287 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001288 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001289 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001290 return PySocket_Err();
1291 Py_INCREF(Py_None);
1292 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001293}
1294
Guido van Rossum82a5c661998-07-07 20:45:43 +00001295static char shutdown_doc[] =
1296"shutdown(flag)\n\
1297\n\
1298Shut down the reading side of the socket (flag == 0), the writing side\n\
1299of the socket (flag == 1), or both ends (flag == 2).";
1300
Guido van Rossum30a685f1991-06-27 15:51:29 +00001301
1302/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001303
Guido van Rossum73624e91994-10-10 17:59:00 +00001304static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001305 {"accept", (PyCFunction)PySocketSock_accept, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001306 accept_doc},
Guido van Rossum527c9bd2000-04-04 14:10:20 +00001307 {"bind", (PyCFunction)PySocketSock_bind, 0,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001308 bind_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001309 {"close", (PyCFunction)PySocketSock_close, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001310 close_doc},
Guido van Rossum527c9bd2000-04-04 14:10:20 +00001311 {"connect", (PyCFunction)PySocketSock_connect, 0,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001312 connect_doc},
Guido van Rossum527c9bd2000-04-04 14:10:20 +00001313 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 0,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001314 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001315#ifndef NO_DUP
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001316 {"dup", (PyCFunction)PySocketSock_dup, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001317 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001318#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001319 {"fileno", (PyCFunction)PySocketSock_fileno, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001320 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001321#ifdef HAVE_GETPEERNAME
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001322 {"getpeername", (PyCFunction)PySocketSock_getpeername, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001323 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001324#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001325 {"getsockname", (PyCFunction)PySocketSock_getsockname, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001326 getsockname_doc},
1327 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1328 getsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001329 {"listen", (PyCFunction)PySocketSock_listen, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001330 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001331#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001332 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1333 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001334#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001335 {"recv", (PyCFunction)PySocketSock_recv, 1,
1336 recv_doc},
1337 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1338 recvfrom_doc},
1339 {"send", (PyCFunction)PySocketSock_send, 1,
1340 send_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001341 {"sendto", (PyCFunction)PySocketSock_sendto, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001342 sendto_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001343 {"setblocking", (PyCFunction)PySocketSock_setblocking, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001344 setblocking_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001345 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001346 setsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001347 {"shutdown", (PyCFunction)PySocketSock_shutdown, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001348 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001349 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001350};
1351
Guido van Rossum30a685f1991-06-27 15:51:29 +00001352
Guido van Rossum73624e91994-10-10 17:59:00 +00001353/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001354 First close the file description. */
1355
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001356static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001357BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001358{
1359 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001360 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001361}
1362
Guido van Rossum30a685f1991-06-27 15:51:29 +00001363
1364/* Return a socket object's named attribute. */
1365
Guido van Rossum73624e91994-10-10 17:59:00 +00001366static PyObject *
1367BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001368{
Guido van Rossum73624e91994-10-10 17:59:00 +00001369 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001370}
1371
Guido van Rossum30a685f1991-06-27 15:51:29 +00001372
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001373static PyObject *
1374BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1375{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001376 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001377 sprintf(buf,
1378 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1379 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001380 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001381}
1382
1383
Guido van Rossumb6775db1994-08-01 11:34:53 +00001384/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001385
Guido van Rossum73624e91994-10-10 17:59:00 +00001386static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001387 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001388 0,
1389 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001390 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001391 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001392 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001393 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001394 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001395 0, /*tp_setattr*/
1396 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001397 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001398 0, /*tp_as_number*/
1399 0, /*tp_as_sequence*/
1400 0, /*tp_as_mapping*/
1401};
1402
Guido van Rossum30a685f1991-06-27 15:51:29 +00001403
Guido van Rossum81194471991-07-27 21:42:02 +00001404/* Python interface to gethostname(). */
1405
1406/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001407static PyObject *
1408BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001409{
1410 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001411 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001412 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001413 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001414 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001415 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001416 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001417 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001418 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001419 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001420 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001421}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001422
Guido van Rossum82a5c661998-07-07 20:45:43 +00001423static char gethostname_doc[] =
1424"gethostname() -> string\n\
1425\n\
1426Return the current host name.";
1427
Guido van Rossumff4949e1992-08-05 19:58:53 +00001428
Guido van Rossum30a685f1991-06-27 15:51:29 +00001429/* Python interface to gethostbyname(name). */
1430
1431/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001432static PyObject *
1433BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001434{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001435 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001436 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001437 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001438 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001439 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001440 return NULL;
1441 return makeipaddr(&addrbuf);
1442}
1443
Guido van Rossum82a5c661998-07-07 20:45:43 +00001444static char gethostbyname_doc[] =
1445"gethostbyname(host) -> address\n\
1446\n\
1447Return the IP address (a string of the form '255.255.255.255') for a host.";
1448
1449
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001450/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1451
1452static PyObject *
1453gethost_common(h, addr)
1454 struct hostent *h;
1455 struct sockaddr_in *addr;
1456{
1457 char **pch;
1458 PyObject *rtn_tuple = (PyObject *)NULL;
1459 PyObject *name_list = (PyObject *)NULL;
1460 PyObject *addr_list = (PyObject *)NULL;
1461 PyObject *tmp;
1462 if (h == NULL) {
1463#ifdef HAVE_HSTRERROR
1464 /* Let's get real error message to return */
1465 extern int h_errno;
1466 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1467#else
1468 PyErr_SetString(PySocket_Error, "host not found");
1469#endif
1470 return NULL;
1471 }
1472 if ((name_list = PyList_New(0)) == NULL)
1473 goto err;
1474 if ((addr_list = PyList_New(0)) == NULL)
1475 goto err;
1476 for (pch = h->h_aliases; *pch != NULL; pch++) {
1477 int status;
1478 tmp = PyString_FromString(*pch);
1479 if (tmp == NULL)
1480 goto err;
1481 status = PyList_Append(name_list, tmp);
1482 Py_DECREF(tmp);
1483 if (status)
1484 goto err;
1485 }
1486 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1487 int status;
1488 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1489 tmp = makeipaddr(addr);
1490 if (tmp == NULL)
1491 goto err;
1492 status = PyList_Append(addr_list, tmp);
1493 Py_DECREF(tmp);
1494 if (status)
1495 goto err;
1496 }
1497 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1498 err:
1499 Py_XDECREF(name_list);
1500 Py_XDECREF(addr_list);
1501 return rtn_tuple;
1502}
1503
1504
1505/* Python interface to gethostbyname_ex(name). */
1506
1507/*ARGSUSED*/
1508static PyObject *
1509BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1510{
1511 char *name;
1512 struct hostent *h;
1513 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001514 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001515#ifdef HAVE_GETHOSTBYNAME_R
1516 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001517#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1518 struct hostent_data data;
1519#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001520 char buf[16384];
1521 int buf_len = (sizeof buf) - 1;
1522 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001523#endif
1524#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001525 int result;
1526#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001527#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001528 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001529 return NULL;
1530 if (setipaddr(name, &addr) < 0)
1531 return NULL;
1532 Py_BEGIN_ALLOW_THREADS
1533#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001534#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001535 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001536#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001537 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001538#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001539 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001540 result = gethostbyname_r(name, &hp_allocated, &data);
1541 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001542#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001543#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001544#ifdef USE_GETHOSTBYNAME_LOCK
1545 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001546#endif
1547 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001548#endif /* HAVE_GETHOSTBYNAME_R */
1549 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001550 ret = gethost_common(h, &addr);
1551#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001552 PyThread_release_lock(gethostbyname_lock);
1553#endif
1554 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001555}
1556
1557static char ghbn_ex_doc[] =
1558"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1559\n\
1560Return the true host name, a list of aliases, and a list of IP addresses,\n\
1561for a host. The host argument is a string giving a host name or IP number.";
1562
1563
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001564/* Python interface to gethostbyaddr(IP). */
1565
1566/*ARGSUSED*/
1567static PyObject *
1568BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1569{
1570 struct sockaddr_in addr;
1571 char *ip_num;
1572 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001573 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001574#ifdef HAVE_GETHOSTBYNAME_R
1575 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001576#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1577 struct hostent_data data;
1578#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001579 char buf[16384];
1580 int buf_len = (sizeof buf) - 1;
1581 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001582#endif
1583#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001584 int result;
1585#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001586#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001587
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001588 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001589 return NULL;
1590 if (setipaddr(ip_num, &addr) < 0)
1591 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001592 Py_BEGIN_ALLOW_THREADS
1593#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001594#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001595 result = gethostbyaddr_r((char *)&addr.sin_addr,
1596 sizeof(addr.sin_addr),
1597 AF_INET, &hp_allocated, buf, buf_len,
1598 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001599#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001600 h = gethostbyaddr_r((char *)&addr.sin_addr,
1601 sizeof(addr.sin_addr),
1602 AF_INET,
1603 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001604#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001605 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001606 result = gethostbyaddr_r((char *)&addr.sin_addr,
1607 sizeof(addr.sin_addr),
1608 AF_INET, &hp_allocated, &data);
1609 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001610#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001611#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001612#ifdef USE_GETHOSTBYNAME_LOCK
1613 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001614#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001615 h = gethostbyaddr((char *)&addr.sin_addr,
1616 sizeof(addr.sin_addr),
1617 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001618#endif /* HAVE_GETHOSTBYNAME_R */
1619 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001620 ret = gethost_common(h, &addr);
1621#ifdef USE_GETHOSTBYNAME_LOCK
1622 PyThread_release_lock(gethostbyname_lock);
1623#endif
1624 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001625}
1626
Guido van Rossum82a5c661998-07-07 20:45:43 +00001627static char gethostbyaddr_doc[] =
1628"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1629\n\
1630Return the true host name, a list of aliases, and a list of IP addresses,\n\
1631for a host. The host argument is a string giving a host name or IP number.";
1632
Guido van Rossum30a685f1991-06-27 15:51:29 +00001633
1634/* Python interface to getservbyname(name).
1635 This only returns the port number, since the other info is already
1636 known or not useful (like the list of aliases). */
1637
1638/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001639static PyObject *
1640BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001641{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001642 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001643 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001644 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001645 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001646 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001647 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001648 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001649 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001650 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001651 return NULL;
1652 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001653 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001654}
1655
Guido van Rossum82a5c661998-07-07 20:45:43 +00001656static char getservbyname_doc[] =
1657"getservbyname(servicename, protocolname) -> integer\n\
1658\n\
1659Return a port number from a service name and protocol name.\n\
1660The protocol name should be 'tcp' or 'udp'.";
1661
Guido van Rossum30a685f1991-06-27 15:51:29 +00001662
Guido van Rossum3901d851996-12-19 16:35:04 +00001663/* Python interface to getprotobyname(name).
1664 This only returns the protocol number, since the other info is
1665 already known or not useful (like the list of aliases). */
1666
1667/*ARGSUSED*/
1668static PyObject *
1669BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1670{
1671 char *name;
1672 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001673#ifdef __BEOS__
1674/* Not available in BeOS yet. - [cjh] */
1675 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1676 return NULL;
1677#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001678 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001679 return NULL;
1680 Py_BEGIN_ALLOW_THREADS
1681 sp = getprotobyname(name);
1682 Py_END_ALLOW_THREADS
1683 if (sp == NULL) {
1684 PyErr_SetString(PySocket_Error, "protocol not found");
1685 return NULL;
1686 }
1687 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001688#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001689}
1690
Guido van Rossum82a5c661998-07-07 20:45:43 +00001691static char getprotobyname_doc[] =
1692"getprotobyname(name) -> integer\n\
1693\n\
1694Return the protocol number for the named protocol. (Rarely used.)";
1695
Guido van Rossum3901d851996-12-19 16:35:04 +00001696
Guido van Rossum30a685f1991-06-27 15:51:29 +00001697/* Python interface to socket(family, type, proto).
1698 The third (protocol) argument is optional.
1699 Return a new socket object. */
1700
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001701/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001702static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001703BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001704{
Guido van Rossum73624e91994-10-10 17:59:00 +00001705 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001706#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001707 SOCKET fd;
1708#else
1709 int fd;
1710#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001711 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001712 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001713 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001714 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001715 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001716 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001717#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001718 if (fd == INVALID_SOCKET)
1719#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001720 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001721#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001722 return PySocket_Err();
1723 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001724 /* If the object can't be created, don't forget to close the
1725 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001726 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001727 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001728 /* From now on, ignore SIGPIPE and let the error checking
1729 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001730#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001731 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001732#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001733 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001734}
1735
Guido van Rossum82a5c661998-07-07 20:45:43 +00001736static char socket_doc[] =
1737"socket(family, type[, proto]) -> socket object\n\
1738\n\
1739Open a socket of the given type. The family argument specifies the\n\
1740address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1741The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1742or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1743specifying the default protocol.";
1744
1745
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001746#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001747/* Create a socket object from a numeric file description.
1748 Useful e.g. if stdin is a socket.
1749 Additional arguments as for socket(). */
1750
1751/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001752static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001753BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001754{
Guido van Rossum73624e91994-10-10 17:59:00 +00001755 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001756 int fd, family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001757 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1758 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001759 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001760 /* Dup the fd so it and the socket can be closed independently */
1761 fd = dup(fd);
1762 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001763 return PySocket_Err();
1764 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001765 /* From now on, ignore SIGPIPE and let the error checking
1766 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001767#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001768 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001769#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001770 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001771}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001772
1773static char fromfd_doc[] =
1774"fromfd(fd, family, type[, proto]) -> socket object\n\
1775\n\
1776Create a socket object from the given file descriptor.\n\
1777The remaining arguments are the same as for socket().";
1778
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001779#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001780
Guido van Rossum82a5c661998-07-07 20:45:43 +00001781
Guido van Rossum006bf911996-06-12 04:04:55 +00001782static PyObject *
1783BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1784{
1785 int x1, x2;
1786
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001787 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001788 return NULL;
1789 }
1790 x2 = (int)ntohs((short)x1);
1791 return PyInt_FromLong(x2);
1792}
1793
Guido van Rossum82a5c661998-07-07 20:45:43 +00001794static char ntohs_doc[] =
1795"ntohs(integer) -> integer\n\
1796\n\
1797Convert a 16-bit integer from network to host byte order.";
1798
1799
Guido van Rossum006bf911996-06-12 04:04:55 +00001800static PyObject *
1801BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1802{
1803 int x1, x2;
1804
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001805 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001806 return NULL;
1807 }
1808 x2 = ntohl(x1);
1809 return PyInt_FromLong(x2);
1810}
1811
Guido van Rossum82a5c661998-07-07 20:45:43 +00001812static char ntohl_doc[] =
1813"ntohl(integer) -> integer\n\
1814\n\
1815Convert a 32-bit integer from network to host byte order.";
1816
1817
Guido van Rossum006bf911996-06-12 04:04:55 +00001818static PyObject *
1819BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1820{
1821 int x1, x2;
1822
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001823 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001824 return NULL;
1825 }
1826 x2 = (int)htons((short)x1);
1827 return PyInt_FromLong(x2);
1828}
1829
Guido van Rossum82a5c661998-07-07 20:45:43 +00001830static char htons_doc[] =
1831"htons(integer) -> integer\n\
1832\n\
1833Convert a 16-bit integer from host to network byte order.";
1834
1835
Guido van Rossum006bf911996-06-12 04:04:55 +00001836static PyObject *
1837BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1838{
1839 int x1, x2;
1840
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001841 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001842 return NULL;
1843 }
1844 x2 = htonl(x1);
1845 return PyInt_FromLong(x2);
1846}
1847
Guido van Rossum82a5c661998-07-07 20:45:43 +00001848static char htonl_doc[] =
1849"htonl(integer) -> integer\n\
1850\n\
1851Convert a 32-bit integer from host to network byte order.";
1852
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001853/*
1854 * socket.inet_aton() and socket.inet_ntoa() functions
1855 *
1856 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
1857 *
1858 */
1859
1860static char inet_aton_doc[] =
1861"inet_aton(string) -> packed 32-bit IP representation\n\
1862\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001863Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001864binary format used in low-level network functions.";
1865
1866static PyObject*
1867BUILD_FUNC_DEF_2(PySocket_inet_aton, PyObject *, self, PyObject *, args)
1868{
Guido van Rossuma2e48551999-09-09 15:42:59 +00001869#ifndef INADDR_NONE
1870#define INADDR_NONE (-1)
1871#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001872
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001873 /* Have to use inet_addr() instead */
1874 char *ip_addr;
1875 long packed_addr;
1876
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001877 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001878 return NULL;
1879 }
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001880#ifdef macintosh
1881 packed_addr = (long)inet_addr(ip_addr).s_addr;
1882#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001883 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001884#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001885
1886 if (packed_addr == INADDR_NONE) { /* invalid address */
1887 PyErr_SetString(PySocket_Error,
1888 "illegal IP address string passed to inet_aton");
1889 return NULL;
1890 }
1891
1892 return PyString_FromStringAndSize((char *) &packed_addr,
1893 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001894}
1895
1896static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00001897"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001898\n\
1899Convert an IP address from 32-bit packed binary format to string format";
1900
1901static PyObject*
1902BUILD_FUNC_DEF_2(PySocket_inet_ntoa, PyObject *, self, PyObject *, args)
1903{
1904 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001905 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001906 struct in_addr packed_addr;
1907
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001908 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001909 return NULL;
1910 }
1911
1912 if (addr_len != sizeof(packed_addr)) {
1913 PyErr_SetString(PySocket_Error,
1914 "packed IP wrong length for inet_ntoa");
1915 return NULL;
1916 }
1917
1918 memcpy(&packed_addr, packed_str, addr_len);
1919
1920 return PyString_FromString(inet_ntoa(packed_addr));
1921}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001922
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001923
1924#ifdef USE_SSL
1925
1926/* This is a C function to be called for new object initialization */
1927static SSLObject *
1928BUILD_FUNC_DEF_3(newSSLObject,
1929 PySocketSockObject *,Sock, char*,key_file, char*,cert_file)
1930{
1931 SSLObject *self;
1932 char *str;
1933
1934#if 0
1935 meth=SSLv23_client_method();
1936 meth=SSLv3_client_method();
1937 meth=SSLv2_client_method();
1938#endif
1939
1940 self = PyObject_NEW(SSLObject, &SSL_Type); /* Create new object */
1941 if (self == NULL){
1942 PyErr_SetObject(SSLErrorObject,
1943 PyString_FromString("newSSLObject error"));
1944 return NULL;
1945 }
1946 memset(self->server, NULL, sizeof(char) * 256);
1947 memset(self->issuer, NULL, sizeof(char) * 256);
1948
1949 self->x_attr = PyDict_New();
1950 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
1951 if (self->ctx == NULL) {
1952 PyErr_SetObject(SSLErrorObject,
1953 PyString_FromString("SSL_CTX_new error"));
1954 PyMem_DEL(self);
1955 return NULL;
1956 }
1957
1958 if ( (key_file && !cert_file) || (!key_file && cert_file) )
1959 {
1960 PyErr_SetObject(SSLErrorObject,
1961 PyString_FromString(
1962 "Both the key & certificate files must be specified"));
1963 PyMem_DEL(self);
1964 return NULL;
1965 }
1966
1967 if (key_file && cert_file)
1968 {
1969 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
1970 SSL_FILETYPE_PEM) < 1)
1971 {
1972 PyErr_SetObject(SSLErrorObject,
1973 PyString_FromString(
1974 "SSL_CTX_use_PrivateKey_file error"));
1975 PyMem_DEL(self);
1976 return NULL;
1977 }
1978
1979 if (SSL_CTX_use_certificate_chain_file(self->ctx,
1980 cert_file) < 1)
1981 {
1982 PyErr_SetObject(SSLErrorObject,
1983 PyString_FromString(
1984 "SSL_CTX_use_certificate_chain_file error"));
1985 PyMem_DEL(self);
1986 return NULL;
1987 }
1988 }
1989
1990 SSL_CTX_set_verify(self->ctx,
1991 SSL_VERIFY_NONE, NULL); /* set verify lvl */
1992 self->ssl = SSL_new(self->ctx); /* New ssl struct */
1993 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
1994 SSL_set_connect_state(self->ssl);
1995
1996 if ((SSL_connect(self->ssl)) == -1) {
1997 /* Actually negotiate SSL connection */
1998 PyErr_SetObject(SSLErrorObject,
1999 PyString_FromString("SSL_connect error"));
2000 PyMem_DEL(self);
2001 return NULL;
2002 }
2003 self->ssl->debug = 1;
2004
2005 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2006 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2007 self->server, 256);
2008 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2009 self->issuer, 256);
2010 }
2011 self->x_attr = NULL;
2012 self->Socket = Sock;
2013 Py_INCREF(self->Socket);
2014 return self;
2015}
2016
2017/* This is the Python function called for new object initialization */
2018static PyObject *
2019BUILD_FUNC_DEF_2(PySocket_ssl, PyObject *, self, PyObject *, args)
2020{
2021 SSLObject *rv;
2022 PySocketSockObject *Sock;
2023 char *key_file;
2024 char *cert_file;
2025
Guido van Rossum43713e52000-02-29 13:59:29 +00002026 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002027 &PySocketSock_Type, (PyObject*)&Sock,
2028 &key_file, &cert_file) )
2029 return NULL;
2030
2031 rv = newSSLObject(Sock, key_file, cert_file);
2032 if ( rv == NULL )
2033 return NULL;
2034 return (PyObject *)rv;
2035}
2036
2037static char ssl_doc[] =
2038"ssl(socket, keyfile, certfile) -> sslobject";
2039
2040static PyObject *
2041BUILD_FUNC_DEF_2(SSL_server, SSLObject *, self, PyObject *, args)
2042{
2043 return PyString_FromString(self->server);
2044}
2045
2046static PyObject *
2047BUILD_FUNC_DEF_2(SSL_issuer, SSLObject *, self, PyObject *, args)
2048{
2049 return PyString_FromString(self->issuer);
2050}
2051
2052
2053/* SSL object methods */
2054
2055static PyMethodDef SSLMethods[] = {
2056 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2057 { "read", (PyCFunction)SSL_SSLread, 1 },
2058 { "server", (PyCFunction)SSL_server, 1 },
2059 { "issuer", (PyCFunction)SSL_issuer, 1 },
2060 { NULL, NULL}
2061};
2062
2063static void SSL_dealloc(SSLObject *self)
2064{
2065 if (self->server_cert) /* Possible not to have one? */
2066 X509_free (self->server_cert);
2067 SSL_CTX_free(self->ctx);
2068 SSL_free(self->ssl);
2069 Py_XDECREF(self->x_attr);
2070 Py_XDECREF(self->Socket);
2071 PyMem_DEL(self);
2072}
2073
2074static PyObject *SSL_getattr(SSLObject *self, char *name)
2075{
2076 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2077}
2078
2079staticforward PyTypeObject SSL_Type = {
2080 PyObject_HEAD_INIT(&PyType_Type)
2081 0, /*ob_size*/
2082 "SSL", /*tp_name*/
2083 sizeof(SSLObject), /*tp_basicsize*/
2084 0, /*tp_itemsize*/
2085 /* methods */
2086 (destructor)SSL_dealloc, /*tp_dealloc*/
2087 0, /*tp_print*/
2088 (getattrfunc)SSL_getattr, /*tp_getattr*/
2089 0, /*tp_setattr*/
2090 0, /*tp_compare*/
2091 0, /*tp_repr*/
2092 0, /*tp_as_number*/
2093 0, /*tp_as_sequence*/
2094 0, /*tp_as_mapping*/
2095 0, /*tp_hash*/
2096};
2097
2098
2099
2100static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2101{
2102 char *data;
2103 int len = 0;
2104
Guido van Rossum43713e52000-02-29 13:59:29 +00002105 if (!PyArg_ParseTuple(args, "s|i:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002106 return NULL;
2107
2108 if (!len)
2109 len = strlen(data);
2110
2111 len = SSL_write(self->ssl, data, len);
2112 return PyInt_FromLong((long)len);
2113}
2114
2115static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2116{
2117 PyObject *buf;
2118 int count = 0;
2119 int len = 1024;
2120 int res;
2121
Guido van Rossum43713e52000-02-29 13:59:29 +00002122 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002123
2124 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2125 return NULL; /* Error object should already be set */
2126
2127 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2128 res = SSL_get_error(self->ssl, count);
2129
2130 switch (res) {
2131 case 0: /* Good return value! */
2132 break;
2133 case 6:
2134 PyErr_SetString(SSLErrorObject, "EOF");
2135 Py_DECREF(buf);
2136 return NULL;
2137 break;
2138 case 5:
2139 default:
2140 return PyErr_SetFromErrno(SSLErrorObject);
2141 break;
2142 }
2143
2144 fflush(stderr);
2145
2146 if (count < 0) {
2147 Py_DECREF(buf);
2148 return PyErr_SetFromErrno(SSLErrorObject);
2149 }
2150
2151 if (count != len && _PyString_Resize(&buf, count) < 0)
2152 return NULL;
2153 return buf;
2154}
2155
2156#endif /* USE_SSL */
2157
2158
Guido van Rossum30a685f1991-06-27 15:51:29 +00002159/* List of functions exported by this module. */
2160
Guido van Rossum73624e91994-10-10 17:59:00 +00002161static PyMethodDef PySocket_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002162 {"gethostbyname", PySocket_gethostbyname, 1, gethostbyname_doc},
2163 {"gethostbyname_ex", PySocket_gethostbyname_ex, 1, ghbn_ex_doc},
2164 {"gethostbyaddr", PySocket_gethostbyaddr, 1, gethostbyaddr_doc},
2165 {"gethostname", PySocket_gethostname, 1, gethostname_doc},
2166 {"getservbyname", PySocket_getservbyname, 1, getservbyname_doc},
2167 {"getprotobyname", PySocket_getprotobyname, 1,getprotobyname_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00002168 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002169#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00002170 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002171#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002172 {"ntohs", PySocket_ntohs, 1, ntohs_doc},
2173 {"ntohl", PySocket_ntohl, 1, ntohl_doc},
2174 {"htons", PySocket_htons, 1, htons_doc},
2175 {"htonl", PySocket_htonl, 1, htonl_doc},
2176 {"inet_aton", PySocket_inet_aton, 1, inet_aton_doc},
2177 {"inet_ntoa", PySocket_inet_ntoa, 1, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002178#ifdef USE_SSL
2179 {"ssl", PySocket_ssl, 1, ssl_doc},
2180#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002181 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002182};
2183
Guido van Rossum30a685f1991-06-27 15:51:29 +00002184
2185/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002186 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002187 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002188 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002189static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002190BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002191{
Guido van Rossum73624e91994-10-10 17:59:00 +00002192 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002193 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002194 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002195
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002196 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002197}
2198
Guido van Rossum30a685f1991-06-27 15:51:29 +00002199
Guido van Rossum8d665e61996-06-26 18:22:49 +00002200#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002201
2202/* Additional initialization and cleanup for NT/Windows */
2203
2204static void
2205NTcleanup()
2206{
2207 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002208}
2209
2210static int
2211NTinit()
2212{
2213 WSADATA WSAData;
2214 int ret;
2215 char buf[100];
2216 ret = WSAStartup(0x0101, &WSAData);
2217 switch (ret) {
2218 case 0: /* no error */
2219 atexit(NTcleanup);
2220 return 1;
2221 case WSASYSNOTREADY:
2222 PyErr_SetString(PyExc_ImportError,
2223 "WSAStartup failed: network not ready");
2224 break;
2225 case WSAVERNOTSUPPORTED:
2226 case WSAEINVAL:
2227 PyErr_SetString(PyExc_ImportError,
2228 "WSAStartup failed: requested version not supported");
2229 break;
2230 default:
2231 sprintf(buf, "WSAStartup failed: error code %d", ret);
2232 PyErr_SetString(PyExc_ImportError, buf);
2233 break;
2234 }
2235 return 0;
2236}
2237
Guido van Rossum8d665e61996-06-26 18:22:49 +00002238#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002239
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002240#if defined(PYOS_OS2)
2241
2242/* Additional initialization and cleanup for OS/2 */
2243
2244static void
2245OS2cleanup()
2246{
2247 /* No cleanup is necessary for OS/2 Sockets */
2248}
2249
2250static int
2251OS2init()
2252{
2253 char reason[64];
2254 int rc = sock_init();
2255
2256 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002257 atexit(OS2cleanup);
2258 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002259 }
2260
2261 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2262 PyErr_SetString(PyExc_ImportError, reason);
2263
Guido van Rossum32c575d1997-12-02 20:37:32 +00002264 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002265}
2266
2267#endif /* PYOS_OS2 */
2268
Guido van Rossum30a685f1991-06-27 15:51:29 +00002269/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002270 * This is called when the first 'import socket' is done,
2271 * via a table in config.c, if config.c is compiled with USE_SOCKET
2272 * defined.
2273 *
2274 * For MS_WINDOWS (which means any Windows variant), this module
2275 * is actually called "_socket", and there's a wrapper "socket.py"
2276 * which implements some missing functionality (such as makefile(),
2277 * dup() and fromfd()). The import of "_socket" may fail with an
2278 * ImportError exception if initialization of WINSOCK fails. When
2279 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2280 * scheduled to be made at exit time.
2281 *
2282 * For OS/2, this module is also called "_socket" and uses a wrapper
2283 * "socket.py" which implements that functionality that is missing
2284 * when PC operating systems don't put socket descriptors in the
2285 * operating system's filesystem layer.
2286 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002287
Guido van Rossum82a5c661998-07-07 20:45:43 +00002288static char module_doc[] =
2289"This module provides socket operations and some related functions.\n\
2290On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
2291On other systems, it only supports IP.\n\
2292\n\
2293Functions:\n\
2294\n\
2295socket() -- create a new socket object\n\
2296fromfd() -- create a socket object from an open file descriptor (*)\n\
2297gethostname() -- return the current hostname\n\
2298gethostbyname() -- map a hostname to its IP number\n\
2299gethostbyaddr() -- map an IP number or hostname to DNS info\n\
2300getservbyname() -- map a service name and a protocol name to a port number\n\
2301getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
2302ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
2303htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002304inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format\n\
2305inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)\n\
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002306ssl() -- secure socket layer support (only available if configured)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002307\n\
2308(*) not available on all platforms!)\n\
2309\n\
2310Special objects:\n\
2311\n\
2312SocketType -- type object for socket objects\n\
2313error -- exception raised for I/O errors\n\
2314\n\
2315Integer constants:\n\
2316\n\
2317AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
2318SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
2319\n\
2320Many other constants may be defined; these may be used in calls to\n\
2321the setsockopt() and getsockopt() methods.\n\
2322";
2323
2324static char sockettype_doc[] =
2325"A socket represents one endpoint of a network connection.\n\
2326\n\
2327Methods:\n\
2328\n\
2329accept() -- accept a connection, returning new socket and client address\n\
2330bind() -- bind the socket to a local address\n\
2331close() -- close the socket\n\
2332connect() -- connect the socket to a remote address\n\
2333connect_ex() -- connect, return an error code instead of an exception \n\
2334dup() -- return a new socket object identical to the current one (*)\n\
2335fileno() -- return underlying file descriptor\n\
2336getpeername() -- return remote address (*)\n\
2337getsockname() -- return local address\n\
2338getsockopt() -- get socket options\n\
2339listen() -- start listening for incoming connections\n\
2340makefile() -- return a file object corresponding tot the socket (*)\n\
2341recv() -- receive data\n\
2342recvfrom() -- receive data and sender's address\n\
2343send() -- send data\n\
2344sendto() -- send data to a given address\n\
2345setblocking() -- set or clear the blocking I/O flag\n\
2346setsockopt() -- set socket options\n\
2347shutdown() -- shut down traffic in one or both directions\n\
2348\n\
2349(*) not available on all platforms!)";
2350
Guido van Rossum3886bb61998-12-04 18:50:17 +00002351DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00002352#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002353init_socket()
2354#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002355initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00002356#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002357{
Guido van Rossum73624e91994-10-10 17:59:00 +00002358 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00002359#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002360 if (!NTinit())
2361 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002362 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002363#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002364#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002365 if (!OS2init())
2366 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002367 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002368#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00002369#if defined(__BEOS__)
2370 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
2371#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002372 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002373#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00002374#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00002375#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002376 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002377 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2378 if (PySocket_Error == NULL)
2379 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002380#ifdef USE_SSL
2381 SSL_load_error_strings();
2382 SSLeay_add_ssl_algorithms();
2383 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2384 if (SSLErrorObject == NULL)
2385 return;
2386 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2387 Py_INCREF(&SSL_Type);
2388 if (PyDict_SetItemString(d, "SSLType",
2389 (PyObject *)&SSL_Type) != 0)
2390 return;
2391#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002392 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002393 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002394 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002395 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002396 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002397 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002398 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002399
2400 /* Address families (we only support AF_INET and AF_UNIX) */
2401#ifdef AF_UNSPEC
2402 insint(d, "AF_UNSPEC", AF_UNSPEC);
2403#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002404 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002405#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002406 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002407#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002408#ifdef AF_AX25
2409 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2410#endif
2411#ifdef AF_IPX
2412 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2413#endif
2414#ifdef AF_APPLETALK
2415 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2416#endif
2417#ifdef AF_NETROM
2418 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2419#endif
2420#ifdef AF_BRIDGE
2421 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2422#endif
2423#ifdef AF_AAL5
2424 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2425#endif
2426#ifdef AF_X25
2427 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2428#endif
2429#ifdef AF_INET6
2430 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2431#endif
2432#ifdef AF_ROSE
2433 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2434#endif
2435
2436 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002437 insint(d, "SOCK_STREAM", SOCK_STREAM);
2438 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002439#ifndef __BEOS__
2440/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002441 insint(d, "SOCK_RAW", SOCK_RAW);
2442 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2443 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002444#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002445
2446#ifdef SO_DEBUG
2447 insint(d, "SO_DEBUG", SO_DEBUG);
2448#endif
2449#ifdef SO_ACCEPTCONN
2450 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2451#endif
2452#ifdef SO_REUSEADDR
2453 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2454#endif
2455#ifdef SO_KEEPALIVE
2456 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2457#endif
2458#ifdef SO_DONTROUTE
2459 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2460#endif
2461#ifdef SO_BROADCAST
2462 insint(d, "SO_BROADCAST", SO_BROADCAST);
2463#endif
2464#ifdef SO_USELOOPBACK
2465 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2466#endif
2467#ifdef SO_LINGER
2468 insint(d, "SO_LINGER", SO_LINGER);
2469#endif
2470#ifdef SO_OOBINLINE
2471 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2472#endif
2473#ifdef SO_REUSEPORT
2474 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2475#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002476#ifdef SO_SNDBUF
2477 insint(d, "SO_SNDBUF", SO_SNDBUF);
2478#endif
2479#ifdef SO_RCVBUF
2480 insint(d, "SO_RCVBUF", SO_RCVBUF);
2481#endif
2482#ifdef SO_SNDLOWAT
2483 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2484#endif
2485#ifdef SO_RCVLOWAT
2486 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2487#endif
2488#ifdef SO_SNDTIMEO
2489 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2490#endif
2491#ifdef SO_RCVTIMEO
2492 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2493#endif
2494#ifdef SO_ERROR
2495 insint(d, "SO_ERROR", SO_ERROR);
2496#endif
2497#ifdef SO_TYPE
2498 insint(d, "SO_TYPE", SO_TYPE);
2499#endif
2500
2501 /* Maximum number of connections for "listen" */
2502#ifdef SOMAXCONN
2503 insint(d, "SOMAXCONN", SOMAXCONN);
2504#else
2505 insint(d, "SOMAXCONN", 5); /* Common value */
2506#endif
2507
2508 /* Flags for send, recv */
2509#ifdef MSG_OOB
2510 insint(d, "MSG_OOB", MSG_OOB);
2511#endif
2512#ifdef MSG_PEEK
2513 insint(d, "MSG_PEEK", MSG_PEEK);
2514#endif
2515#ifdef MSG_DONTROUTE
2516 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2517#endif
2518#ifdef MSG_EOR
2519 insint(d, "MSG_EOR", MSG_EOR);
2520#endif
2521#ifdef MSG_TRUNC
2522 insint(d, "MSG_TRUNC", MSG_TRUNC);
2523#endif
2524#ifdef MSG_CTRUNC
2525 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2526#endif
2527#ifdef MSG_WAITALL
2528 insint(d, "MSG_WAITALL", MSG_WAITALL);
2529#endif
2530#ifdef MSG_BTAG
2531 insint(d, "MSG_BTAG", MSG_BTAG);
2532#endif
2533#ifdef MSG_ETAG
2534 insint(d, "MSG_ETAG", MSG_ETAG);
2535#endif
2536
2537 /* Protocol level and numbers, usable for [gs]etsockopt */
2538#ifdef SOL_SOCKET
2539 insint(d, "SOL_SOCKET", SOL_SOCKET);
2540#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002541#ifdef SOL_IP
2542 insint(d, "SOL_IP", SOL_IP);
2543#else
2544 insint(d, "SOL_IP", 0);
2545#endif
2546#ifdef SOL_IPX
2547 insint(d, "SOL_IPX", SOL_IPX);
2548#endif
2549#ifdef SOL_AX25
2550 insint(d, "SOL_AX25", SOL_AX25);
2551#endif
2552#ifdef SOL_ATALK
2553 insint(d, "SOL_ATALK", SOL_ATALK);
2554#endif
2555#ifdef SOL_NETROM
2556 insint(d, "SOL_NETROM", SOL_NETROM);
2557#endif
2558#ifdef SOL_ROSE
2559 insint(d, "SOL_ROSE", SOL_ROSE);
2560#endif
2561#ifdef SOL_TCP
2562 insint(d, "SOL_TCP", SOL_TCP);
2563#else
2564 insint(d, "SOL_TCP", 6);
2565#endif
2566#ifdef SOL_UDP
2567 insint(d, "SOL_UDP", SOL_UDP);
2568#else
2569 insint(d, "SOL_UDP", 17);
2570#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002571#ifdef IPPROTO_IP
2572 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002573#else
2574 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002575#endif
2576#ifdef IPPROTO_ICMP
2577 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002578#else
2579 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002580#endif
2581#ifdef IPPROTO_IGMP
2582 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2583#endif
2584#ifdef IPPROTO_GGP
2585 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2586#endif
2587#ifdef IPPROTO_TCP
2588 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002589#else
2590 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002591#endif
2592#ifdef IPPROTO_EGP
2593 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2594#endif
2595#ifdef IPPROTO_PUP
2596 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2597#endif
2598#ifdef IPPROTO_UDP
2599 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002600#else
2601 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002602#endif
2603#ifdef IPPROTO_IDP
2604 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2605#endif
2606#ifdef IPPROTO_HELLO
2607 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2608#endif
2609#ifdef IPPROTO_ND
2610 insint(d, "IPPROTO_ND", IPPROTO_ND);
2611#endif
2612#ifdef IPPROTO_TP
2613 insint(d, "IPPROTO_TP", IPPROTO_TP);
2614#endif
2615#ifdef IPPROTO_XTP
2616 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2617#endif
2618#ifdef IPPROTO_EON
2619 insint(d, "IPPROTO_EON", IPPROTO_EON);
2620#endif
2621#ifdef IPPROTO_BIP
2622 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2623#endif
2624/**/
2625#ifdef IPPROTO_RAW
2626 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002627#else
2628 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002629#endif
2630#ifdef IPPROTO_MAX
2631 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2632#endif
2633
2634 /* Some port configuration */
2635#ifdef IPPORT_RESERVED
2636 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2637#else
2638 insint(d, "IPPORT_RESERVED", 1024);
2639#endif
2640#ifdef IPPORT_USERRESERVED
2641 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2642#else
2643 insint(d, "IPPORT_USERRESERVED", 5000);
2644#endif
2645
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002646 /* Some reserved IP v.4 addresses */
2647#ifdef INADDR_ANY
2648 insint(d, "INADDR_ANY", INADDR_ANY);
2649#else
2650 insint(d, "INADDR_ANY", 0x00000000);
2651#endif
2652#ifdef INADDR_BROADCAST
2653 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2654#else
2655 insint(d, "INADDR_BROADCAST", 0xffffffff);
2656#endif
2657#ifdef INADDR_LOOPBACK
2658 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2659#else
2660 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2661#endif
2662#ifdef INADDR_UNSPEC_GROUP
2663 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2664#else
2665 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2666#endif
2667#ifdef INADDR_ALLHOSTS_GROUP
2668 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2669#else
2670 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2671#endif
2672#ifdef INADDR_MAX_LOCAL_GROUP
2673 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2674#else
2675 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2676#endif
2677#ifdef INADDR_NONE
2678 insint(d, "INADDR_NONE", INADDR_NONE);
2679#else
2680 insint(d, "INADDR_NONE", 0xffffffff);
2681#endif
2682
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002683 /* IP [gs]etsockopt options */
2684#ifdef IP_OPTIONS
2685 insint(d, "IP_OPTIONS", IP_OPTIONS);
2686#endif
2687#ifdef IP_HDRINCL
2688 insint(d, "IP_HDRINCL", IP_HDRINCL);
2689#endif
2690#ifdef IP_TOS
2691 insint(d, "IP_TOS", IP_TOS);
2692#endif
2693#ifdef IP_TTL
2694 insint(d, "IP_TTL", IP_TTL);
2695#endif
2696#ifdef IP_RECVOPTS
2697 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2698#endif
2699#ifdef IP_RECVRETOPTS
2700 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2701#endif
2702#ifdef IP_RECVDSTADDR
2703 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2704#endif
2705#ifdef IP_RETOPTS
2706 insint(d, "IP_RETOPTS", IP_RETOPTS);
2707#endif
2708#ifdef IP_MULTICAST_IF
2709 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2710#endif
2711#ifdef IP_MULTICAST_TTL
2712 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2713#endif
2714#ifdef IP_MULTICAST_LOOP
2715 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2716#endif
2717#ifdef IP_ADD_MEMBERSHIP
2718 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2719#endif
2720#ifdef IP_DROP_MEMBERSHIP
2721 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2722#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002723#ifdef IP_DEFAULT_MULTICAST_TTL
2724 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2725#endif
2726#ifdef IP_DEFAULT_MULTICAST_LOOP
2727 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2728#endif
2729#ifdef IP_MAX_MEMBERSHIPS
2730 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2731#endif
2732
2733 /* TCP options */
2734#ifdef TCP_NODELAY
2735 insint(d, "TCP_NODELAY", TCP_NODELAY);
2736#endif
2737#ifdef TCP_MAXSEG
2738 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2739#endif
2740
2741 /* IPX options */
2742#ifdef IPX_TYPE
2743 insint(d, "IPX_TYPE", IPX_TYPE);
2744#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002745
2746 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002747#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002748 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002749#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002750}