blob: b96ba657af52ec806106636d805ffce0be0eed9b [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{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001359 if (s->sock_fd != -1)
1360 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001361 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001362}
1363
Guido van Rossum30a685f1991-06-27 15:51:29 +00001364
1365/* Return a socket object's named attribute. */
1366
Guido van Rossum73624e91994-10-10 17:59:00 +00001367static PyObject *
1368BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001369{
Guido van Rossum73624e91994-10-10 17:59:00 +00001370 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001371}
1372
Guido van Rossum30a685f1991-06-27 15:51:29 +00001373
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001374static PyObject *
1375BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1376{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001377 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001378 sprintf(buf,
1379 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1380 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001381 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001382}
1383
1384
Guido van Rossumb6775db1994-08-01 11:34:53 +00001385/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001386
Guido van Rossum73624e91994-10-10 17:59:00 +00001387static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001388 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001389 0,
1390 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001391 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001392 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001393 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001394 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001395 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001396 0, /*tp_setattr*/
1397 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001398 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001399 0, /*tp_as_number*/
1400 0, /*tp_as_sequence*/
1401 0, /*tp_as_mapping*/
1402};
1403
Guido van Rossum30a685f1991-06-27 15:51:29 +00001404
Guido van Rossum81194471991-07-27 21:42:02 +00001405/* Python interface to gethostname(). */
1406
1407/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001408static PyObject *
1409BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001410{
1411 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001412 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001413 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001414 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001415 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001416 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001417 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001418 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001419 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001420 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001421 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001422}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001423
Guido van Rossum82a5c661998-07-07 20:45:43 +00001424static char gethostname_doc[] =
1425"gethostname() -> string\n\
1426\n\
1427Return the current host name.";
1428
Guido van Rossumff4949e1992-08-05 19:58:53 +00001429
Guido van Rossum30a685f1991-06-27 15:51:29 +00001430/* Python interface to gethostbyname(name). */
1431
1432/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001433static PyObject *
1434BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001435{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001436 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001437 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001438 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001439 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001440 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001441 return NULL;
1442 return makeipaddr(&addrbuf);
1443}
1444
Guido van Rossum82a5c661998-07-07 20:45:43 +00001445static char gethostbyname_doc[] =
1446"gethostbyname(host) -> address\n\
1447\n\
1448Return the IP address (a string of the form '255.255.255.255') for a host.";
1449
1450
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001451/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1452
1453static PyObject *
1454gethost_common(h, addr)
1455 struct hostent *h;
1456 struct sockaddr_in *addr;
1457{
1458 char **pch;
1459 PyObject *rtn_tuple = (PyObject *)NULL;
1460 PyObject *name_list = (PyObject *)NULL;
1461 PyObject *addr_list = (PyObject *)NULL;
1462 PyObject *tmp;
1463 if (h == NULL) {
1464#ifdef HAVE_HSTRERROR
1465 /* Let's get real error message to return */
1466 extern int h_errno;
1467 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1468#else
1469 PyErr_SetString(PySocket_Error, "host not found");
1470#endif
1471 return NULL;
1472 }
1473 if ((name_list = PyList_New(0)) == NULL)
1474 goto err;
1475 if ((addr_list = PyList_New(0)) == NULL)
1476 goto err;
1477 for (pch = h->h_aliases; *pch != NULL; pch++) {
1478 int status;
1479 tmp = PyString_FromString(*pch);
1480 if (tmp == NULL)
1481 goto err;
1482 status = PyList_Append(name_list, tmp);
1483 Py_DECREF(tmp);
1484 if (status)
1485 goto err;
1486 }
1487 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1488 int status;
1489 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1490 tmp = makeipaddr(addr);
1491 if (tmp == NULL)
1492 goto err;
1493 status = PyList_Append(addr_list, tmp);
1494 Py_DECREF(tmp);
1495 if (status)
1496 goto err;
1497 }
1498 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1499 err:
1500 Py_XDECREF(name_list);
1501 Py_XDECREF(addr_list);
1502 return rtn_tuple;
1503}
1504
1505
1506/* Python interface to gethostbyname_ex(name). */
1507
1508/*ARGSUSED*/
1509static PyObject *
1510BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1511{
1512 char *name;
1513 struct hostent *h;
1514 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001515 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001516#ifdef HAVE_GETHOSTBYNAME_R
1517 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001518#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1519 struct hostent_data data;
1520#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001521 char buf[16384];
1522 int buf_len = (sizeof buf) - 1;
1523 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001524#endif
1525#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001526 int result;
1527#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001528#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001529 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001530 return NULL;
1531 if (setipaddr(name, &addr) < 0)
1532 return NULL;
1533 Py_BEGIN_ALLOW_THREADS
1534#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001535#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001536 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001537#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001538 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001539#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001540 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001541 result = gethostbyname_r(name, &hp_allocated, &data);
1542 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001543#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001544#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001545#ifdef USE_GETHOSTBYNAME_LOCK
1546 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001547#endif
1548 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001549#endif /* HAVE_GETHOSTBYNAME_R */
1550 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001551 ret = gethost_common(h, &addr);
1552#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001553 PyThread_release_lock(gethostbyname_lock);
1554#endif
1555 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001556}
1557
1558static char ghbn_ex_doc[] =
1559"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1560\n\
1561Return the true host name, a list of aliases, and a list of IP addresses,\n\
1562for a host. The host argument is a string giving a host name or IP number.";
1563
1564
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001565/* Python interface to gethostbyaddr(IP). */
1566
1567/*ARGSUSED*/
1568static PyObject *
1569BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1570{
1571 struct sockaddr_in addr;
1572 char *ip_num;
1573 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001574 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001575#ifdef HAVE_GETHOSTBYNAME_R
1576 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001577#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1578 struct hostent_data data;
1579#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001580 char buf[16384];
1581 int buf_len = (sizeof buf) - 1;
1582 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001583#endif
1584#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001585 int result;
1586#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001587#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001588
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001589 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001590 return NULL;
1591 if (setipaddr(ip_num, &addr) < 0)
1592 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001593 Py_BEGIN_ALLOW_THREADS
1594#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001595#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001596 result = gethostbyaddr_r((char *)&addr.sin_addr,
1597 sizeof(addr.sin_addr),
1598 AF_INET, &hp_allocated, buf, buf_len,
1599 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001600#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001601 h = gethostbyaddr_r((char *)&addr.sin_addr,
1602 sizeof(addr.sin_addr),
1603 AF_INET,
1604 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001605#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001606 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001607 result = gethostbyaddr_r((char *)&addr.sin_addr,
1608 sizeof(addr.sin_addr),
1609 AF_INET, &hp_allocated, &data);
1610 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001611#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001612#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001613#ifdef USE_GETHOSTBYNAME_LOCK
1614 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001615#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001616 h = gethostbyaddr((char *)&addr.sin_addr,
1617 sizeof(addr.sin_addr),
1618 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001619#endif /* HAVE_GETHOSTBYNAME_R */
1620 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001621 ret = gethost_common(h, &addr);
1622#ifdef USE_GETHOSTBYNAME_LOCK
1623 PyThread_release_lock(gethostbyname_lock);
1624#endif
1625 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001626}
1627
Guido van Rossum82a5c661998-07-07 20:45:43 +00001628static char gethostbyaddr_doc[] =
1629"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1630\n\
1631Return the true host name, a list of aliases, and a list of IP addresses,\n\
1632for a host. The host argument is a string giving a host name or IP number.";
1633
Guido van Rossum30a685f1991-06-27 15:51:29 +00001634
1635/* Python interface to getservbyname(name).
1636 This only returns the port number, since the other info is already
1637 known or not useful (like the list of aliases). */
1638
1639/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001640static PyObject *
1641BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001642{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001643 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001644 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001645 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001646 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001647 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001648 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001649 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001650 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001651 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001652 return NULL;
1653 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001654 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001655}
1656
Guido van Rossum82a5c661998-07-07 20:45:43 +00001657static char getservbyname_doc[] =
1658"getservbyname(servicename, protocolname) -> integer\n\
1659\n\
1660Return a port number from a service name and protocol name.\n\
1661The protocol name should be 'tcp' or 'udp'.";
1662
Guido van Rossum30a685f1991-06-27 15:51:29 +00001663
Guido van Rossum3901d851996-12-19 16:35:04 +00001664/* Python interface to getprotobyname(name).
1665 This only returns the protocol number, since the other info is
1666 already known or not useful (like the list of aliases). */
1667
1668/*ARGSUSED*/
1669static PyObject *
1670BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1671{
1672 char *name;
1673 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001674#ifdef __BEOS__
1675/* Not available in BeOS yet. - [cjh] */
1676 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1677 return NULL;
1678#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001679 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001680 return NULL;
1681 Py_BEGIN_ALLOW_THREADS
1682 sp = getprotobyname(name);
1683 Py_END_ALLOW_THREADS
1684 if (sp == NULL) {
1685 PyErr_SetString(PySocket_Error, "protocol not found");
1686 return NULL;
1687 }
1688 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001689#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001690}
1691
Guido van Rossum82a5c661998-07-07 20:45:43 +00001692static char getprotobyname_doc[] =
1693"getprotobyname(name) -> integer\n\
1694\n\
1695Return the protocol number for the named protocol. (Rarely used.)";
1696
Guido van Rossum3901d851996-12-19 16:35:04 +00001697
Guido van Rossum30a685f1991-06-27 15:51:29 +00001698/* Python interface to socket(family, type, proto).
1699 The third (protocol) argument is optional.
1700 Return a new socket object. */
1701
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001702/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001703static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001704BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001705{
Guido van Rossum73624e91994-10-10 17:59:00 +00001706 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001707#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001708 SOCKET fd;
1709#else
1710 int fd;
1711#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001712 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001713 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001714 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001715 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001716 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001717 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001718#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001719 if (fd == INVALID_SOCKET)
1720#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001721 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001722#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001723 return PySocket_Err();
1724 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001725 /* If the object can't be created, don't forget to close the
1726 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001727 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001728 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001729 /* From now on, ignore SIGPIPE and let the error checking
1730 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001731#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001732 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001733#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001734 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001735}
1736
Guido van Rossum82a5c661998-07-07 20:45:43 +00001737static char socket_doc[] =
1738"socket(family, type[, proto]) -> socket object\n\
1739\n\
1740Open a socket of the given type. The family argument specifies the\n\
1741address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1742The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1743or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1744specifying the default protocol.";
1745
1746
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001747#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001748/* Create a socket object from a numeric file description.
1749 Useful e.g. if stdin is a socket.
1750 Additional arguments as for socket(). */
1751
1752/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001753static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001754BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001755{
Guido van Rossum73624e91994-10-10 17:59:00 +00001756 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001757 int fd, family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001758 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1759 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001760 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001761 /* Dup the fd so it and the socket can be closed independently */
1762 fd = dup(fd);
1763 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001764 return PySocket_Err();
1765 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001766 /* From now on, ignore SIGPIPE and let the error checking
1767 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001768#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001769 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001770#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001771 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001772}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001773
1774static char fromfd_doc[] =
1775"fromfd(fd, family, type[, proto]) -> socket object\n\
1776\n\
1777Create a socket object from the given file descriptor.\n\
1778The remaining arguments are the same as for socket().";
1779
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001780#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001781
Guido van Rossum82a5c661998-07-07 20:45:43 +00001782
Guido van Rossum006bf911996-06-12 04:04:55 +00001783static PyObject *
1784BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1785{
1786 int x1, x2;
1787
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001788 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001789 return NULL;
1790 }
1791 x2 = (int)ntohs((short)x1);
1792 return PyInt_FromLong(x2);
1793}
1794
Guido van Rossum82a5c661998-07-07 20:45:43 +00001795static char ntohs_doc[] =
1796"ntohs(integer) -> integer\n\
1797\n\
1798Convert a 16-bit integer from network to host byte order.";
1799
1800
Guido van Rossum006bf911996-06-12 04:04:55 +00001801static PyObject *
1802BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1803{
1804 int x1, x2;
1805
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001806 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001807 return NULL;
1808 }
1809 x2 = ntohl(x1);
1810 return PyInt_FromLong(x2);
1811}
1812
Guido van Rossum82a5c661998-07-07 20:45:43 +00001813static char ntohl_doc[] =
1814"ntohl(integer) -> integer\n\
1815\n\
1816Convert a 32-bit integer from network to host byte order.";
1817
1818
Guido van Rossum006bf911996-06-12 04:04:55 +00001819static PyObject *
1820BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1821{
1822 int x1, x2;
1823
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001824 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001825 return NULL;
1826 }
1827 x2 = (int)htons((short)x1);
1828 return PyInt_FromLong(x2);
1829}
1830
Guido van Rossum82a5c661998-07-07 20:45:43 +00001831static char htons_doc[] =
1832"htons(integer) -> integer\n\
1833\n\
1834Convert a 16-bit integer from host to network byte order.";
1835
1836
Guido van Rossum006bf911996-06-12 04:04:55 +00001837static PyObject *
1838BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1839{
1840 int x1, x2;
1841
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001842 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001843 return NULL;
1844 }
1845 x2 = htonl(x1);
1846 return PyInt_FromLong(x2);
1847}
1848
Guido van Rossum82a5c661998-07-07 20:45:43 +00001849static char htonl_doc[] =
1850"htonl(integer) -> integer\n\
1851\n\
1852Convert a 32-bit integer from host to network byte order.";
1853
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001854/*
1855 * socket.inet_aton() and socket.inet_ntoa() functions
1856 *
1857 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
1858 *
1859 */
1860
1861static char inet_aton_doc[] =
1862"inet_aton(string) -> packed 32-bit IP representation\n\
1863\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001864Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001865binary format used in low-level network functions.";
1866
1867static PyObject*
1868BUILD_FUNC_DEF_2(PySocket_inet_aton, PyObject *, self, PyObject *, args)
1869{
Guido van Rossuma2e48551999-09-09 15:42:59 +00001870#ifndef INADDR_NONE
1871#define INADDR_NONE (-1)
1872#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001873
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001874 /* Have to use inet_addr() instead */
1875 char *ip_addr;
1876 long packed_addr;
1877
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001878 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001879 return NULL;
1880 }
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001881#ifdef macintosh
1882 packed_addr = (long)inet_addr(ip_addr).s_addr;
1883#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001884 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001885#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001886
1887 if (packed_addr == INADDR_NONE) { /* invalid address */
1888 PyErr_SetString(PySocket_Error,
1889 "illegal IP address string passed to inet_aton");
1890 return NULL;
1891 }
1892
1893 return PyString_FromStringAndSize((char *) &packed_addr,
1894 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001895}
1896
1897static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00001898"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001899\n\
1900Convert an IP address from 32-bit packed binary format to string format";
1901
1902static PyObject*
1903BUILD_FUNC_DEF_2(PySocket_inet_ntoa, PyObject *, self, PyObject *, args)
1904{
1905 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001906 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001907 struct in_addr packed_addr;
1908
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001909 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001910 return NULL;
1911 }
1912
1913 if (addr_len != sizeof(packed_addr)) {
1914 PyErr_SetString(PySocket_Error,
1915 "packed IP wrong length for inet_ntoa");
1916 return NULL;
1917 }
1918
1919 memcpy(&packed_addr, packed_str, addr_len);
1920
1921 return PyString_FromString(inet_ntoa(packed_addr));
1922}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001923
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001924
1925#ifdef USE_SSL
1926
1927/* This is a C function to be called for new object initialization */
1928static SSLObject *
1929BUILD_FUNC_DEF_3(newSSLObject,
1930 PySocketSockObject *,Sock, char*,key_file, char*,cert_file)
1931{
1932 SSLObject *self;
1933 char *str;
1934
1935#if 0
1936 meth=SSLv23_client_method();
1937 meth=SSLv3_client_method();
1938 meth=SSLv2_client_method();
1939#endif
1940
1941 self = PyObject_NEW(SSLObject, &SSL_Type); /* Create new object */
1942 if (self == NULL){
1943 PyErr_SetObject(SSLErrorObject,
1944 PyString_FromString("newSSLObject error"));
1945 return NULL;
1946 }
1947 memset(self->server, NULL, sizeof(char) * 256);
1948 memset(self->issuer, NULL, sizeof(char) * 256);
1949
1950 self->x_attr = PyDict_New();
1951 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
1952 if (self->ctx == NULL) {
1953 PyErr_SetObject(SSLErrorObject,
1954 PyString_FromString("SSL_CTX_new error"));
1955 PyMem_DEL(self);
1956 return NULL;
1957 }
1958
1959 if ( (key_file && !cert_file) || (!key_file && cert_file) )
1960 {
1961 PyErr_SetObject(SSLErrorObject,
1962 PyString_FromString(
1963 "Both the key & certificate files must be specified"));
1964 PyMem_DEL(self);
1965 return NULL;
1966 }
1967
1968 if (key_file && cert_file)
1969 {
1970 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
1971 SSL_FILETYPE_PEM) < 1)
1972 {
1973 PyErr_SetObject(SSLErrorObject,
1974 PyString_FromString(
1975 "SSL_CTX_use_PrivateKey_file error"));
1976 PyMem_DEL(self);
1977 return NULL;
1978 }
1979
1980 if (SSL_CTX_use_certificate_chain_file(self->ctx,
1981 cert_file) < 1)
1982 {
1983 PyErr_SetObject(SSLErrorObject,
1984 PyString_FromString(
1985 "SSL_CTX_use_certificate_chain_file error"));
1986 PyMem_DEL(self);
1987 return NULL;
1988 }
1989 }
1990
1991 SSL_CTX_set_verify(self->ctx,
1992 SSL_VERIFY_NONE, NULL); /* set verify lvl */
1993 self->ssl = SSL_new(self->ctx); /* New ssl struct */
1994 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
1995 SSL_set_connect_state(self->ssl);
1996
1997 if ((SSL_connect(self->ssl)) == -1) {
1998 /* Actually negotiate SSL connection */
1999 PyErr_SetObject(SSLErrorObject,
2000 PyString_FromString("SSL_connect error"));
2001 PyMem_DEL(self);
2002 return NULL;
2003 }
2004 self->ssl->debug = 1;
2005
2006 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2007 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2008 self->server, 256);
2009 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2010 self->issuer, 256);
2011 }
2012 self->x_attr = NULL;
2013 self->Socket = Sock;
2014 Py_INCREF(self->Socket);
2015 return self;
2016}
2017
2018/* This is the Python function called for new object initialization */
2019static PyObject *
2020BUILD_FUNC_DEF_2(PySocket_ssl, PyObject *, self, PyObject *, args)
2021{
2022 SSLObject *rv;
2023 PySocketSockObject *Sock;
2024 char *key_file;
2025 char *cert_file;
2026
Guido van Rossum43713e52000-02-29 13:59:29 +00002027 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002028 &PySocketSock_Type, (PyObject*)&Sock,
2029 &key_file, &cert_file) )
2030 return NULL;
2031
2032 rv = newSSLObject(Sock, key_file, cert_file);
2033 if ( rv == NULL )
2034 return NULL;
2035 return (PyObject *)rv;
2036}
2037
2038static char ssl_doc[] =
2039"ssl(socket, keyfile, certfile) -> sslobject";
2040
2041static PyObject *
2042BUILD_FUNC_DEF_2(SSL_server, SSLObject *, self, PyObject *, args)
2043{
2044 return PyString_FromString(self->server);
2045}
2046
2047static PyObject *
2048BUILD_FUNC_DEF_2(SSL_issuer, SSLObject *, self, PyObject *, args)
2049{
2050 return PyString_FromString(self->issuer);
2051}
2052
2053
2054/* SSL object methods */
2055
2056static PyMethodDef SSLMethods[] = {
2057 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2058 { "read", (PyCFunction)SSL_SSLread, 1 },
2059 { "server", (PyCFunction)SSL_server, 1 },
2060 { "issuer", (PyCFunction)SSL_issuer, 1 },
2061 { NULL, NULL}
2062};
2063
2064static void SSL_dealloc(SSLObject *self)
2065{
2066 if (self->server_cert) /* Possible not to have one? */
2067 X509_free (self->server_cert);
2068 SSL_CTX_free(self->ctx);
2069 SSL_free(self->ssl);
2070 Py_XDECREF(self->x_attr);
2071 Py_XDECREF(self->Socket);
2072 PyMem_DEL(self);
2073}
2074
2075static PyObject *SSL_getattr(SSLObject *self, char *name)
2076{
2077 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2078}
2079
2080staticforward PyTypeObject SSL_Type = {
2081 PyObject_HEAD_INIT(&PyType_Type)
2082 0, /*ob_size*/
2083 "SSL", /*tp_name*/
2084 sizeof(SSLObject), /*tp_basicsize*/
2085 0, /*tp_itemsize*/
2086 /* methods */
2087 (destructor)SSL_dealloc, /*tp_dealloc*/
2088 0, /*tp_print*/
2089 (getattrfunc)SSL_getattr, /*tp_getattr*/
2090 0, /*tp_setattr*/
2091 0, /*tp_compare*/
2092 0, /*tp_repr*/
2093 0, /*tp_as_number*/
2094 0, /*tp_as_sequence*/
2095 0, /*tp_as_mapping*/
2096 0, /*tp_hash*/
2097};
2098
2099
2100
2101static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2102{
2103 char *data;
2104 int len = 0;
2105
Guido van Rossum43713e52000-02-29 13:59:29 +00002106 if (!PyArg_ParseTuple(args, "s|i:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002107 return NULL;
2108
2109 if (!len)
2110 len = strlen(data);
2111
2112 len = SSL_write(self->ssl, data, len);
2113 return PyInt_FromLong((long)len);
2114}
2115
2116static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2117{
2118 PyObject *buf;
2119 int count = 0;
2120 int len = 1024;
2121 int res;
2122
Guido van Rossum43713e52000-02-29 13:59:29 +00002123 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002124
2125 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2126 return NULL; /* Error object should already be set */
2127
2128 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2129 res = SSL_get_error(self->ssl, count);
2130
2131 switch (res) {
2132 case 0: /* Good return value! */
2133 break;
2134 case 6:
2135 PyErr_SetString(SSLErrorObject, "EOF");
2136 Py_DECREF(buf);
2137 return NULL;
2138 break;
2139 case 5:
2140 default:
2141 return PyErr_SetFromErrno(SSLErrorObject);
2142 break;
2143 }
2144
2145 fflush(stderr);
2146
2147 if (count < 0) {
2148 Py_DECREF(buf);
2149 return PyErr_SetFromErrno(SSLErrorObject);
2150 }
2151
2152 if (count != len && _PyString_Resize(&buf, count) < 0)
2153 return NULL;
2154 return buf;
2155}
2156
2157#endif /* USE_SSL */
2158
2159
Guido van Rossum30a685f1991-06-27 15:51:29 +00002160/* List of functions exported by this module. */
2161
Guido van Rossum73624e91994-10-10 17:59:00 +00002162static PyMethodDef PySocket_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002163 {"gethostbyname", PySocket_gethostbyname, 1, gethostbyname_doc},
2164 {"gethostbyname_ex", PySocket_gethostbyname_ex, 1, ghbn_ex_doc},
2165 {"gethostbyaddr", PySocket_gethostbyaddr, 1, gethostbyaddr_doc},
2166 {"gethostname", PySocket_gethostname, 1, gethostname_doc},
2167 {"getservbyname", PySocket_getservbyname, 1, getservbyname_doc},
2168 {"getprotobyname", PySocket_getprotobyname, 1,getprotobyname_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00002169 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002170#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00002171 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002172#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002173 {"ntohs", PySocket_ntohs, 1, ntohs_doc},
2174 {"ntohl", PySocket_ntohl, 1, ntohl_doc},
2175 {"htons", PySocket_htons, 1, htons_doc},
2176 {"htonl", PySocket_htonl, 1, htonl_doc},
2177 {"inet_aton", PySocket_inet_aton, 1, inet_aton_doc},
2178 {"inet_ntoa", PySocket_inet_ntoa, 1, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002179#ifdef USE_SSL
2180 {"ssl", PySocket_ssl, 1, ssl_doc},
2181#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002182 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002183};
2184
Guido van Rossum30a685f1991-06-27 15:51:29 +00002185
2186/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002187 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002188 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002189 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002190static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002191BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002192{
Guido van Rossum73624e91994-10-10 17:59:00 +00002193 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002194 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002195 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002196
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002197 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002198}
2199
Guido van Rossum30a685f1991-06-27 15:51:29 +00002200
Guido van Rossum8d665e61996-06-26 18:22:49 +00002201#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002202
2203/* Additional initialization and cleanup for NT/Windows */
2204
2205static void
2206NTcleanup()
2207{
2208 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002209}
2210
2211static int
2212NTinit()
2213{
2214 WSADATA WSAData;
2215 int ret;
2216 char buf[100];
2217 ret = WSAStartup(0x0101, &WSAData);
2218 switch (ret) {
2219 case 0: /* no error */
2220 atexit(NTcleanup);
2221 return 1;
2222 case WSASYSNOTREADY:
2223 PyErr_SetString(PyExc_ImportError,
2224 "WSAStartup failed: network not ready");
2225 break;
2226 case WSAVERNOTSUPPORTED:
2227 case WSAEINVAL:
2228 PyErr_SetString(PyExc_ImportError,
2229 "WSAStartup failed: requested version not supported");
2230 break;
2231 default:
2232 sprintf(buf, "WSAStartup failed: error code %d", ret);
2233 PyErr_SetString(PyExc_ImportError, buf);
2234 break;
2235 }
2236 return 0;
2237}
2238
Guido van Rossum8d665e61996-06-26 18:22:49 +00002239#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002240
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002241#if defined(PYOS_OS2)
2242
2243/* Additional initialization and cleanup for OS/2 */
2244
2245static void
2246OS2cleanup()
2247{
2248 /* No cleanup is necessary for OS/2 Sockets */
2249}
2250
2251static int
2252OS2init()
2253{
2254 char reason[64];
2255 int rc = sock_init();
2256
2257 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002258 atexit(OS2cleanup);
2259 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002260 }
2261
2262 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2263 PyErr_SetString(PyExc_ImportError, reason);
2264
Guido van Rossum32c575d1997-12-02 20:37:32 +00002265 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002266}
2267
2268#endif /* PYOS_OS2 */
2269
Guido van Rossum30a685f1991-06-27 15:51:29 +00002270/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002271 * This is called when the first 'import socket' is done,
2272 * via a table in config.c, if config.c is compiled with USE_SOCKET
2273 * defined.
2274 *
2275 * For MS_WINDOWS (which means any Windows variant), this module
2276 * is actually called "_socket", and there's a wrapper "socket.py"
2277 * which implements some missing functionality (such as makefile(),
2278 * dup() and fromfd()). The import of "_socket" may fail with an
2279 * ImportError exception if initialization of WINSOCK fails. When
2280 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2281 * scheduled to be made at exit time.
2282 *
2283 * For OS/2, this module is also called "_socket" and uses a wrapper
2284 * "socket.py" which implements that functionality that is missing
2285 * when PC operating systems don't put socket descriptors in the
2286 * operating system's filesystem layer.
2287 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002288
Guido van Rossum82a5c661998-07-07 20:45:43 +00002289static char module_doc[] =
2290"This module provides socket operations and some related functions.\n\
2291On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
2292On other systems, it only supports IP.\n\
2293\n\
2294Functions:\n\
2295\n\
2296socket() -- create a new socket object\n\
2297fromfd() -- create a socket object from an open file descriptor (*)\n\
2298gethostname() -- return the current hostname\n\
2299gethostbyname() -- map a hostname to its IP number\n\
2300gethostbyaddr() -- map an IP number or hostname to DNS info\n\
2301getservbyname() -- map a service name and a protocol name to a port number\n\
2302getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
2303ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
2304htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002305inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format\n\
2306inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)\n\
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002307ssl() -- secure socket layer support (only available if configured)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002308\n\
2309(*) not available on all platforms!)\n\
2310\n\
2311Special objects:\n\
2312\n\
2313SocketType -- type object for socket objects\n\
2314error -- exception raised for I/O errors\n\
2315\n\
2316Integer constants:\n\
2317\n\
2318AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
2319SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
2320\n\
2321Many other constants may be defined; these may be used in calls to\n\
2322the setsockopt() and getsockopt() methods.\n\
2323";
2324
2325static char sockettype_doc[] =
2326"A socket represents one endpoint of a network connection.\n\
2327\n\
2328Methods:\n\
2329\n\
2330accept() -- accept a connection, returning new socket and client address\n\
2331bind() -- bind the socket to a local address\n\
2332close() -- close the socket\n\
2333connect() -- connect the socket to a remote address\n\
2334connect_ex() -- connect, return an error code instead of an exception \n\
2335dup() -- return a new socket object identical to the current one (*)\n\
2336fileno() -- return underlying file descriptor\n\
2337getpeername() -- return remote address (*)\n\
2338getsockname() -- return local address\n\
2339getsockopt() -- get socket options\n\
2340listen() -- start listening for incoming connections\n\
2341makefile() -- return a file object corresponding tot the socket (*)\n\
2342recv() -- receive data\n\
2343recvfrom() -- receive data and sender's address\n\
2344send() -- send data\n\
2345sendto() -- send data to a given address\n\
2346setblocking() -- set or clear the blocking I/O flag\n\
2347setsockopt() -- set socket options\n\
2348shutdown() -- shut down traffic in one or both directions\n\
2349\n\
2350(*) not available on all platforms!)";
2351
Guido van Rossum3886bb61998-12-04 18:50:17 +00002352DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00002353#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002354init_socket()
2355#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002356initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00002357#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002358{
Guido van Rossum73624e91994-10-10 17:59:00 +00002359 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00002360#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002361 if (!NTinit())
2362 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002363 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002364#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002365#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002366 if (!OS2init())
2367 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002368 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002369#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00002370#if defined(__BEOS__)
2371 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
2372#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002373 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002374#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00002375#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00002376#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002377 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002378 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2379 if (PySocket_Error == NULL)
2380 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002381#ifdef USE_SSL
2382 SSL_load_error_strings();
2383 SSLeay_add_ssl_algorithms();
2384 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2385 if (SSLErrorObject == NULL)
2386 return;
2387 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2388 Py_INCREF(&SSL_Type);
2389 if (PyDict_SetItemString(d, "SSLType",
2390 (PyObject *)&SSL_Type) != 0)
2391 return;
2392#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002393 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002394 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002395 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002396 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002397 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002398 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002399 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002400
2401 /* Address families (we only support AF_INET and AF_UNIX) */
2402#ifdef AF_UNSPEC
2403 insint(d, "AF_UNSPEC", AF_UNSPEC);
2404#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002405 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002406#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002407 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002408#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002409#ifdef AF_AX25
2410 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2411#endif
2412#ifdef AF_IPX
2413 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2414#endif
2415#ifdef AF_APPLETALK
2416 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2417#endif
2418#ifdef AF_NETROM
2419 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2420#endif
2421#ifdef AF_BRIDGE
2422 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2423#endif
2424#ifdef AF_AAL5
2425 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2426#endif
2427#ifdef AF_X25
2428 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2429#endif
2430#ifdef AF_INET6
2431 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2432#endif
2433#ifdef AF_ROSE
2434 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2435#endif
2436
2437 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002438 insint(d, "SOCK_STREAM", SOCK_STREAM);
2439 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002440#ifndef __BEOS__
2441/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002442 insint(d, "SOCK_RAW", SOCK_RAW);
2443 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2444 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002445#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002446
2447#ifdef SO_DEBUG
2448 insint(d, "SO_DEBUG", SO_DEBUG);
2449#endif
2450#ifdef SO_ACCEPTCONN
2451 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2452#endif
2453#ifdef SO_REUSEADDR
2454 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2455#endif
2456#ifdef SO_KEEPALIVE
2457 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2458#endif
2459#ifdef SO_DONTROUTE
2460 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2461#endif
2462#ifdef SO_BROADCAST
2463 insint(d, "SO_BROADCAST", SO_BROADCAST);
2464#endif
2465#ifdef SO_USELOOPBACK
2466 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2467#endif
2468#ifdef SO_LINGER
2469 insint(d, "SO_LINGER", SO_LINGER);
2470#endif
2471#ifdef SO_OOBINLINE
2472 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2473#endif
2474#ifdef SO_REUSEPORT
2475 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2476#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002477#ifdef SO_SNDBUF
2478 insint(d, "SO_SNDBUF", SO_SNDBUF);
2479#endif
2480#ifdef SO_RCVBUF
2481 insint(d, "SO_RCVBUF", SO_RCVBUF);
2482#endif
2483#ifdef SO_SNDLOWAT
2484 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2485#endif
2486#ifdef SO_RCVLOWAT
2487 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2488#endif
2489#ifdef SO_SNDTIMEO
2490 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2491#endif
2492#ifdef SO_RCVTIMEO
2493 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2494#endif
2495#ifdef SO_ERROR
2496 insint(d, "SO_ERROR", SO_ERROR);
2497#endif
2498#ifdef SO_TYPE
2499 insint(d, "SO_TYPE", SO_TYPE);
2500#endif
2501
2502 /* Maximum number of connections for "listen" */
2503#ifdef SOMAXCONN
2504 insint(d, "SOMAXCONN", SOMAXCONN);
2505#else
2506 insint(d, "SOMAXCONN", 5); /* Common value */
2507#endif
2508
2509 /* Flags for send, recv */
2510#ifdef MSG_OOB
2511 insint(d, "MSG_OOB", MSG_OOB);
2512#endif
2513#ifdef MSG_PEEK
2514 insint(d, "MSG_PEEK", MSG_PEEK);
2515#endif
2516#ifdef MSG_DONTROUTE
2517 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2518#endif
2519#ifdef MSG_EOR
2520 insint(d, "MSG_EOR", MSG_EOR);
2521#endif
2522#ifdef MSG_TRUNC
2523 insint(d, "MSG_TRUNC", MSG_TRUNC);
2524#endif
2525#ifdef MSG_CTRUNC
2526 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2527#endif
2528#ifdef MSG_WAITALL
2529 insint(d, "MSG_WAITALL", MSG_WAITALL);
2530#endif
2531#ifdef MSG_BTAG
2532 insint(d, "MSG_BTAG", MSG_BTAG);
2533#endif
2534#ifdef MSG_ETAG
2535 insint(d, "MSG_ETAG", MSG_ETAG);
2536#endif
2537
2538 /* Protocol level and numbers, usable for [gs]etsockopt */
2539#ifdef SOL_SOCKET
2540 insint(d, "SOL_SOCKET", SOL_SOCKET);
2541#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002542#ifdef SOL_IP
2543 insint(d, "SOL_IP", SOL_IP);
2544#else
2545 insint(d, "SOL_IP", 0);
2546#endif
2547#ifdef SOL_IPX
2548 insint(d, "SOL_IPX", SOL_IPX);
2549#endif
2550#ifdef SOL_AX25
2551 insint(d, "SOL_AX25", SOL_AX25);
2552#endif
2553#ifdef SOL_ATALK
2554 insint(d, "SOL_ATALK", SOL_ATALK);
2555#endif
2556#ifdef SOL_NETROM
2557 insint(d, "SOL_NETROM", SOL_NETROM);
2558#endif
2559#ifdef SOL_ROSE
2560 insint(d, "SOL_ROSE", SOL_ROSE);
2561#endif
2562#ifdef SOL_TCP
2563 insint(d, "SOL_TCP", SOL_TCP);
2564#else
2565 insint(d, "SOL_TCP", 6);
2566#endif
2567#ifdef SOL_UDP
2568 insint(d, "SOL_UDP", SOL_UDP);
2569#else
2570 insint(d, "SOL_UDP", 17);
2571#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002572#ifdef IPPROTO_IP
2573 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002574#else
2575 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002576#endif
2577#ifdef IPPROTO_ICMP
2578 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002579#else
2580 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002581#endif
2582#ifdef IPPROTO_IGMP
2583 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2584#endif
2585#ifdef IPPROTO_GGP
2586 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2587#endif
2588#ifdef IPPROTO_TCP
2589 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002590#else
2591 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002592#endif
2593#ifdef IPPROTO_EGP
2594 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2595#endif
2596#ifdef IPPROTO_PUP
2597 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2598#endif
2599#ifdef IPPROTO_UDP
2600 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002601#else
2602 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002603#endif
2604#ifdef IPPROTO_IDP
2605 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2606#endif
2607#ifdef IPPROTO_HELLO
2608 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2609#endif
2610#ifdef IPPROTO_ND
2611 insint(d, "IPPROTO_ND", IPPROTO_ND);
2612#endif
2613#ifdef IPPROTO_TP
2614 insint(d, "IPPROTO_TP", IPPROTO_TP);
2615#endif
2616#ifdef IPPROTO_XTP
2617 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2618#endif
2619#ifdef IPPROTO_EON
2620 insint(d, "IPPROTO_EON", IPPROTO_EON);
2621#endif
2622#ifdef IPPROTO_BIP
2623 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2624#endif
2625/**/
2626#ifdef IPPROTO_RAW
2627 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002628#else
2629 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002630#endif
2631#ifdef IPPROTO_MAX
2632 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2633#endif
2634
2635 /* Some port configuration */
2636#ifdef IPPORT_RESERVED
2637 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2638#else
2639 insint(d, "IPPORT_RESERVED", 1024);
2640#endif
2641#ifdef IPPORT_USERRESERVED
2642 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2643#else
2644 insint(d, "IPPORT_USERRESERVED", 5000);
2645#endif
2646
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002647 /* Some reserved IP v.4 addresses */
2648#ifdef INADDR_ANY
2649 insint(d, "INADDR_ANY", INADDR_ANY);
2650#else
2651 insint(d, "INADDR_ANY", 0x00000000);
2652#endif
2653#ifdef INADDR_BROADCAST
2654 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2655#else
2656 insint(d, "INADDR_BROADCAST", 0xffffffff);
2657#endif
2658#ifdef INADDR_LOOPBACK
2659 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2660#else
2661 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2662#endif
2663#ifdef INADDR_UNSPEC_GROUP
2664 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2665#else
2666 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2667#endif
2668#ifdef INADDR_ALLHOSTS_GROUP
2669 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2670#else
2671 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2672#endif
2673#ifdef INADDR_MAX_LOCAL_GROUP
2674 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2675#else
2676 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2677#endif
2678#ifdef INADDR_NONE
2679 insint(d, "INADDR_NONE", INADDR_NONE);
2680#else
2681 insint(d, "INADDR_NONE", 0xffffffff);
2682#endif
2683
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002684 /* IP [gs]etsockopt options */
2685#ifdef IP_OPTIONS
2686 insint(d, "IP_OPTIONS", IP_OPTIONS);
2687#endif
2688#ifdef IP_HDRINCL
2689 insint(d, "IP_HDRINCL", IP_HDRINCL);
2690#endif
2691#ifdef IP_TOS
2692 insint(d, "IP_TOS", IP_TOS);
2693#endif
2694#ifdef IP_TTL
2695 insint(d, "IP_TTL", IP_TTL);
2696#endif
2697#ifdef IP_RECVOPTS
2698 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2699#endif
2700#ifdef IP_RECVRETOPTS
2701 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2702#endif
2703#ifdef IP_RECVDSTADDR
2704 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2705#endif
2706#ifdef IP_RETOPTS
2707 insint(d, "IP_RETOPTS", IP_RETOPTS);
2708#endif
2709#ifdef IP_MULTICAST_IF
2710 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2711#endif
2712#ifdef IP_MULTICAST_TTL
2713 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2714#endif
2715#ifdef IP_MULTICAST_LOOP
2716 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2717#endif
2718#ifdef IP_ADD_MEMBERSHIP
2719 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2720#endif
2721#ifdef IP_DROP_MEMBERSHIP
2722 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2723#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002724#ifdef IP_DEFAULT_MULTICAST_TTL
2725 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2726#endif
2727#ifdef IP_DEFAULT_MULTICAST_LOOP
2728 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2729#endif
2730#ifdef IP_MAX_MEMBERSHIPS
2731 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2732#endif
2733
2734 /* TCP options */
2735#ifdef TCP_NODELAY
2736 insint(d, "TCP_NODELAY", TCP_NODELAY);
2737#endif
2738#ifdef TCP_MAXSEG
2739 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2740#endif
2741
2742 /* IPX options */
2743#ifdef IPX_TYPE
2744 insint(d, "IPX_TYPE", IPX_TYPE);
2745#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002746
2747 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002748#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002749 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002750#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002751}