blob: 9798deaac08e602b3a57e24eae385ea13afaddae [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 Rossum6574b3e1991-06-25 21:36:08 +000069
Guido van Rossum81194471991-07-27 21:42:02 +000070- s.accept() --> new socket object, sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000071- s.bind(sockaddr) --> None
72- s.close() --> None
73- s.connect(sockaddr) --> None
Guido van Rossumfc4255d1997-11-19 18:57:13 +000074- s.connect_ex(sockaddr) --> 0 or errno (handy for e.g. async connect)
Guido van Rossum27e177d1995-03-16 15:43:47 +000075- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000076- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000077- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000078- s.getsockname() --> sockaddr
79- s.getsockopt(level, optname[, buflen]) --> int or string
80- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000081- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000082- s.recv(buflen [,flags]) --> string
83- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000084- s.send(string [,flags]) --> nbytes
85- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000086- s.setblocking(0 | 1) --> None
87- s.setsockopt(level, optname, value) --> None
88- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000089- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000090
Guido van Rossum6574b3e1991-06-25 21:36:08 +000091*/
92
Guido van Rossum73624e91994-10-10 17:59:00 +000093#include "Python.h"
Guido van Rossum3baaa131999-03-22 21:44:51 +000094
Guido van Rossum9376b741999-09-15 22:01:40 +000095/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
96 script doesn't get this right, so we hardcode some platform checks below.
97 On the other hand, not all Linux versions agree, so there the settings
98 computed by the configure script are needed! */
99
100#ifndef linux
Guido van Rossume7de2061999-03-24 17:24:33 +0000101#undef HAVE_GETHOSTBYNAME_R_3_ARG
102#undef HAVE_GETHOSTBYNAME_R_5_ARG
103#undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000104#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000105
Guido van Rossum7a122991999-04-13 04:07:32 +0000106#ifndef WITH_THREAD
107#undef HAVE_GETHOSTBYNAME_R
108#endif
109
Guido van Rossume7de2061999-03-24 17:24:33 +0000110#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000111#if defined(_AIX) || defined(__osf__)
Guido van Rossume7de2061999-03-24 17:24:33 +0000112#define HAVE_GETHOSTBYNAME_R_3_ARG
113#elif defined(__sun__) || defined(__sgi)
114#define HAVE_GETHOSTBYNAME_R_5_ARG
115#elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000116/* Rely on the configure script */
Guido van Rossume7de2061999-03-24 17:24:33 +0000117#else
118#undef HAVE_GETHOSTBYNAME_R
119#endif
120#endif
121
Guido van Rossum3baaa131999-03-22 21:44:51 +0000122#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
123#define USE_GETHOSTBYNAME_LOCK
124#endif
125
126#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum49b56061998-10-01 20:42:43 +0000127#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000128#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000129
Guido van Rossuma376cc51996-12-05 23:43:35 +0000130#ifdef HAVE_UNISTD_H
131#include <unistd.h>
132#endif
133
Guido van Rossumbcc20741998-08-04 22:53:56 +0000134#if !defined(MS_WINDOWS) && !defined(PYOS_OS2) && !defined(__BEOS__)
Guido van Rossumfb4130d1996-12-10 15:17:08 +0000135extern int gethostname(); /* For Solaris, at least */
136#endif
137
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000138#if defined(PYCC_VACPP)
139#include <types.h>
140#include <io.h>
141#include <sys/ioctl.h>
142#include <utils.h>
143#include <ctype.h>
144#endif
145
146#if defined(PYOS_OS2)
147#define INCL_DOS
148#define INCL_DOSERRORS
149#define INCL_NOPMAPI
150#include <os2.h>
151#endif
152
Guido van Rossumbcc20741998-08-04 22:53:56 +0000153#if defined(__BEOS__)
154/* It's in the libs, but not the headers... - [cjh] */
155int shutdown( int, int );
156#endif
157
Guido van Rossumb6775db1994-08-01 11:34:53 +0000158#include <sys/types.h>
159#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +0000160
Guido van Rossum81194471991-07-27 21:42:02 +0000161#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000162#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000163#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000164#include <sys/socket.h>
165#include <netinet/in.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000166
Guido van Rossum9376b741999-09-15 22:01:40 +0000167/* Headers needed for inet_ntoa() and inet_addr() */
168#ifdef __BEOS__
169#include <net/netdb.h>
170#else
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000171#ifndef macintosh
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000172#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000173#endif
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000174#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000175
Guido van Rossume4485b01994-09-07 14:32:49 +0000176#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000177#else
178#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000179#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000180#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000181#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000182#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000183#else
184#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000185#endif
186
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000187#ifndef O_NDELAY
188#define O_NDELAY O_NONBLOCK /* For QNX only? */
189#endif
190
Jack Jansen508537b1996-02-14 15:57:45 +0000191#ifdef USE_GUSI
192/* fdopen() isn't declared in stdio.h (sigh) */
193#include <GUSI.h>
194#endif
195
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000196#ifdef USE_SSL
197#include "rsa.h"
198#include "crypto.h"
199#include "x509.h"
200#include "pem.h"
201#include "ssl.h"
202#include "err.h"
203#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000204
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000205/* Here we have some hacks to choose between K&R or ANSI style function
206 definitions. For NT to build this as an extension module (ie, DLL)
207 it must be compiled by the C++ compiler, as it takes the address of
208 a static data item exported from the main Python DLL.
209*/
Guido van Rossumbcc20741998-08-04 22:53:56 +0000210#if defined(MS_WINDOWS) || defined(__BEOS__)
211/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000212/* seem to be a few differences in the API */
213#define close closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000214#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000215#define FORCE_ANSI_FUNC_DEFS
216#endif
217
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000218#if defined(PYOS_OS2)
219#define close soclose
220#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
221#define FORCE_ANSI_FUNC_DEFS
222#endif
223
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000224#ifdef FORCE_ANSI_FUNC_DEFS
225#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
226fnname( arg1type arg1name )
227
228#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
229fnname( arg1type arg1name, arg2type arg2name )
230
231#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
232fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
233
234#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
235fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
236
237#else /* !FORCE_ANSI_FN_DEFS */
238#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
239fnname( arg1name ) \
240 arg1type arg1name;
241
242#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
243fnname( arg1name, arg2name ) \
244 arg1type arg1name; \
245 arg2type arg2name;
246
247#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
248fnname( arg1name, arg2name, arg3name ) \
249 arg1type arg1name; \
250 arg2type arg2name; \
251 arg3type arg3name;
252
253#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
254fnname( arg1name, arg2name, arg3name, arg4name ) \
255 arg1type arg1name; \
256 arg2type arg2name; \
257 arg3type arg3name; \
258 arg4type arg4name;
259
260#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000261
262/* Global variable holding the exception type for errors detected
263 by this module (but not argument type or memory errors, etc.). */
264
Guido van Rossum73624e91994-10-10 17:59:00 +0000265static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000266
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000267#ifdef USE_SSL
268static PyObject *SSLErrorObject;
269#endif /* USE_SSL */
270
Guido van Rossum30a685f1991-06-27 15:51:29 +0000271
272/* Convenience function to raise an error according to errno
273 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000274
Guido van Rossum73624e91994-10-10 17:59:00 +0000275static PyObject *
276PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000277{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000278#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000279 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000280 PyObject *v;
281 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000282 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000283 PyErr_SetObject(PySocket_Error, v);
284 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000285 }
286 return NULL;
287 }
288 else
289#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000290
291#if defined(PYOS_OS2)
292 if (sock_errno() != NO_ERROR) {
293 APIRET rc;
294 ULONG msglen;
295 char outbuf[100];
296 int myerrorcode = sock_errno();
297
298 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
299 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
300 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
301 if (rc == NO_ERROR) {
302 PyObject *v;
303
304 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
305 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
306 char *lastc = &outbuf[ strlen(outbuf)-1 ];
307 while (lastc > outbuf && isspace(*lastc))
308 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
309 }
310 v = Py_BuildValue("(is)", myerrorcode, outbuf);
311 if (v != NULL) {
312 PyErr_SetObject(PySocket_Error, v);
313 Py_DECREF(v);
314 }
315 return NULL;
316 }
317 }
318#endif
319
Guido van Rossum73624e91994-10-10 17:59:00 +0000320 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000321}
322
Guido van Rossum30a685f1991-06-27 15:51:29 +0000323
324/* The object holding a socket. It holds some extra information,
325 like the address family, which is used to decode socket address
326 arguments properly. */
327
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000328typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000329 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000330 int sock_fd; /* Socket file descriptor */
331 int sock_family; /* Address family, e.g., AF_INET */
332 int sock_type; /* Socket type, e.g., SOCK_STREAM */
333 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000334 union sock_addr {
335 struct sockaddr_in in;
336#ifdef AF_UNIX
337 struct sockaddr_un un;
338#endif
339 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000340} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000341
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000342#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000343
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000344typedef struct {
345 PyObject_HEAD
346 PySocketSockObject *Socket; /* Socket on which we're layered */
347 PyObject *x_attr; /* Attributes dictionary */
348 SSL_CTX* ctx;
349 SSL* ssl;
350 X509* server_cert;
351 BIO* sbio;
352 char server[256];
353 char issuer[256];
354
355} SSLObject;
356
357staticforward PyTypeObject SSL_Type;
358staticforward int SSL_setattr(SSLObject *self, char *name, PyObject *v);
359staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
360staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
361
362#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
363
364#endif /* USE_SSL */
365
Guido van Rossum30a685f1991-06-27 15:51:29 +0000366/* A forward reference to the Socktype type object.
367 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000368 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000369 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000370
Guido van Rossum73624e91994-10-10 17:59:00 +0000371staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000372
Guido van Rossum30a685f1991-06-27 15:51:29 +0000373
374/* Create a new socket object.
375 This just creates the object and initializes it.
376 If the creation fails, return NULL and set an exception (implicit
377 in NEWOBJ()). */
378
Guido van Rossum73624e91994-10-10 17:59:00 +0000379static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000380BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000381{
Guido van Rossum73624e91994-10-10 17:59:00 +0000382 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000383 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000384 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000385 if (s != NULL) {
386 s->sock_fd = fd;
387 s->sock_family = family;
388 s->sock_type = type;
389 s->sock_proto = proto;
390 }
391 return s;
392}
393
Guido van Rossum30a685f1991-06-27 15:51:29 +0000394
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000395/* Lock to allow python interpreter to continue, but only allow one
396 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000397#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000398PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000399#endif
400
401
Guido van Rossum30a685f1991-06-27 15:51:29 +0000402/* Convert a string specifying a host name or one of a few symbolic
403 names to a numeric IP address. This usually calls gethostbyname()
404 to do the work; the names "" and "<broadcast>" are special.
405 Return the length (should always be 4 bytes), or negative if
406 an error occurred; then an exception is raised. */
407
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000408static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000409BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000410{
411 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000412 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000413 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000414 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000415#ifdef HAVE_GETHOSTBYNAME_R
416 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000417#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
418 struct hostent_data data;
419#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000420 char buf[1001];
421 int buf_len = (sizeof buf) - 1;
422 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000423#endif
424#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000425 int result;
426#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000427#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000428
Guido van Rossuma376cc51996-12-05 23:43:35 +0000429 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000430 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000431 addr_ret->sin_addr.s_addr = INADDR_ANY;
432 return 4;
433 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000434 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000435 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
436 return 4;
437 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000438 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
439 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
440 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
441 addr_ret->sin_addr.s_addr = htonl(
442 ((long) d1 << 24) | ((long) d2 << 16) |
443 ((long) d3 << 8) | ((long) d4 << 0));
444 return 4;
445 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000446 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000447#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000448#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000449 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000450#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000451 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000452#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000453 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000454 result = gethostbyname_r(name, &hp_allocated, &data);
455 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000456#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000457#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000458#ifdef USE_GETHOSTBYNAME_LOCK
459 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000460#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000461 hp = gethostbyname(name);
462#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000463 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000464
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000465 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000466#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000467 /* Let's get real error message to return */
468 extern int h_errno;
469 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
470#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000471 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000472#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000473#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000474 PyThread_release_lock(gethostbyname_lock);
475#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000476 return -1;
477 }
478 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000479 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000480#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000481 PyThread_release_lock(gethostbyname_lock);
482#endif
483 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000484}
485
Guido van Rossum30a685f1991-06-27 15:51:29 +0000486
Guido van Rossum30a685f1991-06-27 15:51:29 +0000487/* Create a string object representing an IP address.
488 This is always a string of the form 'dd.dd.dd.dd' (with variable
489 size numbers). */
490
Guido van Rossum73624e91994-10-10 17:59:00 +0000491static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000492BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000493{
494 long x = ntohl(addr->sin_addr.s_addr);
495 char buf[100];
496 sprintf(buf, "%d.%d.%d.%d",
497 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
498 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000499 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000500}
501
502
503/* Create an object representing the given socket address,
504 suitable for passing it back to bind(), connect() etc.
505 The family field of the sockaddr structure is inspected
506 to determine what kind of address it really is. */
507
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000508/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000509static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000510BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000511{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000512 if (addrlen == 0) {
513 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000514 Py_INCREF(Py_None);
515 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000516 }
517
Guido van Rossumbcc20741998-08-04 22:53:56 +0000518#ifdef __BEOS__
519 /* XXX: BeOS version of accept() doesn't set family coreectly */
520 addr->sa_family = AF_INET;
521#endif
522
Guido van Rossum30a685f1991-06-27 15:51:29 +0000523 switch (addr->sa_family) {
524
525 case AF_INET:
526 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000527 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000528 PyObject *addrobj = makeipaddr(a);
529 PyObject *ret = NULL;
530 if (addrobj) {
531 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
532 Py_DECREF(addrobj);
533 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000534 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000535 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000536
Guido van Rossumb6775db1994-08-01 11:34:53 +0000537#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000538 case AF_UNIX:
539 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000540 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000541 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000542 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000543#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000544
545 /* More cases here... */
546
547 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000548 /* If we don't know the address family, don't raise an
549 exception -- return it as a tuple. */
550 return Py_BuildValue("is#",
551 addr->sa_family,
552 addr->sa_data,
553 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000554
Guido van Rossum30a685f1991-06-27 15:51:29 +0000555 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000556}
557
Guido van Rossum30a685f1991-06-27 15:51:29 +0000558
559/* Parse a socket address argument according to the socket object's
560 address family. Return 1 if the address was in the proper format,
561 0 of not. The address is returned through addr_ret, its length
562 through len_ret. */
563
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000564static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000565BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000566getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000567{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000568 switch (s->sock_family) {
569
Guido van Rossumb6775db1994-08-01 11:34:53 +0000570#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000571 case AF_UNIX:
572 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000573 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000574 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000575 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000576 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000577 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000578 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000579 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000580 PyErr_SetString(PySocket_Error,
581 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000582 return 0;
583 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000584 addr->sun_family = AF_UNIX;
585 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000586 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000587 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000588 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000589 return 1;
590 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000591#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000592
Guido van Rossum30a685f1991-06-27 15:51:29 +0000593 case AF_INET:
594 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000595 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000596 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000597 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000598 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000599 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000600 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000601 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000602 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000603 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000604 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000605 *addr_ret = (struct sockaddr *) addr;
606 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000607 return 1;
608 }
609
Guido van Rossum30a685f1991-06-27 15:51:29 +0000610 /* More cases here... */
611
612 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000613 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000614 return 0;
615
616 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000617}
618
Guido van Rossum30a685f1991-06-27 15:51:29 +0000619
Guido van Rossum710e1df1992-06-12 10:39:36 +0000620/* Get the address length according to the socket object's address family.
621 Return 1 if the family is known, 0 otherwise. The length is returned
622 through len_ret. */
623
624static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000625BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000626{
627 switch (s->sock_family) {
628
Guido van Rossumb6775db1994-08-01 11:34:53 +0000629#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000630 case AF_UNIX:
631 {
632 *len_ret = sizeof (struct sockaddr_un);
633 return 1;
634 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000635#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000636
637 case AF_INET:
638 {
639 *len_ret = sizeof (struct sockaddr_in);
640 return 1;
641 }
642
643 /* More cases here... */
644
645 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000646 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000647 return 0;
648
649 }
650}
651
652
Guido van Rossum30a685f1991-06-27 15:51:29 +0000653/* s.accept() method */
654
Guido van Rossum73624e91994-10-10 17:59:00 +0000655static PyObject *
656BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000657{
658 char addrbuf[256];
659 int addrlen, newfd;
Barry Warsaw752300b1997-01-03 17:18:10 +0000660 PyObject *sock = NULL;
661 PyObject *addr = NULL;
662 PyObject *res = NULL;
663
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000664 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000665 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000666 if (!getsockaddrlen(s, &addrlen))
667 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000668 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000669 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000670 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000671 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000672 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000673
Guido van Rossum30a685f1991-06-27 15:51:29 +0000674 /* Create the new object with unspecified family,
675 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000676 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000677 s->sock_family,
678 s->sock_type,
679 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000680 if (sock == NULL) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000681 close(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000682 goto finally;
683 }
684 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
685 goto finally;
686
687 if (!(res = Py_BuildValue("OO", sock, addr)))
688 goto finally;
689
690 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000691 Py_XDECREF(sock);
692 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000693 return res;
694}
695
Guido van Rossum82a5c661998-07-07 20:45:43 +0000696static char accept_doc[] =
697"accept() -> (socket object, address info)\n\
698\n\
699Wait for an incoming connection. Return a new socket representing the\n\
700connection, and the address of the client. For IP sockets, the address\n\
701info is a pair (hostaddr, port).";
702
Guido van Rossum30a685f1991-06-27 15:51:29 +0000703
Guido van Rossume4485b01994-09-07 14:32:49 +0000704/* s.setblocking(1 | 0) method */
705
Guido van Rossum73624e91994-10-10 17:59:00 +0000706static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000707BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000708{
709 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000710#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000711 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000712#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000713 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000714 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000715 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000716#ifdef __BEOS__
717 block = !block;
718 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
719 (void *)(&block), sizeof( int ) );
720#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000721#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000722#ifdef PYOS_OS2
723 block = !block;
724 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
725#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000726 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
727 if (block)
728 delay_flag &= (~O_NDELAY);
729 else
730 delay_flag |= O_NDELAY;
731 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000732#endif /* !PYOS_OS2 */
733#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000734 block = !block;
735 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000736#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000737#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000738 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000739
Guido van Rossum73624e91994-10-10 17:59:00 +0000740 Py_INCREF(Py_None);
741 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000742}
Guido van Rossume4485b01994-09-07 14:32:49 +0000743
Guido van Rossum82a5c661998-07-07 20:45:43 +0000744static char setblocking_doc[] =
745"setblocking(flag)\n\
746\n\
747Set the socket to blocking (flag is true) or non-blocking (false).\n\
748This uses the FIONBIO ioctl with the O_NDELAY flag.";
749
Guido van Rossume4485b01994-09-07 14:32:49 +0000750
Guido van Rossumaee08791992-09-08 09:05:33 +0000751/* s.setsockopt() method.
752 With an integer third argument, sets an integer option.
753 With a string third argument, sets an option from a buffer;
754 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000755
Guido van Rossum73624e91994-10-10 17:59:00 +0000756static PyObject *
757BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000758{
759 int level;
760 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000761 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000762 char *buf;
763 int buflen;
764 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000765
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000766 if (PyArg_ParseTuple(args, "iii:setsockopt",
767 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000768 buf = (char *) &flag;
769 buflen = sizeof flag;
770 }
771 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000772 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000773 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
774 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000775 return NULL;
776 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000777 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000778 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000779 return PySocket_Err();
780 Py_INCREF(Py_None);
781 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000782}
783
Guido van Rossum82a5c661998-07-07 20:45:43 +0000784static char setsockopt_doc[] =
785"setsockopt(level, option, value)\n\
786\n\
787Set a socket option. See the Unix manual for level and option.\n\
788The value argument can either be an integer or a string.";
789
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000790
Guido van Rossumaee08791992-09-08 09:05:33 +0000791/* s.getsockopt() method.
792 With two arguments, retrieves an integer option.
793 With a third integer argument, retrieves a string buffer of that size;
794 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000795
Guido van Rossum73624e91994-10-10 17:59:00 +0000796static PyObject *
797BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000798{
799 int level;
800 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000801 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000802 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000803 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000804
Guido van Rossumbcc20741998-08-04 22:53:56 +0000805#ifdef __BEOS__
806/* We have incomplete socket support. */
807 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
808 return NULL;
809#else
810
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000811 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
812 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000813 return NULL;
814
815 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000816 int flag = 0;
817 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000818 res = getsockopt(s->sock_fd, level, optname,
819 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000820 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000821 return PySocket_Err();
822 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000823 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000824 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000825 PyErr_SetString(PySocket_Error,
826 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000827 return NULL;
828 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000829 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000830 if (buf == NULL)
831 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000832 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000833 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000834 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000835 Py_DECREF(buf);
836 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000837 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000838 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000839 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000840#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000841}
842
Guido van Rossum82a5c661998-07-07 20:45:43 +0000843static char getsockopt_doc[] =
844"getsockopt(level, option[, buffersize]) -> value\n\
845\n\
846Get a socket option. See the Unix manual for level and option.\n\
847If a nonzero buffersize argument is given, the return value is a\n\
848string of that length; otherwise it is an integer.";
849
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000850
Guido van Rossum30a685f1991-06-27 15:51:29 +0000851/* s.bind(sockaddr) method */
852
Guido van Rossum73624e91994-10-10 17:59:00 +0000853static PyObject *
854BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000855{
856 struct sockaddr *addr;
857 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000858 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000859 PyObject *addro;
860 if (!PyArg_ParseTuple(args, "O:bind", &addro))
861 return NULL;
862 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000863 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000864 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000865 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000866 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000867 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000868 return PySocket_Err();
869 Py_INCREF(Py_None);
870 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000871}
872
Guido van Rossum82a5c661998-07-07 20:45:43 +0000873static char bind_doc[] =
874"bind(address)\n\
875\n\
876Bind the socket to a local address. For IP sockets, the address is a\n\
877pair (host, port); the host must refer to the local host.";
878
Guido van Rossum30a685f1991-06-27 15:51:29 +0000879
880/* s.close() method.
881 Set the file descriptor to -1 so operations tried subsequently
882 will surely fail. */
883
Guido van Rossum73624e91994-10-10 17:59:00 +0000884static PyObject *
885BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000886{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000887 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000888 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000889 if (s->sock_fd != -1) {
890 Py_BEGIN_ALLOW_THREADS
891 (void) close(s->sock_fd);
892 Py_END_ALLOW_THREADS
893 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000894 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000895 Py_INCREF(Py_None);
896 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000897}
898
Guido van Rossum82a5c661998-07-07 20:45:43 +0000899static char close_doc[] =
900"close()\n\
901\n\
902Close the socket. It cannot be used after this call.";
903
Guido van Rossum30a685f1991-06-27 15:51:29 +0000904
905/* s.connect(sockaddr) method */
906
Guido van Rossum73624e91994-10-10 17:59:00 +0000907static PyObject *
908BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000909{
910 struct sockaddr *addr;
911 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000912 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000913 PyObject *addro;
914 if (!PyArg_ParseTuple(args, "O:connect", &addro))
915 return NULL;
916 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000917 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000918 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000919 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000920 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000921 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000922 return PySocket_Err();
923 Py_INCREF(Py_None);
924 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000925}
926
Guido van Rossum82a5c661998-07-07 20:45:43 +0000927static char connect_doc[] =
928"connect(address)\n\
929\n\
930Connect the socket to a remote address. For IP sockets, the address\n\
931is a pair (host, port).";
932
Guido van Rossum30a685f1991-06-27 15:51:29 +0000933
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000934/* s.connect_ex(sockaddr) method */
935
936static PyObject *
937BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
938{
939 struct sockaddr *addr;
940 int addrlen;
941 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000942 PyObject *addro;
943 if (!PyArg_ParseTuple(args, "O:connect_ex", &addro))
944 return NULL;
945 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000946 return NULL;
947 Py_BEGIN_ALLOW_THREADS
948 res = connect(s->sock_fd, addr, addrlen);
949 Py_END_ALLOW_THREADS
950 if (res != 0)
951 res = errno;
952 return PyInt_FromLong((long) res);
953}
954
Guido van Rossum82a5c661998-07-07 20:45:43 +0000955static char connect_ex_doc[] =
956"connect_ex(address)\n\
957\n\
958This is like connect(address), but returns an error code (the errno value)\n\
959instead of raising an exception when an error occurs.";
960
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000961
Guido van Rossumed233a51992-06-23 09:07:03 +0000962/* s.fileno() method */
963
Guido van Rossum73624e91994-10-10 17:59:00 +0000964static PyObject *
965BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000966{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000967 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +0000968 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000969 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000970}
971
Guido van Rossum82a5c661998-07-07 20:45:43 +0000972static char fileno_doc[] =
973"fileno() -> integer\n\
974\n\
975Return the integer file descriptor of the socket.";
976
Guido van Rossumed233a51992-06-23 09:07:03 +0000977
Guido van Rossumbe32c891996-06-20 16:25:29 +0000978#ifndef NO_DUP
979/* s.dup() method */
980
981static PyObject *
982BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
983{
984 int newfd;
985 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000986 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000987 return NULL;
988 newfd = dup(s->sock_fd);
989 if (newfd < 0)
990 return PySocket_Err();
991 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000992 s->sock_family,
993 s->sock_type,
994 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000995 if (sock == NULL)
996 close(newfd);
997 return sock;
998}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000999
1000static char dup_doc[] =
1001"dup() -> socket object\n\
1002\n\
1003Return a new socket object connected to the same system resource.";
1004
Guido van Rossumbe32c891996-06-20 16:25:29 +00001005#endif
1006
1007
Guido van Rossumc89705d1992-11-26 08:54:07 +00001008/* s.getsockname() method */
1009
Guido van Rossum73624e91994-10-10 17:59:00 +00001010static PyObject *
1011BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001012{
1013 char addrbuf[256];
1014 int addrlen, res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001015 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001016 return NULL;
1017 if (!getsockaddrlen(s, &addrlen))
1018 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001019 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001020 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001021 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001022 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001023 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001024 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001025 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1026}
1027
Guido van Rossum82a5c661998-07-07 20:45:43 +00001028static char getsockname_doc[] =
1029"getsockname() -> address info\n\
1030\n\
1031Return the address of the local endpoint. For IP sockets, the address\n\
1032info is a pair (hostaddr, port).";
1033
Guido van Rossumc89705d1992-11-26 08:54:07 +00001034
Guido van Rossumb6775db1994-08-01 11:34:53 +00001035#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001036/* s.getpeername() method */
1037
Guido van Rossum73624e91994-10-10 17:59:00 +00001038static PyObject *
1039BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001040{
1041 char addrbuf[256];
1042 int addrlen, res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001043 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001044 return NULL;
1045 if (!getsockaddrlen(s, &addrlen))
1046 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001047 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001048 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001049 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001050 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001051 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001052 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1053}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001054
1055static char getpeername_doc[] =
1056"getpeername() -> address info\n\
1057\n\
1058Return the address of the remote endpoint. For IP sockets, the address\n\
1059info is a pair (hostaddr, port).";
1060
Guido van Rossumb6775db1994-08-01 11:34:53 +00001061#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001062
1063
Guido van Rossum30a685f1991-06-27 15:51:29 +00001064/* s.listen(n) method */
1065
Guido van Rossum73624e91994-10-10 17:59:00 +00001066static PyObject *
1067BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001068{
1069 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001070 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001071 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001072 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001073 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001074 if (backlog < 1)
1075 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001076 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001077 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001078 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001079 return PySocket_Err();
1080 Py_INCREF(Py_None);
1081 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001082}
1083
Guido van Rossum82a5c661998-07-07 20:45:43 +00001084static char listen_doc[] =
1085"listen(backlog)\n\
1086\n\
1087Enable a server to accept connections. The backlog argument must be at\n\
1088least 1; it specifies the number of unaccepted connection that the system\n\
1089will allow before refusing new connections.";
1090
1091
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001092#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001093/* s.makefile(mode) method.
1094 Create a new open file object referring to a dupped version of
1095 the socket's file descriptor. (The dup() call is necessary so
1096 that the open file and socket objects may be closed independent
1097 of each other.)
1098 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1099
Guido van Rossum73624e91994-10-10 17:59:00 +00001100static PyObject *
1101BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001102{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001103 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +00001104 char *mode = "r";
1105 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001106 int fd;
1107 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001108 PyObject *f;
1109
Guido van Rossum43713e52000-02-29 13:59:29 +00001110 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001111 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001112#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001113 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1114 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001115#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001116 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001117#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001118 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001119 if (fd >= 0)
1120 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001121 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001122 }
1123 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1124 if (f != NULL)
1125 PyFile_SetBufSize(f, bufsize);
1126 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001127}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001128
1129static char makefile_doc[] =
1130"makefile([mode[, buffersize]]) -> file object\n\
1131\n\
1132Return a regular file object corresponding to the socket.\n\
1133The mode and buffersize arguments are as for the built-in open() function.";
1134
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001135#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001136
Guido van Rossum82a5c661998-07-07 20:45:43 +00001137
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001138/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001139
Guido van Rossum73624e91994-10-10 17:59:00 +00001140static PyObject *
1141BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001142{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001143 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001144 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001145 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001146 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001147 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001148 if (buf == NULL)
1149 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001150 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001151 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001152 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001153 if (n < 0) {
1154 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001155 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001156 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001157 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001158 return NULL;
1159 return buf;
1160}
1161
Guido van Rossum82a5c661998-07-07 20:45:43 +00001162static char recv_doc[] =
1163"recv(buffersize[, flags]) -> data\n\
1164\n\
1165Receive up to buffersize bytes from the socket. For the optional flags\n\
1166argument, see the Unix manual. When no data is available, block until\n\
1167at least one byte is available or until the remote end is closed. When\n\
1168the remote end is closed and all data is read, return the empty string.";
1169
Guido van Rossum30a685f1991-06-27 15:51:29 +00001170
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001171/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001172
Guido van Rossum73624e91994-10-10 17:59:00 +00001173static PyObject *
1174BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001175{
1176 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001177 PyObject *buf = NULL;
1178 PyObject *addr = NULL;
1179 PyObject *ret = NULL;
1180
Guido van Rossumbe32c891996-06-20 16:25:29 +00001181 int addrlen, len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001182 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001183 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001184 if (!getsockaddrlen(s, &addrlen))
1185 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001186 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001187 if (buf == NULL)
1188 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001189 Py_BEGIN_ALLOW_THREADS
1190 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001191#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001192#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001193 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001194#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001195 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001196#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001197#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001198 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001199#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001200 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001201 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001202 if (n < 0) {
1203 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001204 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001205 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001206 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001207 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001208
1209 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1210 goto finally;
1211
Guido van Rossum73624e91994-10-10 17:59:00 +00001212 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001213 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001214 Py_XDECREF(addr);
1215 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001216 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001217}
1218
Guido van Rossum82a5c661998-07-07 20:45:43 +00001219static char recvfrom_doc[] =
1220"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1221\n\
1222Like recv(buffersize, flags) but also return the sender's address info.";
1223
Guido van Rossum30a685f1991-06-27 15:51:29 +00001224
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001225/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001226
Guido van Rossum73624e91994-10-10 17:59:00 +00001227static PyObject *
1228BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001229{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001230 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001231 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001232 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001233 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001234 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001235 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001236 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001237 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001238 return PySocket_Err();
1239 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001240}
1241
Guido van Rossum82a5c661998-07-07 20:45:43 +00001242static char send_doc[] =
1243"send(data[, flags])\n\
1244\n\
1245Send a data string to the socket. For the optional flags\n\
1246argument, see the Unix manual.";
1247
Guido van Rossum30a685f1991-06-27 15:51:29 +00001248
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001249/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001250
Guido van Rossum73624e91994-10-10 17:59:00 +00001251static PyObject *
1252BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001253{
Guido van Rossum73624e91994-10-10 17:59:00 +00001254 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001255 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001256 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001257 int addrlen, len, n, flags;
1258 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001259 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001260 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001261 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1262 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001263 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001264 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001265 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001266 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001267 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001268 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001269 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001270 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001271 return PySocket_Err();
1272 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001273}
1274
Guido van Rossum82a5c661998-07-07 20:45:43 +00001275static char sendto_doc[] =
1276"sendto(data[, flags], address)\n\
1277\n\
1278Like send(data, flags) but allows specifying the destination address.\n\
1279For IP sockets, the address is a pair (hostaddr, port).";
1280
Guido van Rossum30a685f1991-06-27 15:51:29 +00001281
1282/* s.shutdown(how) method */
1283
Guido van Rossum73624e91994-10-10 17:59:00 +00001284static PyObject *
1285BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001286{
1287 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001288 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001289 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001290 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001291 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001292 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001293 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001294 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001295 return PySocket_Err();
1296 Py_INCREF(Py_None);
1297 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001298}
1299
Guido van Rossum82a5c661998-07-07 20:45:43 +00001300static char shutdown_doc[] =
1301"shutdown(flag)\n\
1302\n\
1303Shut down the reading side of the socket (flag == 0), the writing side\n\
1304of the socket (flag == 1), or both ends (flag == 2).";
1305
Guido van Rossum30a685f1991-06-27 15:51:29 +00001306
1307/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001308
Guido van Rossum73624e91994-10-10 17:59:00 +00001309static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001310 {"accept", (PyCFunction)PySocketSock_accept, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001311 accept_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001312 {"bind", (PyCFunction)PySocketSock_bind, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001313 bind_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001314 {"close", (PyCFunction)PySocketSock_close, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001315 close_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001316 {"connect", (PyCFunction)PySocketSock_connect, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001317 connect_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001318 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001319 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001320#ifndef NO_DUP
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001321 {"dup", (PyCFunction)PySocketSock_dup, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001322 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001323#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001324 {"fileno", (PyCFunction)PySocketSock_fileno, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001325 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001326#ifdef HAVE_GETPEERNAME
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001327 {"getpeername", (PyCFunction)PySocketSock_getpeername, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001328 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001329#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001330 {"getsockname", (PyCFunction)PySocketSock_getsockname, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001331 getsockname_doc},
1332 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1333 getsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001334 {"listen", (PyCFunction)PySocketSock_listen, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001335 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001336#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001337 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1338 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001339#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001340 {"recv", (PyCFunction)PySocketSock_recv, 1,
1341 recv_doc},
1342 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1343 recvfrom_doc},
1344 {"send", (PyCFunction)PySocketSock_send, 1,
1345 send_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001346 {"sendto", (PyCFunction)PySocketSock_sendto, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001347 sendto_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001348 {"setblocking", (PyCFunction)PySocketSock_setblocking, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001349 setblocking_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001350 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001351 setsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001352 {"shutdown", (PyCFunction)PySocketSock_shutdown, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001353 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001354 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001355};
1356
Guido van Rossum30a685f1991-06-27 15:51:29 +00001357
Guido van Rossum73624e91994-10-10 17:59:00 +00001358/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001359 First close the file description. */
1360
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001361static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001362BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001363{
1364 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001365 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001366}
1367
Guido van Rossum30a685f1991-06-27 15:51:29 +00001368
1369/* Return a socket object's named attribute. */
1370
Guido van Rossum73624e91994-10-10 17:59:00 +00001371static PyObject *
1372BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001373{
Guido van Rossum73624e91994-10-10 17:59:00 +00001374 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001375}
1376
Guido van Rossum30a685f1991-06-27 15:51:29 +00001377
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001378static PyObject *
1379BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1380{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001381 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001382 sprintf(buf,
1383 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1384 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001385 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001386}
1387
1388
Guido van Rossumb6775db1994-08-01 11:34:53 +00001389/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001390
Guido van Rossum73624e91994-10-10 17:59:00 +00001391static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001392 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001393 0,
1394 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001395 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001396 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001397 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001398 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001399 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001400 0, /*tp_setattr*/
1401 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001402 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001403 0, /*tp_as_number*/
1404 0, /*tp_as_sequence*/
1405 0, /*tp_as_mapping*/
1406};
1407
Guido van Rossum30a685f1991-06-27 15:51:29 +00001408
Guido van Rossum81194471991-07-27 21:42:02 +00001409/* Python interface to gethostname(). */
1410
1411/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001412static PyObject *
1413BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001414{
1415 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001416 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001417 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001418 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001419 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001420 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001421 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001422 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001423 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001424 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001425 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001426}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001427
Guido van Rossum82a5c661998-07-07 20:45:43 +00001428static char gethostname_doc[] =
1429"gethostname() -> string\n\
1430\n\
1431Return the current host name.";
1432
Guido van Rossumff4949e1992-08-05 19:58:53 +00001433
Guido van Rossum30a685f1991-06-27 15:51:29 +00001434/* Python interface to gethostbyname(name). */
1435
1436/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001437static PyObject *
1438BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001439{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001440 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001441 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001442 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001443 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001444 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001445 return NULL;
1446 return makeipaddr(&addrbuf);
1447}
1448
Guido van Rossum82a5c661998-07-07 20:45:43 +00001449static char gethostbyname_doc[] =
1450"gethostbyname(host) -> address\n\
1451\n\
1452Return the IP address (a string of the form '255.255.255.255') for a host.";
1453
1454
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001455/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1456
1457static PyObject *
1458gethost_common(h, addr)
1459 struct hostent *h;
1460 struct sockaddr_in *addr;
1461{
1462 char **pch;
1463 PyObject *rtn_tuple = (PyObject *)NULL;
1464 PyObject *name_list = (PyObject *)NULL;
1465 PyObject *addr_list = (PyObject *)NULL;
1466 PyObject *tmp;
1467 if (h == NULL) {
1468#ifdef HAVE_HSTRERROR
1469 /* Let's get real error message to return */
1470 extern int h_errno;
1471 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1472#else
1473 PyErr_SetString(PySocket_Error, "host not found");
1474#endif
1475 return NULL;
1476 }
1477 if ((name_list = PyList_New(0)) == NULL)
1478 goto err;
1479 if ((addr_list = PyList_New(0)) == NULL)
1480 goto err;
1481 for (pch = h->h_aliases; *pch != NULL; pch++) {
1482 int status;
1483 tmp = PyString_FromString(*pch);
1484 if (tmp == NULL)
1485 goto err;
1486 status = PyList_Append(name_list, tmp);
1487 Py_DECREF(tmp);
1488 if (status)
1489 goto err;
1490 }
1491 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1492 int status;
1493 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1494 tmp = makeipaddr(addr);
1495 if (tmp == NULL)
1496 goto err;
1497 status = PyList_Append(addr_list, tmp);
1498 Py_DECREF(tmp);
1499 if (status)
1500 goto err;
1501 }
1502 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1503 err:
1504 Py_XDECREF(name_list);
1505 Py_XDECREF(addr_list);
1506 return rtn_tuple;
1507}
1508
1509
1510/* Python interface to gethostbyname_ex(name). */
1511
1512/*ARGSUSED*/
1513static PyObject *
1514BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1515{
1516 char *name;
1517 struct hostent *h;
1518 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001519 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001520#ifdef HAVE_GETHOSTBYNAME_R
1521 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001522#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1523 struct hostent_data data;
1524#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001525 char buf[16384];
1526 int buf_len = (sizeof buf) - 1;
1527 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001528#endif
1529#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001530 int result;
1531#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001532#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001533 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001534 return NULL;
1535 if (setipaddr(name, &addr) < 0)
1536 return NULL;
1537 Py_BEGIN_ALLOW_THREADS
1538#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001539#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001540 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001541#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001542 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001543#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001544 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001545 result = gethostbyname_r(name, &hp_allocated, &data);
1546 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001547#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001548#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001549#ifdef USE_GETHOSTBYNAME_LOCK
1550 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001551#endif
1552 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001553#endif /* HAVE_GETHOSTBYNAME_R */
1554 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001555 ret = gethost_common(h, &addr);
1556#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001557 PyThread_release_lock(gethostbyname_lock);
1558#endif
1559 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001560}
1561
1562static char ghbn_ex_doc[] =
1563"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1564\n\
1565Return the true host name, a list of aliases, and a list of IP addresses,\n\
1566for a host. The host argument is a string giving a host name or IP number.";
1567
1568
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001569/* Python interface to gethostbyaddr(IP). */
1570
1571/*ARGSUSED*/
1572static PyObject *
1573BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1574{
1575 struct sockaddr_in addr;
1576 char *ip_num;
1577 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001578 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001579#ifdef HAVE_GETHOSTBYNAME_R
1580 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001581#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1582 struct hostent_data data;
1583#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001584 char buf[16384];
1585 int buf_len = (sizeof buf) - 1;
1586 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001587#endif
1588#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001589 int result;
1590#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001591#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001592
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001593 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001594 return NULL;
1595 if (setipaddr(ip_num, &addr) < 0)
1596 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001597 Py_BEGIN_ALLOW_THREADS
1598#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001599#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001600 result = gethostbyaddr_r((char *)&addr.sin_addr,
1601 sizeof(addr.sin_addr),
1602 AF_INET, &hp_allocated, buf, buf_len,
1603 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001604#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001605 h = gethostbyaddr_r((char *)&addr.sin_addr,
1606 sizeof(addr.sin_addr),
1607 AF_INET,
1608 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001609#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001610 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001611 result = gethostbyaddr_r((char *)&addr.sin_addr,
1612 sizeof(addr.sin_addr),
1613 AF_INET, &hp_allocated, &data);
1614 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001615#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001616#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001617#ifdef USE_GETHOSTBYNAME_LOCK
1618 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001619#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001620 h = gethostbyaddr((char *)&addr.sin_addr,
1621 sizeof(addr.sin_addr),
1622 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001623#endif /* HAVE_GETHOSTBYNAME_R */
1624 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001625 ret = gethost_common(h, &addr);
1626#ifdef USE_GETHOSTBYNAME_LOCK
1627 PyThread_release_lock(gethostbyname_lock);
1628#endif
1629 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001630}
1631
Guido van Rossum82a5c661998-07-07 20:45:43 +00001632static char gethostbyaddr_doc[] =
1633"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1634\n\
1635Return the true host name, a list of aliases, and a list of IP addresses,\n\
1636for a host. The host argument is a string giving a host name or IP number.";
1637
Guido van Rossum30a685f1991-06-27 15:51:29 +00001638
1639/* Python interface to getservbyname(name).
1640 This only returns the port number, since the other info is already
1641 known or not useful (like the list of aliases). */
1642
1643/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001644static PyObject *
1645BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001646{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001647 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001648 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001649 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001650 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001651 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001652 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001653 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001654 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001655 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001656 return NULL;
1657 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001658 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001659}
1660
Guido van Rossum82a5c661998-07-07 20:45:43 +00001661static char getservbyname_doc[] =
1662"getservbyname(servicename, protocolname) -> integer\n\
1663\n\
1664Return a port number from a service name and protocol name.\n\
1665The protocol name should be 'tcp' or 'udp'.";
1666
Guido van Rossum30a685f1991-06-27 15:51:29 +00001667
Guido van Rossum3901d851996-12-19 16:35:04 +00001668/* Python interface to getprotobyname(name).
1669 This only returns the protocol number, since the other info is
1670 already known or not useful (like the list of aliases). */
1671
1672/*ARGSUSED*/
1673static PyObject *
1674BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1675{
1676 char *name;
1677 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001678#ifdef __BEOS__
1679/* Not available in BeOS yet. - [cjh] */
1680 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1681 return NULL;
1682#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001683 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001684 return NULL;
1685 Py_BEGIN_ALLOW_THREADS
1686 sp = getprotobyname(name);
1687 Py_END_ALLOW_THREADS
1688 if (sp == NULL) {
1689 PyErr_SetString(PySocket_Error, "protocol not found");
1690 return NULL;
1691 }
1692 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001693#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001694}
1695
Guido van Rossum82a5c661998-07-07 20:45:43 +00001696static char getprotobyname_doc[] =
1697"getprotobyname(name) -> integer\n\
1698\n\
1699Return the protocol number for the named protocol. (Rarely used.)";
1700
Guido van Rossum3901d851996-12-19 16:35:04 +00001701
Guido van Rossum30a685f1991-06-27 15:51:29 +00001702/* Python interface to socket(family, type, proto).
1703 The third (protocol) argument is optional.
1704 Return a new socket object. */
1705
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001706/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001707static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001708BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001709{
Guido van Rossum73624e91994-10-10 17:59:00 +00001710 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001711#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001712 SOCKET fd;
1713#else
1714 int fd;
1715#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001716 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001717 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001718 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001719 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001720 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001721 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001722#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001723 if (fd == INVALID_SOCKET)
1724#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001725 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001726#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001727 return PySocket_Err();
1728 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001729 /* If the object can't be created, don't forget to close the
1730 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001731 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001732 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001733 /* From now on, ignore SIGPIPE and let the error checking
1734 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001735#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001736 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001737#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001738 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001739}
1740
Guido van Rossum82a5c661998-07-07 20:45:43 +00001741static char socket_doc[] =
1742"socket(family, type[, proto]) -> socket object\n\
1743\n\
1744Open a socket of the given type. The family argument specifies the\n\
1745address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1746The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1747or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1748specifying the default protocol.";
1749
1750
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001751#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001752/* Create a socket object from a numeric file description.
1753 Useful e.g. if stdin is a socket.
1754 Additional arguments as for socket(). */
1755
1756/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001757static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001758BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001759{
Guido van Rossum73624e91994-10-10 17:59:00 +00001760 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001761 int fd, family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001762 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1763 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001764 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001765 /* Dup the fd so it and the socket can be closed independently */
1766 fd = dup(fd);
1767 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001768 return PySocket_Err();
1769 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001770 /* From now on, ignore SIGPIPE and let the error checking
1771 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001772#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001773 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001774#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001775 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001776}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001777
1778static char fromfd_doc[] =
1779"fromfd(fd, family, type[, proto]) -> socket object\n\
1780\n\
1781Create a socket object from the given file descriptor.\n\
1782The remaining arguments are the same as for socket().";
1783
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001784#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001785
Guido van Rossum82a5c661998-07-07 20:45:43 +00001786
Guido van Rossum006bf911996-06-12 04:04:55 +00001787static PyObject *
1788BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1789{
1790 int x1, x2;
1791
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001792 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001793 return NULL;
1794 }
1795 x2 = (int)ntohs((short)x1);
1796 return PyInt_FromLong(x2);
1797}
1798
Guido van Rossum82a5c661998-07-07 20:45:43 +00001799static char ntohs_doc[] =
1800"ntohs(integer) -> integer\n\
1801\n\
1802Convert a 16-bit integer from network to host byte order.";
1803
1804
Guido van Rossum006bf911996-06-12 04:04:55 +00001805static PyObject *
1806BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1807{
1808 int x1, x2;
1809
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001810 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001811 return NULL;
1812 }
1813 x2 = ntohl(x1);
1814 return PyInt_FromLong(x2);
1815}
1816
Guido van Rossum82a5c661998-07-07 20:45:43 +00001817static char ntohl_doc[] =
1818"ntohl(integer) -> integer\n\
1819\n\
1820Convert a 32-bit integer from network to host byte order.";
1821
1822
Guido van Rossum006bf911996-06-12 04:04:55 +00001823static PyObject *
1824BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1825{
1826 int x1, x2;
1827
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001828 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001829 return NULL;
1830 }
1831 x2 = (int)htons((short)x1);
1832 return PyInt_FromLong(x2);
1833}
1834
Guido van Rossum82a5c661998-07-07 20:45:43 +00001835static char htons_doc[] =
1836"htons(integer) -> integer\n\
1837\n\
1838Convert a 16-bit integer from host to network byte order.";
1839
1840
Guido van Rossum006bf911996-06-12 04:04:55 +00001841static PyObject *
1842BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1843{
1844 int x1, x2;
1845
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001846 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001847 return NULL;
1848 }
1849 x2 = htonl(x1);
1850 return PyInt_FromLong(x2);
1851}
1852
Guido van Rossum82a5c661998-07-07 20:45:43 +00001853static char htonl_doc[] =
1854"htonl(integer) -> integer\n\
1855\n\
1856Convert a 32-bit integer from host to network byte order.";
1857
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001858/*
1859 * socket.inet_aton() and socket.inet_ntoa() functions
1860 *
1861 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
1862 *
1863 */
1864
1865static char inet_aton_doc[] =
1866"inet_aton(string) -> packed 32-bit IP representation\n\
1867\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001868Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001869binary format used in low-level network functions.";
1870
1871static PyObject*
1872BUILD_FUNC_DEF_2(PySocket_inet_aton, PyObject *, self, PyObject *, args)
1873{
Guido van Rossuma2e48551999-09-09 15:42:59 +00001874#ifndef INADDR_NONE
1875#define INADDR_NONE (-1)
1876#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001877
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001878 /* Have to use inet_addr() instead */
1879 char *ip_addr;
1880 long packed_addr;
1881
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001882 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001883 return NULL;
1884 }
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001885#ifdef macintosh
1886 packed_addr = (long)inet_addr(ip_addr).s_addr;
1887#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001888 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001889#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001890
1891 if (packed_addr == INADDR_NONE) { /* invalid address */
1892 PyErr_SetString(PySocket_Error,
1893 "illegal IP address string passed to inet_aton");
1894 return NULL;
1895 }
1896
1897 return PyString_FromStringAndSize((char *) &packed_addr,
1898 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001899}
1900
1901static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00001902"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001903\n\
1904Convert an IP address from 32-bit packed binary format to string format";
1905
1906static PyObject*
1907BUILD_FUNC_DEF_2(PySocket_inet_ntoa, PyObject *, self, PyObject *, args)
1908{
1909 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001910 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001911 struct in_addr packed_addr;
1912
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001913 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001914 return NULL;
1915 }
1916
1917 if (addr_len != sizeof(packed_addr)) {
1918 PyErr_SetString(PySocket_Error,
1919 "packed IP wrong length for inet_ntoa");
1920 return NULL;
1921 }
1922
1923 memcpy(&packed_addr, packed_str, addr_len);
1924
1925 return PyString_FromString(inet_ntoa(packed_addr));
1926}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001927
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001928
1929#ifdef USE_SSL
1930
1931/* This is a C function to be called for new object initialization */
1932static SSLObject *
1933BUILD_FUNC_DEF_3(newSSLObject,
1934 PySocketSockObject *,Sock, char*,key_file, char*,cert_file)
1935{
1936 SSLObject *self;
1937 char *str;
1938
1939#if 0
1940 meth=SSLv23_client_method();
1941 meth=SSLv3_client_method();
1942 meth=SSLv2_client_method();
1943#endif
1944
1945 self = PyObject_NEW(SSLObject, &SSL_Type); /* Create new object */
1946 if (self == NULL){
1947 PyErr_SetObject(SSLErrorObject,
1948 PyString_FromString("newSSLObject error"));
1949 return NULL;
1950 }
1951 memset(self->server, NULL, sizeof(char) * 256);
1952 memset(self->issuer, NULL, sizeof(char) * 256);
1953
1954 self->x_attr = PyDict_New();
1955 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
1956 if (self->ctx == NULL) {
1957 PyErr_SetObject(SSLErrorObject,
1958 PyString_FromString("SSL_CTX_new error"));
1959 PyMem_DEL(self);
1960 return NULL;
1961 }
1962
1963 if ( (key_file && !cert_file) || (!key_file && cert_file) )
1964 {
1965 PyErr_SetObject(SSLErrorObject,
1966 PyString_FromString(
1967 "Both the key & certificate files must be specified"));
1968 PyMem_DEL(self);
1969 return NULL;
1970 }
1971
1972 if (key_file && cert_file)
1973 {
1974 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
1975 SSL_FILETYPE_PEM) < 1)
1976 {
1977 PyErr_SetObject(SSLErrorObject,
1978 PyString_FromString(
1979 "SSL_CTX_use_PrivateKey_file error"));
1980 PyMem_DEL(self);
1981 return NULL;
1982 }
1983
1984 if (SSL_CTX_use_certificate_chain_file(self->ctx,
1985 cert_file) < 1)
1986 {
1987 PyErr_SetObject(SSLErrorObject,
1988 PyString_FromString(
1989 "SSL_CTX_use_certificate_chain_file error"));
1990 PyMem_DEL(self);
1991 return NULL;
1992 }
1993 }
1994
1995 SSL_CTX_set_verify(self->ctx,
1996 SSL_VERIFY_NONE, NULL); /* set verify lvl */
1997 self->ssl = SSL_new(self->ctx); /* New ssl struct */
1998 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
1999 SSL_set_connect_state(self->ssl);
2000
2001 if ((SSL_connect(self->ssl)) == -1) {
2002 /* Actually negotiate SSL connection */
2003 PyErr_SetObject(SSLErrorObject,
2004 PyString_FromString("SSL_connect error"));
2005 PyMem_DEL(self);
2006 return NULL;
2007 }
2008 self->ssl->debug = 1;
2009
2010 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2011 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2012 self->server, 256);
2013 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2014 self->issuer, 256);
2015 }
2016 self->x_attr = NULL;
2017 self->Socket = Sock;
2018 Py_INCREF(self->Socket);
2019 return self;
2020}
2021
2022/* This is the Python function called for new object initialization */
2023static PyObject *
2024BUILD_FUNC_DEF_2(PySocket_ssl, PyObject *, self, PyObject *, args)
2025{
2026 SSLObject *rv;
2027 PySocketSockObject *Sock;
2028 char *key_file;
2029 char *cert_file;
2030
Guido van Rossum43713e52000-02-29 13:59:29 +00002031 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002032 &PySocketSock_Type, (PyObject*)&Sock,
2033 &key_file, &cert_file) )
2034 return NULL;
2035
2036 rv = newSSLObject(Sock, key_file, cert_file);
2037 if ( rv == NULL )
2038 return NULL;
2039 return (PyObject *)rv;
2040}
2041
2042static char ssl_doc[] =
2043"ssl(socket, keyfile, certfile) -> sslobject";
2044
2045static PyObject *
2046BUILD_FUNC_DEF_2(SSL_server, SSLObject *, self, PyObject *, args)
2047{
2048 return PyString_FromString(self->server);
2049}
2050
2051static PyObject *
2052BUILD_FUNC_DEF_2(SSL_issuer, SSLObject *, self, PyObject *, args)
2053{
2054 return PyString_FromString(self->issuer);
2055}
2056
2057
2058/* SSL object methods */
2059
2060static PyMethodDef SSLMethods[] = {
2061 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2062 { "read", (PyCFunction)SSL_SSLread, 1 },
2063 { "server", (PyCFunction)SSL_server, 1 },
2064 { "issuer", (PyCFunction)SSL_issuer, 1 },
2065 { NULL, NULL}
2066};
2067
2068static void SSL_dealloc(SSLObject *self)
2069{
2070 if (self->server_cert) /* Possible not to have one? */
2071 X509_free (self->server_cert);
2072 SSL_CTX_free(self->ctx);
2073 SSL_free(self->ssl);
2074 Py_XDECREF(self->x_attr);
2075 Py_XDECREF(self->Socket);
2076 PyMem_DEL(self);
2077}
2078
2079static PyObject *SSL_getattr(SSLObject *self, char *name)
2080{
2081 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2082}
2083
2084staticforward PyTypeObject SSL_Type = {
2085 PyObject_HEAD_INIT(&PyType_Type)
2086 0, /*ob_size*/
2087 "SSL", /*tp_name*/
2088 sizeof(SSLObject), /*tp_basicsize*/
2089 0, /*tp_itemsize*/
2090 /* methods */
2091 (destructor)SSL_dealloc, /*tp_dealloc*/
2092 0, /*tp_print*/
2093 (getattrfunc)SSL_getattr, /*tp_getattr*/
2094 0, /*tp_setattr*/
2095 0, /*tp_compare*/
2096 0, /*tp_repr*/
2097 0, /*tp_as_number*/
2098 0, /*tp_as_sequence*/
2099 0, /*tp_as_mapping*/
2100 0, /*tp_hash*/
2101};
2102
2103
2104
2105static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2106{
2107 char *data;
2108 int len = 0;
2109
Guido van Rossum43713e52000-02-29 13:59:29 +00002110 if (!PyArg_ParseTuple(args, "s|i:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002111 return NULL;
2112
2113 if (!len)
2114 len = strlen(data);
2115
2116 len = SSL_write(self->ssl, data, len);
2117 return PyInt_FromLong((long)len);
2118}
2119
2120static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2121{
2122 PyObject *buf;
2123 int count = 0;
2124 int len = 1024;
2125 int res;
2126
Guido van Rossum43713e52000-02-29 13:59:29 +00002127 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002128
2129 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2130 return NULL; /* Error object should already be set */
2131
2132 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2133 res = SSL_get_error(self->ssl, count);
2134
2135 switch (res) {
2136 case 0: /* Good return value! */
2137 break;
2138 case 6:
2139 PyErr_SetString(SSLErrorObject, "EOF");
2140 Py_DECREF(buf);
2141 return NULL;
2142 break;
2143 case 5:
2144 default:
2145 return PyErr_SetFromErrno(SSLErrorObject);
2146 break;
2147 }
2148
2149 fflush(stderr);
2150
2151 if (count < 0) {
2152 Py_DECREF(buf);
2153 return PyErr_SetFromErrno(SSLErrorObject);
2154 }
2155
2156 if (count != len && _PyString_Resize(&buf, count) < 0)
2157 return NULL;
2158 return buf;
2159}
2160
2161#endif /* USE_SSL */
2162
2163
Guido van Rossum30a685f1991-06-27 15:51:29 +00002164/* List of functions exported by this module. */
2165
Guido van Rossum73624e91994-10-10 17:59:00 +00002166static PyMethodDef PySocket_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002167 {"gethostbyname", PySocket_gethostbyname, 1, gethostbyname_doc},
2168 {"gethostbyname_ex", PySocket_gethostbyname_ex, 1, ghbn_ex_doc},
2169 {"gethostbyaddr", PySocket_gethostbyaddr, 1, gethostbyaddr_doc},
2170 {"gethostname", PySocket_gethostname, 1, gethostname_doc},
2171 {"getservbyname", PySocket_getservbyname, 1, getservbyname_doc},
2172 {"getprotobyname", PySocket_getprotobyname, 1,getprotobyname_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00002173 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002174#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00002175 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002176#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002177 {"ntohs", PySocket_ntohs, 1, ntohs_doc},
2178 {"ntohl", PySocket_ntohl, 1, ntohl_doc},
2179 {"htons", PySocket_htons, 1, htons_doc},
2180 {"htonl", PySocket_htonl, 1, htonl_doc},
2181 {"inet_aton", PySocket_inet_aton, 1, inet_aton_doc},
2182 {"inet_ntoa", PySocket_inet_ntoa, 1, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002183#ifdef USE_SSL
2184 {"ssl", PySocket_ssl, 1, ssl_doc},
2185#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002186 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002187};
2188
Guido van Rossum30a685f1991-06-27 15:51:29 +00002189
2190/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002191 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002192 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002193 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002194static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002195BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002196{
Guido van Rossum73624e91994-10-10 17:59:00 +00002197 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002198 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002199 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002200
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002201 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002202}
2203
Guido van Rossum30a685f1991-06-27 15:51:29 +00002204
Guido van Rossum8d665e61996-06-26 18:22:49 +00002205#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002206
2207/* Additional initialization and cleanup for NT/Windows */
2208
2209static void
2210NTcleanup()
2211{
2212 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002213}
2214
2215static int
2216NTinit()
2217{
2218 WSADATA WSAData;
2219 int ret;
2220 char buf[100];
2221 ret = WSAStartup(0x0101, &WSAData);
2222 switch (ret) {
2223 case 0: /* no error */
2224 atexit(NTcleanup);
2225 return 1;
2226 case WSASYSNOTREADY:
2227 PyErr_SetString(PyExc_ImportError,
2228 "WSAStartup failed: network not ready");
2229 break;
2230 case WSAVERNOTSUPPORTED:
2231 case WSAEINVAL:
2232 PyErr_SetString(PyExc_ImportError,
2233 "WSAStartup failed: requested version not supported");
2234 break;
2235 default:
2236 sprintf(buf, "WSAStartup failed: error code %d", ret);
2237 PyErr_SetString(PyExc_ImportError, buf);
2238 break;
2239 }
2240 return 0;
2241}
2242
Guido van Rossum8d665e61996-06-26 18:22:49 +00002243#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002244
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002245#if defined(PYOS_OS2)
2246
2247/* Additional initialization and cleanup for OS/2 */
2248
2249static void
2250OS2cleanup()
2251{
2252 /* No cleanup is necessary for OS/2 Sockets */
2253}
2254
2255static int
2256OS2init()
2257{
2258 char reason[64];
2259 int rc = sock_init();
2260
2261 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002262 atexit(OS2cleanup);
2263 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002264 }
2265
2266 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2267 PyErr_SetString(PyExc_ImportError, reason);
2268
Guido van Rossum32c575d1997-12-02 20:37:32 +00002269 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002270}
2271
2272#endif /* PYOS_OS2 */
2273
Guido van Rossum30a685f1991-06-27 15:51:29 +00002274/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002275 * This is called when the first 'import socket' is done,
2276 * via a table in config.c, if config.c is compiled with USE_SOCKET
2277 * defined.
2278 *
2279 * For MS_WINDOWS (which means any Windows variant), this module
2280 * is actually called "_socket", and there's a wrapper "socket.py"
2281 * which implements some missing functionality (such as makefile(),
2282 * dup() and fromfd()). The import of "_socket" may fail with an
2283 * ImportError exception if initialization of WINSOCK fails. When
2284 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2285 * scheduled to be made at exit time.
2286 *
2287 * For OS/2, this module is also called "_socket" and uses a wrapper
2288 * "socket.py" which implements that functionality that is missing
2289 * when PC operating systems don't put socket descriptors in the
2290 * operating system's filesystem layer.
2291 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002292
Guido van Rossum82a5c661998-07-07 20:45:43 +00002293static char module_doc[] =
2294"This module provides socket operations and some related functions.\n\
2295On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
2296On other systems, it only supports IP.\n\
2297\n\
2298Functions:\n\
2299\n\
2300socket() -- create a new socket object\n\
2301fromfd() -- create a socket object from an open file descriptor (*)\n\
2302gethostname() -- return the current hostname\n\
2303gethostbyname() -- map a hostname to its IP number\n\
2304gethostbyaddr() -- map an IP number or hostname to DNS info\n\
2305getservbyname() -- map a service name and a protocol name to a port number\n\
2306getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
2307ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
2308htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002309inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format\n\
2310inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)\n\
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002311ssl() -- secure socket layer support (only available if configured)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002312\n\
2313(*) not available on all platforms!)\n\
2314\n\
2315Special objects:\n\
2316\n\
2317SocketType -- type object for socket objects\n\
2318error -- exception raised for I/O errors\n\
2319\n\
2320Integer constants:\n\
2321\n\
2322AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
2323SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
2324\n\
2325Many other constants may be defined; these may be used in calls to\n\
2326the setsockopt() and getsockopt() methods.\n\
2327";
2328
2329static char sockettype_doc[] =
2330"A socket represents one endpoint of a network connection.\n\
2331\n\
2332Methods:\n\
2333\n\
2334accept() -- accept a connection, returning new socket and client address\n\
2335bind() -- bind the socket to a local address\n\
2336close() -- close the socket\n\
2337connect() -- connect the socket to a remote address\n\
2338connect_ex() -- connect, return an error code instead of an exception \n\
2339dup() -- return a new socket object identical to the current one (*)\n\
2340fileno() -- return underlying file descriptor\n\
2341getpeername() -- return remote address (*)\n\
2342getsockname() -- return local address\n\
2343getsockopt() -- get socket options\n\
2344listen() -- start listening for incoming connections\n\
2345makefile() -- return a file object corresponding tot the socket (*)\n\
2346recv() -- receive data\n\
2347recvfrom() -- receive data and sender's address\n\
2348send() -- send data\n\
2349sendto() -- send data to a given address\n\
2350setblocking() -- set or clear the blocking I/O flag\n\
2351setsockopt() -- set socket options\n\
2352shutdown() -- shut down traffic in one or both directions\n\
2353\n\
2354(*) not available on all platforms!)";
2355
Guido van Rossum3886bb61998-12-04 18:50:17 +00002356DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00002357#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002358init_socket()
2359#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002360initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00002361#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002362{
Guido van Rossum73624e91994-10-10 17:59:00 +00002363 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00002364#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002365 if (!NTinit())
2366 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002367 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002368#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002369#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002370 if (!OS2init())
2371 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002372 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002373#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00002374#if defined(__BEOS__)
2375 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
2376#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002377 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002378#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00002379#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00002380#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002381 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002382 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2383 if (PySocket_Error == NULL)
2384 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002385#ifdef USE_SSL
2386 SSL_load_error_strings();
2387 SSLeay_add_ssl_algorithms();
2388 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2389 if (SSLErrorObject == NULL)
2390 return;
2391 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2392 Py_INCREF(&SSL_Type);
2393 if (PyDict_SetItemString(d, "SSLType",
2394 (PyObject *)&SSL_Type) != 0)
2395 return;
2396#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002397 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002398 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002399 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002400 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002401 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002402 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002403 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002404
2405 /* Address families (we only support AF_INET and AF_UNIX) */
2406#ifdef AF_UNSPEC
2407 insint(d, "AF_UNSPEC", AF_UNSPEC);
2408#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002409 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002410#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002411 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002412#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002413#ifdef AF_AX25
2414 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2415#endif
2416#ifdef AF_IPX
2417 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2418#endif
2419#ifdef AF_APPLETALK
2420 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2421#endif
2422#ifdef AF_NETROM
2423 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2424#endif
2425#ifdef AF_BRIDGE
2426 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2427#endif
2428#ifdef AF_AAL5
2429 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2430#endif
2431#ifdef AF_X25
2432 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2433#endif
2434#ifdef AF_INET6
2435 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2436#endif
2437#ifdef AF_ROSE
2438 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2439#endif
2440
2441 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002442 insint(d, "SOCK_STREAM", SOCK_STREAM);
2443 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002444#ifndef __BEOS__
2445/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002446 insint(d, "SOCK_RAW", SOCK_RAW);
2447 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2448 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002449#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002450
2451#ifdef SO_DEBUG
2452 insint(d, "SO_DEBUG", SO_DEBUG);
2453#endif
2454#ifdef SO_ACCEPTCONN
2455 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2456#endif
2457#ifdef SO_REUSEADDR
2458 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2459#endif
2460#ifdef SO_KEEPALIVE
2461 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2462#endif
2463#ifdef SO_DONTROUTE
2464 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2465#endif
2466#ifdef SO_BROADCAST
2467 insint(d, "SO_BROADCAST", SO_BROADCAST);
2468#endif
2469#ifdef SO_USELOOPBACK
2470 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2471#endif
2472#ifdef SO_LINGER
2473 insint(d, "SO_LINGER", SO_LINGER);
2474#endif
2475#ifdef SO_OOBINLINE
2476 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2477#endif
2478#ifdef SO_REUSEPORT
2479 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2480#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002481#ifdef SO_SNDBUF
2482 insint(d, "SO_SNDBUF", SO_SNDBUF);
2483#endif
2484#ifdef SO_RCVBUF
2485 insint(d, "SO_RCVBUF", SO_RCVBUF);
2486#endif
2487#ifdef SO_SNDLOWAT
2488 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2489#endif
2490#ifdef SO_RCVLOWAT
2491 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2492#endif
2493#ifdef SO_SNDTIMEO
2494 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2495#endif
2496#ifdef SO_RCVTIMEO
2497 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2498#endif
2499#ifdef SO_ERROR
2500 insint(d, "SO_ERROR", SO_ERROR);
2501#endif
2502#ifdef SO_TYPE
2503 insint(d, "SO_TYPE", SO_TYPE);
2504#endif
2505
2506 /* Maximum number of connections for "listen" */
2507#ifdef SOMAXCONN
2508 insint(d, "SOMAXCONN", SOMAXCONN);
2509#else
2510 insint(d, "SOMAXCONN", 5); /* Common value */
2511#endif
2512
2513 /* Flags for send, recv */
2514#ifdef MSG_OOB
2515 insint(d, "MSG_OOB", MSG_OOB);
2516#endif
2517#ifdef MSG_PEEK
2518 insint(d, "MSG_PEEK", MSG_PEEK);
2519#endif
2520#ifdef MSG_DONTROUTE
2521 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2522#endif
2523#ifdef MSG_EOR
2524 insint(d, "MSG_EOR", MSG_EOR);
2525#endif
2526#ifdef MSG_TRUNC
2527 insint(d, "MSG_TRUNC", MSG_TRUNC);
2528#endif
2529#ifdef MSG_CTRUNC
2530 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2531#endif
2532#ifdef MSG_WAITALL
2533 insint(d, "MSG_WAITALL", MSG_WAITALL);
2534#endif
2535#ifdef MSG_BTAG
2536 insint(d, "MSG_BTAG", MSG_BTAG);
2537#endif
2538#ifdef MSG_ETAG
2539 insint(d, "MSG_ETAG", MSG_ETAG);
2540#endif
2541
2542 /* Protocol level and numbers, usable for [gs]etsockopt */
2543#ifdef SOL_SOCKET
2544 insint(d, "SOL_SOCKET", SOL_SOCKET);
2545#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002546#ifdef SOL_IP
2547 insint(d, "SOL_IP", SOL_IP);
2548#else
2549 insint(d, "SOL_IP", 0);
2550#endif
2551#ifdef SOL_IPX
2552 insint(d, "SOL_IPX", SOL_IPX);
2553#endif
2554#ifdef SOL_AX25
2555 insint(d, "SOL_AX25", SOL_AX25);
2556#endif
2557#ifdef SOL_ATALK
2558 insint(d, "SOL_ATALK", SOL_ATALK);
2559#endif
2560#ifdef SOL_NETROM
2561 insint(d, "SOL_NETROM", SOL_NETROM);
2562#endif
2563#ifdef SOL_ROSE
2564 insint(d, "SOL_ROSE", SOL_ROSE);
2565#endif
2566#ifdef SOL_TCP
2567 insint(d, "SOL_TCP", SOL_TCP);
2568#else
2569 insint(d, "SOL_TCP", 6);
2570#endif
2571#ifdef SOL_UDP
2572 insint(d, "SOL_UDP", SOL_UDP);
2573#else
2574 insint(d, "SOL_UDP", 17);
2575#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002576#ifdef IPPROTO_IP
2577 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002578#else
2579 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002580#endif
2581#ifdef IPPROTO_ICMP
2582 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002583#else
2584 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002585#endif
2586#ifdef IPPROTO_IGMP
2587 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2588#endif
2589#ifdef IPPROTO_GGP
2590 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2591#endif
2592#ifdef IPPROTO_TCP
2593 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002594#else
2595 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002596#endif
2597#ifdef IPPROTO_EGP
2598 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2599#endif
2600#ifdef IPPROTO_PUP
2601 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2602#endif
2603#ifdef IPPROTO_UDP
2604 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002605#else
2606 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002607#endif
2608#ifdef IPPROTO_IDP
2609 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2610#endif
2611#ifdef IPPROTO_HELLO
2612 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2613#endif
2614#ifdef IPPROTO_ND
2615 insint(d, "IPPROTO_ND", IPPROTO_ND);
2616#endif
2617#ifdef IPPROTO_TP
2618 insint(d, "IPPROTO_TP", IPPROTO_TP);
2619#endif
2620#ifdef IPPROTO_XTP
2621 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2622#endif
2623#ifdef IPPROTO_EON
2624 insint(d, "IPPROTO_EON", IPPROTO_EON);
2625#endif
2626#ifdef IPPROTO_BIP
2627 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2628#endif
2629/**/
2630#ifdef IPPROTO_RAW
2631 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002632#else
2633 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002634#endif
2635#ifdef IPPROTO_MAX
2636 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2637#endif
2638
2639 /* Some port configuration */
2640#ifdef IPPORT_RESERVED
2641 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2642#else
2643 insint(d, "IPPORT_RESERVED", 1024);
2644#endif
2645#ifdef IPPORT_USERRESERVED
2646 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2647#else
2648 insint(d, "IPPORT_USERRESERVED", 5000);
2649#endif
2650
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002651 /* Some reserved IP v.4 addresses */
2652#ifdef INADDR_ANY
2653 insint(d, "INADDR_ANY", INADDR_ANY);
2654#else
2655 insint(d, "INADDR_ANY", 0x00000000);
2656#endif
2657#ifdef INADDR_BROADCAST
2658 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2659#else
2660 insint(d, "INADDR_BROADCAST", 0xffffffff);
2661#endif
2662#ifdef INADDR_LOOPBACK
2663 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2664#else
2665 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2666#endif
2667#ifdef INADDR_UNSPEC_GROUP
2668 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2669#else
2670 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2671#endif
2672#ifdef INADDR_ALLHOSTS_GROUP
2673 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2674#else
2675 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2676#endif
2677#ifdef INADDR_MAX_LOCAL_GROUP
2678 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2679#else
2680 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2681#endif
2682#ifdef INADDR_NONE
2683 insint(d, "INADDR_NONE", INADDR_NONE);
2684#else
2685 insint(d, "INADDR_NONE", 0xffffffff);
2686#endif
2687
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002688 /* IP [gs]etsockopt options */
2689#ifdef IP_OPTIONS
2690 insint(d, "IP_OPTIONS", IP_OPTIONS);
2691#endif
2692#ifdef IP_HDRINCL
2693 insint(d, "IP_HDRINCL", IP_HDRINCL);
2694#endif
2695#ifdef IP_TOS
2696 insint(d, "IP_TOS", IP_TOS);
2697#endif
2698#ifdef IP_TTL
2699 insint(d, "IP_TTL", IP_TTL);
2700#endif
2701#ifdef IP_RECVOPTS
2702 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2703#endif
2704#ifdef IP_RECVRETOPTS
2705 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2706#endif
2707#ifdef IP_RECVDSTADDR
2708 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2709#endif
2710#ifdef IP_RETOPTS
2711 insint(d, "IP_RETOPTS", IP_RETOPTS);
2712#endif
2713#ifdef IP_MULTICAST_IF
2714 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2715#endif
2716#ifdef IP_MULTICAST_TTL
2717 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2718#endif
2719#ifdef IP_MULTICAST_LOOP
2720 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2721#endif
2722#ifdef IP_ADD_MEMBERSHIP
2723 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2724#endif
2725#ifdef IP_DROP_MEMBERSHIP
2726 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2727#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002728#ifdef IP_DEFAULT_MULTICAST_TTL
2729 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2730#endif
2731#ifdef IP_DEFAULT_MULTICAST_LOOP
2732 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2733#endif
2734#ifdef IP_MAX_MEMBERSHIPS
2735 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2736#endif
2737
2738 /* TCP options */
2739#ifdef TCP_NODELAY
2740 insint(d, "TCP_NODELAY", TCP_NODELAY);
2741#endif
2742#ifdef TCP_MAXSEG
2743 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2744#endif
2745
2746 /* IPX options */
2747#ifdef IPX_TYPE
2748 insint(d, "IPX_TYPE", IPX_TYPE);
2749#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002750
2751 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002752#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002753 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002754#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002755}