blob: 5e63e53910620e845b8ae16c4e3c013207ba7921 [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 Rossum73624e91994-10-10 17:59:00 +0000646 PyErr_SetString(PySocket_Error, "getsockaddrarg: 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 Rossum73624e91994-10-10 17:59:00 +0000664 if (!PyArg_NoArgs(args))
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 Rossumfe28fa01997-05-15 19:09:26 +0000713 if (!PyArg_Parse(args, "i", &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 Rossum73624e91994-10-10 17:59:00 +0000766 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000767 buf = (char *) &flag;
768 buflen = sizeof flag;
769 }
770 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000771 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +0000772 if (!PyArg_Parse(args, "(iis#)", &level, &optname,
773 &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000774 return NULL;
775 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000776 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000777 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000778 return PySocket_Err();
779 Py_INCREF(Py_None);
780 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000781}
782
Guido van Rossum82a5c661998-07-07 20:45:43 +0000783static char setsockopt_doc[] =
784"setsockopt(level, option, value)\n\
785\n\
786Set a socket option. See the Unix manual for level and option.\n\
787The value argument can either be an integer or a string.";
788
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000789
Guido van Rossumaee08791992-09-08 09:05:33 +0000790/* s.getsockopt() method.
791 With two arguments, retrieves an integer option.
792 With a third integer argument, retrieves a string buffer of that size;
793 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000794
Guido van Rossum73624e91994-10-10 17:59:00 +0000795static PyObject *
796BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000797{
798 int level;
799 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000800 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000801 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000802 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000803
Guido van Rossumbcc20741998-08-04 22:53:56 +0000804#ifdef __BEOS__
805/* We have incomplete socket support. */
806 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
807 return NULL;
808#else
809
Guido van Rossumbe32c891996-06-20 16:25:29 +0000810 if (!PyArg_ParseTuple(args, "ii|i", &level, &optname, &buflen))
811 return NULL;
812
813 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000814 int flag = 0;
815 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000816 res = getsockopt(s->sock_fd, level, optname,
817 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000818 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000819 return PySocket_Err();
820 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000821 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000822 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000823 PyErr_SetString(PySocket_Error,
824 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000825 return NULL;
826 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000827 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000828 if (buf == NULL)
829 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000830 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000831 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000832 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000833 Py_DECREF(buf);
834 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000835 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000836 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000837 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000838#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000839}
840
Guido van Rossum82a5c661998-07-07 20:45:43 +0000841static char getsockopt_doc[] =
842"getsockopt(level, option[, buffersize]) -> value\n\
843\n\
844Get a socket option. See the Unix manual for level and option.\n\
845If a nonzero buffersize argument is given, the return value is a\n\
846string of that length; otherwise it is an integer.";
847
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000848
Guido van Rossum30a685f1991-06-27 15:51:29 +0000849/* s.bind(sockaddr) method */
850
Guido van Rossum73624e91994-10-10 17:59:00 +0000851static PyObject *
852BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000853{
854 struct sockaddr *addr;
855 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000856 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000857 if (!getsockaddrarg(s, args, &addr, &addrlen))
858 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000859 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000860 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000861 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000862 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000863 return PySocket_Err();
864 Py_INCREF(Py_None);
865 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000866}
867
Guido van Rossum82a5c661998-07-07 20:45:43 +0000868static char bind_doc[] =
869"bind(address)\n\
870\n\
871Bind the socket to a local address. For IP sockets, the address is a\n\
872pair (host, port); the host must refer to the local host.";
873
Guido van Rossum30a685f1991-06-27 15:51:29 +0000874
875/* s.close() method.
876 Set the file descriptor to -1 so operations tried subsequently
877 will surely fail. */
878
Guido van Rossum73624e91994-10-10 17:59:00 +0000879static PyObject *
880BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000881{
Guido van Rossum73624e91994-10-10 17:59:00 +0000882 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000883 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000884 if (s->sock_fd != -1) {
885 Py_BEGIN_ALLOW_THREADS
886 (void) close(s->sock_fd);
887 Py_END_ALLOW_THREADS
888 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000889 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000890 Py_INCREF(Py_None);
891 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000892}
893
Guido van Rossum82a5c661998-07-07 20:45:43 +0000894static char close_doc[] =
895"close()\n\
896\n\
897Close the socket. It cannot be used after this call.";
898
Guido van Rossum30a685f1991-06-27 15:51:29 +0000899
900/* s.connect(sockaddr) method */
901
Guido van Rossum73624e91994-10-10 17:59:00 +0000902static PyObject *
903BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000904{
905 struct sockaddr *addr;
906 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000907 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000908 if (!getsockaddrarg(s, args, &addr, &addrlen))
909 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000910 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000911 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000912 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000913 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000914 return PySocket_Err();
915 Py_INCREF(Py_None);
916 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000917}
918
Guido van Rossum82a5c661998-07-07 20:45:43 +0000919static char connect_doc[] =
920"connect(address)\n\
921\n\
922Connect the socket to a remote address. For IP sockets, the address\n\
923is a pair (host, port).";
924
Guido van Rossum30a685f1991-06-27 15:51:29 +0000925
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000926/* s.connect_ex(sockaddr) method */
927
928static PyObject *
929BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
930{
931 struct sockaddr *addr;
932 int addrlen;
933 int res;
934 if (!getsockaddrarg(s, args, &addr, &addrlen))
935 return NULL;
936 Py_BEGIN_ALLOW_THREADS
937 res = connect(s->sock_fd, addr, addrlen);
938 Py_END_ALLOW_THREADS
939 if (res != 0)
940 res = errno;
941 return PyInt_FromLong((long) res);
942}
943
Guido van Rossum82a5c661998-07-07 20:45:43 +0000944static char connect_ex_doc[] =
945"connect_ex(address)\n\
946\n\
947This is like connect(address), but returns an error code (the errno value)\n\
948instead of raising an exception when an error occurs.";
949
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000950
Guido van Rossumed233a51992-06-23 09:07:03 +0000951/* s.fileno() method */
952
Guido van Rossum73624e91994-10-10 17:59:00 +0000953static PyObject *
954BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000955{
Guido van Rossum73624e91994-10-10 17:59:00 +0000956 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000957 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000958 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000959}
960
Guido van Rossum82a5c661998-07-07 20:45:43 +0000961static char fileno_doc[] =
962"fileno() -> integer\n\
963\n\
964Return the integer file descriptor of the socket.";
965
Guido van Rossumed233a51992-06-23 09:07:03 +0000966
Guido van Rossumbe32c891996-06-20 16:25:29 +0000967#ifndef NO_DUP
968/* s.dup() method */
969
970static PyObject *
971BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
972{
973 int newfd;
974 PyObject *sock;
975 if (!PyArg_NoArgs(args))
976 return NULL;
977 newfd = dup(s->sock_fd);
978 if (newfd < 0)
979 return PySocket_Err();
980 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000981 s->sock_family,
982 s->sock_type,
983 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000984 if (sock == NULL)
985 close(newfd);
986 return sock;
987}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000988
989static char dup_doc[] =
990"dup() -> socket object\n\
991\n\
992Return a new socket object connected to the same system resource.";
993
Guido van Rossumbe32c891996-06-20 16:25:29 +0000994#endif
995
996
Guido van Rossumc89705d1992-11-26 08:54:07 +0000997/* s.getsockname() method */
998
Guido van Rossum73624e91994-10-10 17:59:00 +0000999static PyObject *
1000BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001001{
1002 char addrbuf[256];
1003 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001004 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001005 return NULL;
1006 if (!getsockaddrlen(s, &addrlen))
1007 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001008 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001009 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001010 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001011 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001012 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001013 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001014 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1015}
1016
Guido van Rossum82a5c661998-07-07 20:45:43 +00001017static char getsockname_doc[] =
1018"getsockname() -> address info\n\
1019\n\
1020Return the address of the local endpoint. For IP sockets, the address\n\
1021info is a pair (hostaddr, port).";
1022
Guido van Rossumc89705d1992-11-26 08:54:07 +00001023
Guido van Rossumb6775db1994-08-01 11:34:53 +00001024#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001025/* s.getpeername() method */
1026
Guido van Rossum73624e91994-10-10 17:59:00 +00001027static PyObject *
1028BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001029{
1030 char addrbuf[256];
1031 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001032 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001033 return NULL;
1034 if (!getsockaddrlen(s, &addrlen))
1035 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001036 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001037 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001038 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001039 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001040 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001041 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1042}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001043
1044static char getpeername_doc[] =
1045"getpeername() -> address info\n\
1046\n\
1047Return the address of the remote endpoint. For IP sockets, the address\n\
1048info is a pair (hostaddr, port).";
1049
Guido van Rossumb6775db1994-08-01 11:34:53 +00001050#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001051
1052
Guido van Rossum30a685f1991-06-27 15:51:29 +00001053/* s.listen(n) method */
1054
Guido van Rossum73624e91994-10-10 17:59:00 +00001055static PyObject *
1056BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001057{
1058 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001059 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +00001060 if (!PyArg_Parse(args, "i", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001061 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001062 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001063 if (backlog < 1)
1064 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001065 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001066 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001067 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001068 return PySocket_Err();
1069 Py_INCREF(Py_None);
1070 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001071}
1072
Guido van Rossum82a5c661998-07-07 20:45:43 +00001073static char listen_doc[] =
1074"listen(backlog)\n\
1075\n\
1076Enable a server to accept connections. The backlog argument must be at\n\
1077least 1; it specifies the number of unaccepted connection that the system\n\
1078will allow before refusing new connections.";
1079
1080
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001081#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001082/* s.makefile(mode) method.
1083 Create a new open file object referring to a dupped version of
1084 the socket's file descriptor. (The dup() call is necessary so
1085 that the open file and socket objects may be closed independent
1086 of each other.)
1087 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1088
Guido van Rossum73624e91994-10-10 17:59:00 +00001089static PyObject *
1090BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001091{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001092 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +00001093 char *mode = "r";
1094 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001095 int fd;
1096 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001097 PyObject *f;
1098
1099 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001100 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001101#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001102 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1103 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001104#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001105 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001106#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001107 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001108 if (fd >= 0)
1109 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001110 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001111 }
1112 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1113 if (f != NULL)
1114 PyFile_SetBufSize(f, bufsize);
1115 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001116}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001117
1118static char makefile_doc[] =
1119"makefile([mode[, buffersize]]) -> file object\n\
1120\n\
1121Return a regular file object corresponding to the socket.\n\
1122The mode and buffersize arguments are as for the built-in open() function.";
1123
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001124#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001125
Guido van Rossum82a5c661998-07-07 20:45:43 +00001126
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001127/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001128
Guido van Rossum73624e91994-10-10 17:59:00 +00001129static PyObject *
1130BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001131{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001132 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001133 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001134 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1135 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001136 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001137 if (buf == NULL)
1138 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001139 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001140 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001141 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001142 if (n < 0) {
1143 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001144 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001145 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001146 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001147 return NULL;
1148 return buf;
1149}
1150
Guido van Rossum82a5c661998-07-07 20:45:43 +00001151static char recv_doc[] =
1152"recv(buffersize[, flags]) -> data\n\
1153\n\
1154Receive up to buffersize bytes from the socket. For the optional flags\n\
1155argument, see the Unix manual. When no data is available, block until\n\
1156at least one byte is available or until the remote end is closed. When\n\
1157the remote end is closed and all data is read, return the empty string.";
1158
Guido van Rossum30a685f1991-06-27 15:51:29 +00001159
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001160/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001161
Guido van Rossum73624e91994-10-10 17:59:00 +00001162static PyObject *
1163BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001164{
1165 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001166 PyObject *buf = NULL;
1167 PyObject *addr = NULL;
1168 PyObject *ret = NULL;
1169
Guido van Rossumbe32c891996-06-20 16:25:29 +00001170 int addrlen, len, n, flags = 0;
1171 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1172 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001173 if (!getsockaddrlen(s, &addrlen))
1174 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001175 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001176 if (buf == NULL)
1177 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001178 Py_BEGIN_ALLOW_THREADS
1179 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001180#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001181#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001182 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001183#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001184 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001185#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001186#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001187 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001188#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001189 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001190 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001191 if (n < 0) {
1192 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001193 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001194 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001195 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001196 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001197
1198 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1199 goto finally;
1200
Guido van Rossum73624e91994-10-10 17:59:00 +00001201 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001202 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001203 Py_XDECREF(addr);
1204 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001205 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001206}
1207
Guido van Rossum82a5c661998-07-07 20:45:43 +00001208static char recvfrom_doc[] =
1209"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1210\n\
1211Like recv(buffersize, flags) but also return the sender's address info.";
1212
Guido van Rossum30a685f1991-06-27 15:51:29 +00001213
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001214/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001215
Guido van Rossum73624e91994-10-10 17:59:00 +00001216static PyObject *
1217BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001218{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001219 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001220 int len, n, flags = 0;
1221 if (!PyArg_ParseTuple(args, "s#|i", &buf, &len, &flags))
1222 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001223 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001224 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001225 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001226 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001227 return PySocket_Err();
1228 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001229}
1230
Guido van Rossum82a5c661998-07-07 20:45:43 +00001231static char send_doc[] =
1232"send(data[, flags])\n\
1233\n\
1234Send a data string to the socket. For the optional flags\n\
1235argument, see the Unix manual.";
1236
Guido van Rossum30a685f1991-06-27 15:51:29 +00001237
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001238/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001239
Guido van Rossum73624e91994-10-10 17:59:00 +00001240static PyObject *
1241BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001242{
Guido van Rossum73624e91994-10-10 17:59:00 +00001243 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001244 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001245 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001246 int addrlen, len, n, flags;
1247 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001248 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
1249 PyErr_Clear();
1250 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001251 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001252 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001253 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001254 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001255 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001256 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001257 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001258 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001259 return PySocket_Err();
1260 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001261}
1262
Guido van Rossum82a5c661998-07-07 20:45:43 +00001263static char sendto_doc[] =
1264"sendto(data[, flags], address)\n\
1265\n\
1266Like send(data, flags) but allows specifying the destination address.\n\
1267For IP sockets, the address is a pair (hostaddr, port).";
1268
Guido van Rossum30a685f1991-06-27 15:51:29 +00001269
1270/* s.shutdown(how) method */
1271
Guido van Rossum73624e91994-10-10 17:59:00 +00001272static PyObject *
1273BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001274{
1275 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001276 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +00001277 if (!PyArg_Parse(args, "i", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001278 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001279 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001280 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001281 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001282 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001283 return PySocket_Err();
1284 Py_INCREF(Py_None);
1285 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001286}
1287
Guido van Rossum82a5c661998-07-07 20:45:43 +00001288static char shutdown_doc[] =
1289"shutdown(flag)\n\
1290\n\
1291Shut down the reading side of the socket (flag == 0), the writing side\n\
1292of the socket (flag == 1), or both ends (flag == 2).";
1293
Guido van Rossum30a685f1991-06-27 15:51:29 +00001294
1295/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001296
Guido van Rossum73624e91994-10-10 17:59:00 +00001297static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001298 {"accept", (PyCFunction)PySocketSock_accept, 0,
1299 accept_doc},
1300 {"bind", (PyCFunction)PySocketSock_bind, 0,
1301 bind_doc},
1302 {"close", (PyCFunction)PySocketSock_close, 0,
1303 close_doc},
1304 {"connect", (PyCFunction)PySocketSock_connect, 0,
1305 connect_doc},
1306 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 0,
1307 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001308#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001309 {"dup", (PyCFunction)PySocketSock_dup, 0,
1310 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001311#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001312 {"fileno", (PyCFunction)PySocketSock_fileno, 0,
1313 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001314#ifdef HAVE_GETPEERNAME
Guido van Rossum82a5c661998-07-07 20:45:43 +00001315 {"getpeername", (PyCFunction)PySocketSock_getpeername, 0,
1316 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001317#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001318 {"getsockname", (PyCFunction)PySocketSock_getsockname, 0,
1319 getsockname_doc},
1320 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1321 getsockopt_doc},
1322 {"listen", (PyCFunction)PySocketSock_listen, 0,
1323 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001324#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001325 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1326 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001327#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001328 {"recv", (PyCFunction)PySocketSock_recv, 1,
1329 recv_doc},
1330 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1331 recvfrom_doc},
1332 {"send", (PyCFunction)PySocketSock_send, 1,
1333 send_doc},
1334 {"sendto", (PyCFunction)PySocketSock_sendto, 0,
1335 sendto_doc},
1336 {"setblocking", (PyCFunction)PySocketSock_setblocking, 0,
1337 setblocking_doc},
1338 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 0,
1339 setsockopt_doc},
1340 {"shutdown", (PyCFunction)PySocketSock_shutdown, 0,
1341 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001342 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001343};
1344
Guido van Rossum30a685f1991-06-27 15:51:29 +00001345
Guido van Rossum73624e91994-10-10 17:59:00 +00001346/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001347 First close the file description. */
1348
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001349static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001350BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001351{
1352 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001353 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001354}
1355
Guido van Rossum30a685f1991-06-27 15:51:29 +00001356
1357/* Return a socket object's named attribute. */
1358
Guido van Rossum73624e91994-10-10 17:59:00 +00001359static PyObject *
1360BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001361{
Guido van Rossum73624e91994-10-10 17:59:00 +00001362 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001363}
1364
Guido van Rossum30a685f1991-06-27 15:51:29 +00001365
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001366static PyObject *
1367BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1368{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001369 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001370 sprintf(buf,
1371 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1372 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001373 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001374}
1375
1376
Guido van Rossumb6775db1994-08-01 11:34:53 +00001377/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001378
Guido van Rossum73624e91994-10-10 17:59:00 +00001379static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001380 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001381 0,
1382 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001383 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001384 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001385 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001386 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001387 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001388 0, /*tp_setattr*/
1389 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001390 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001391 0, /*tp_as_number*/
1392 0, /*tp_as_sequence*/
1393 0, /*tp_as_mapping*/
1394};
1395
Guido van Rossum30a685f1991-06-27 15:51:29 +00001396
Guido van Rossum81194471991-07-27 21:42:02 +00001397/* Python interface to gethostname(). */
1398
1399/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001400static PyObject *
1401BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001402{
1403 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001404 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001405 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +00001406 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001407 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001408 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001409 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001410 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001411 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001412 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001413 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001414}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001415
Guido van Rossum82a5c661998-07-07 20:45:43 +00001416static char gethostname_doc[] =
1417"gethostname() -> string\n\
1418\n\
1419Return the current host name.";
1420
Guido van Rossumff4949e1992-08-05 19:58:53 +00001421
Guido van Rossum30a685f1991-06-27 15:51:29 +00001422/* Python interface to gethostbyname(name). */
1423
1424/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001425static PyObject *
1426BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001427{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001428 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001429 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001430 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001431 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001432 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001433 return NULL;
1434 return makeipaddr(&addrbuf);
1435}
1436
Guido van Rossum82a5c661998-07-07 20:45:43 +00001437static char gethostbyname_doc[] =
1438"gethostbyname(host) -> address\n\
1439\n\
1440Return the IP address (a string of the form '255.255.255.255') for a host.";
1441
1442
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001443/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1444
1445static PyObject *
1446gethost_common(h, addr)
1447 struct hostent *h;
1448 struct sockaddr_in *addr;
1449{
1450 char **pch;
1451 PyObject *rtn_tuple = (PyObject *)NULL;
1452 PyObject *name_list = (PyObject *)NULL;
1453 PyObject *addr_list = (PyObject *)NULL;
1454 PyObject *tmp;
1455 if (h == NULL) {
1456#ifdef HAVE_HSTRERROR
1457 /* Let's get real error message to return */
1458 extern int h_errno;
1459 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1460#else
1461 PyErr_SetString(PySocket_Error, "host not found");
1462#endif
1463 return NULL;
1464 }
1465 if ((name_list = PyList_New(0)) == NULL)
1466 goto err;
1467 if ((addr_list = PyList_New(0)) == NULL)
1468 goto err;
1469 for (pch = h->h_aliases; *pch != NULL; pch++) {
1470 int status;
1471 tmp = PyString_FromString(*pch);
1472 if (tmp == NULL)
1473 goto err;
1474 status = PyList_Append(name_list, tmp);
1475 Py_DECREF(tmp);
1476 if (status)
1477 goto err;
1478 }
1479 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1480 int status;
1481 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1482 tmp = makeipaddr(addr);
1483 if (tmp == NULL)
1484 goto err;
1485 status = PyList_Append(addr_list, tmp);
1486 Py_DECREF(tmp);
1487 if (status)
1488 goto err;
1489 }
1490 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1491 err:
1492 Py_XDECREF(name_list);
1493 Py_XDECREF(addr_list);
1494 return rtn_tuple;
1495}
1496
1497
1498/* Python interface to gethostbyname_ex(name). */
1499
1500/*ARGSUSED*/
1501static PyObject *
1502BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1503{
1504 char *name;
1505 struct hostent *h;
1506 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001507 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001508#ifdef HAVE_GETHOSTBYNAME_R
1509 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001510#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1511 struct hostent_data data;
1512#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001513 char buf[16384];
1514 int buf_len = (sizeof buf) - 1;
1515 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001516#endif
1517#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001518 int result;
1519#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001520#endif /* HAVE_GETHOSTBYNAME_R */
1521 if (!PyArg_Parse(args, "s", &name))
1522 return NULL;
1523 if (setipaddr(name, &addr) < 0)
1524 return NULL;
1525 Py_BEGIN_ALLOW_THREADS
1526#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001527#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001528 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001529#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001530 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001531#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001532 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001533 result = gethostbyname_r(name, &hp_allocated, &data);
1534 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001535#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001536#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001537#ifdef USE_GETHOSTBYNAME_LOCK
1538 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001539#endif
1540 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001541#endif /* HAVE_GETHOSTBYNAME_R */
1542 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001543 ret = gethost_common(h, &addr);
1544#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001545 PyThread_release_lock(gethostbyname_lock);
1546#endif
1547 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001548}
1549
1550static char ghbn_ex_doc[] =
1551"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1552\n\
1553Return the true host name, a list of aliases, and a list of IP addresses,\n\
1554for a host. The host argument is a string giving a host name or IP number.";
1555
1556
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001557/* Python interface to gethostbyaddr(IP). */
1558
1559/*ARGSUSED*/
1560static PyObject *
1561BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1562{
1563 struct sockaddr_in addr;
1564 char *ip_num;
1565 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001566 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001567#ifdef HAVE_GETHOSTBYNAME_R
1568 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001569#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1570 struct hostent_data data;
1571#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001572 char buf[16384];
1573 int buf_len = (sizeof buf) - 1;
1574 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001575#endif
1576#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001577 int result;
1578#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001579#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001580
1581 if (!PyArg_Parse(args, "s", &ip_num))
1582 return NULL;
1583 if (setipaddr(ip_num, &addr) < 0)
1584 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001585 Py_BEGIN_ALLOW_THREADS
1586#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001587#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001588 result = gethostbyaddr_r((char *)&addr.sin_addr,
1589 sizeof(addr.sin_addr),
1590 AF_INET, &hp_allocated, buf, buf_len,
1591 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001592#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001593 h = gethostbyaddr_r((char *)&addr.sin_addr,
1594 sizeof(addr.sin_addr),
1595 AF_INET,
1596 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001597#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001598 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001599 result = gethostbyaddr_r((char *)&addr.sin_addr,
1600 sizeof(addr.sin_addr),
1601 AF_INET, &hp_allocated, &data);
1602 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001603#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001604#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001605#ifdef USE_GETHOSTBYNAME_LOCK
1606 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001607#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001608 h = gethostbyaddr((char *)&addr.sin_addr,
1609 sizeof(addr.sin_addr),
1610 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001611#endif /* HAVE_GETHOSTBYNAME_R */
1612 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001613 ret = gethost_common(h, &addr);
1614#ifdef USE_GETHOSTBYNAME_LOCK
1615 PyThread_release_lock(gethostbyname_lock);
1616#endif
1617 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001618}
1619
Guido van Rossum82a5c661998-07-07 20:45:43 +00001620static char gethostbyaddr_doc[] =
1621"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1622\n\
1623Return the true host name, a list of aliases, and a list of IP addresses,\n\
1624for a host. The host argument is a string giving a host name or IP number.";
1625
Guido van Rossum30a685f1991-06-27 15:51:29 +00001626
1627/* Python interface to getservbyname(name).
1628 This only returns the port number, since the other info is already
1629 known or not useful (like the list of aliases). */
1630
1631/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001632static PyObject *
1633BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001634{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001635 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001636 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001637 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001638 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001639 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001640 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001641 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001642 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001643 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001644 return NULL;
1645 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001646 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001647}
1648
Guido van Rossum82a5c661998-07-07 20:45:43 +00001649static char getservbyname_doc[] =
1650"getservbyname(servicename, protocolname) -> integer\n\
1651\n\
1652Return a port number from a service name and protocol name.\n\
1653The protocol name should be 'tcp' or 'udp'.";
1654
Guido van Rossum30a685f1991-06-27 15:51:29 +00001655
Guido van Rossum3901d851996-12-19 16:35:04 +00001656/* Python interface to getprotobyname(name).
1657 This only returns the protocol number, since the other info is
1658 already known or not useful (like the list of aliases). */
1659
1660/*ARGSUSED*/
1661static PyObject *
1662BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1663{
1664 char *name;
1665 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001666#ifdef __BEOS__
1667/* Not available in BeOS yet. - [cjh] */
1668 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1669 return NULL;
1670#else
Guido van Rossum3901d851996-12-19 16:35:04 +00001671 if (!PyArg_Parse(args, "s", &name))
1672 return NULL;
1673 Py_BEGIN_ALLOW_THREADS
1674 sp = getprotobyname(name);
1675 Py_END_ALLOW_THREADS
1676 if (sp == NULL) {
1677 PyErr_SetString(PySocket_Error, "protocol not found");
1678 return NULL;
1679 }
1680 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001681#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001682}
1683
Guido van Rossum82a5c661998-07-07 20:45:43 +00001684static char getprotobyname_doc[] =
1685"getprotobyname(name) -> integer\n\
1686\n\
1687Return the protocol number for the named protocol. (Rarely used.)";
1688
Guido van Rossum3901d851996-12-19 16:35:04 +00001689
Guido van Rossum30a685f1991-06-27 15:51:29 +00001690/* Python interface to socket(family, type, proto).
1691 The third (protocol) argument is optional.
1692 Return a new socket object. */
1693
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001694/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001695static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001696BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001697{
Guido van Rossum73624e91994-10-10 17:59:00 +00001698 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001699#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001700 SOCKET fd;
1701#else
1702 int fd;
1703#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001704 int family, type, proto = 0;
1705 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1706 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001707 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001708 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001709 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001710#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001711 if (fd == INVALID_SOCKET)
1712#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001713 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001714#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001715 return PySocket_Err();
1716 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001717 /* If the object can't be created, don't forget to close the
1718 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001719 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001720 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001721 /* From now on, ignore SIGPIPE and let the error checking
1722 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001723#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001724 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001725#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001726 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001727}
1728
Guido van Rossum82a5c661998-07-07 20:45:43 +00001729static char socket_doc[] =
1730"socket(family, type[, proto]) -> socket object\n\
1731\n\
1732Open a socket of the given type. The family argument specifies the\n\
1733address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1734The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1735or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1736specifying the default protocol.";
1737
1738
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001739#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001740/* Create a socket object from a numeric file description.
1741 Useful e.g. if stdin is a socket.
1742 Additional arguments as for socket(). */
1743
1744/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001745static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001746BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001747{
Guido van Rossum73624e91994-10-10 17:59:00 +00001748 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001749 int fd, family, type, proto = 0;
1750 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1751 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001752 /* Dup the fd so it and the socket can be closed independently */
1753 fd = dup(fd);
1754 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001755 return PySocket_Err();
1756 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001757 /* From now on, ignore SIGPIPE and let the error checking
1758 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001759#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001760 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001761#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001762 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001763}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001764
1765static char fromfd_doc[] =
1766"fromfd(fd, family, type[, proto]) -> socket object\n\
1767\n\
1768Create a socket object from the given file descriptor.\n\
1769The remaining arguments are the same as for socket().";
1770
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001771#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001772
Guido van Rossum82a5c661998-07-07 20:45:43 +00001773
Guido van Rossum006bf911996-06-12 04:04:55 +00001774static PyObject *
1775BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1776{
1777 int x1, x2;
1778
1779 if (!PyArg_Parse(args, "i", &x1)) {
1780 return NULL;
1781 }
1782 x2 = (int)ntohs((short)x1);
1783 return PyInt_FromLong(x2);
1784}
1785
Guido van Rossum82a5c661998-07-07 20:45:43 +00001786static char ntohs_doc[] =
1787"ntohs(integer) -> integer\n\
1788\n\
1789Convert a 16-bit integer from network to host byte order.";
1790
1791
Guido van Rossum006bf911996-06-12 04:04:55 +00001792static PyObject *
1793BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1794{
1795 int x1, x2;
1796
1797 if (!PyArg_Parse(args, "i", &x1)) {
1798 return NULL;
1799 }
1800 x2 = ntohl(x1);
1801 return PyInt_FromLong(x2);
1802}
1803
Guido van Rossum82a5c661998-07-07 20:45:43 +00001804static char ntohl_doc[] =
1805"ntohl(integer) -> integer\n\
1806\n\
1807Convert a 32-bit integer from network to host byte order.";
1808
1809
Guido van Rossum006bf911996-06-12 04:04:55 +00001810static PyObject *
1811BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1812{
1813 int x1, x2;
1814
1815 if (!PyArg_Parse(args, "i", &x1)) {
1816 return NULL;
1817 }
1818 x2 = (int)htons((short)x1);
1819 return PyInt_FromLong(x2);
1820}
1821
Guido van Rossum82a5c661998-07-07 20:45:43 +00001822static char htons_doc[] =
1823"htons(integer) -> integer\n\
1824\n\
1825Convert a 16-bit integer from host to network byte order.";
1826
1827
Guido van Rossum006bf911996-06-12 04:04:55 +00001828static PyObject *
1829BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1830{
1831 int x1, x2;
1832
1833 if (!PyArg_Parse(args, "i", &x1)) {
1834 return NULL;
1835 }
1836 x2 = htonl(x1);
1837 return PyInt_FromLong(x2);
1838}
1839
Guido van Rossum82a5c661998-07-07 20:45:43 +00001840static char htonl_doc[] =
1841"htonl(integer) -> integer\n\
1842\n\
1843Convert a 32-bit integer from host to network byte order.";
1844
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001845/*
1846 * socket.inet_aton() and socket.inet_ntoa() functions
1847 *
1848 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
1849 *
1850 */
1851
1852static char inet_aton_doc[] =
1853"inet_aton(string) -> packed 32-bit IP representation\n\
1854\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001855Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001856binary format used in low-level network functions.";
1857
1858static PyObject*
1859BUILD_FUNC_DEF_2(PySocket_inet_aton, PyObject *, self, PyObject *, args)
1860{
Guido van Rossuma2e48551999-09-09 15:42:59 +00001861#ifndef INADDR_NONE
1862#define INADDR_NONE (-1)
1863#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001864
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001865 /* Have to use inet_addr() instead */
1866 char *ip_addr;
1867 long packed_addr;
1868
1869 if (!PyArg_Parse(args, "s", &ip_addr)) {
1870 return NULL;
1871 }
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001872#ifdef macintosh
1873 packed_addr = (long)inet_addr(ip_addr).s_addr;
1874#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001875 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001876#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001877
1878 if (packed_addr == INADDR_NONE) { /* invalid address */
1879 PyErr_SetString(PySocket_Error,
1880 "illegal IP address string passed to inet_aton");
1881 return NULL;
1882 }
1883
1884 return PyString_FromStringAndSize((char *) &packed_addr,
1885 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001886}
1887
1888static char inet_ntoa_doc[] =
1889"inet_aton(packed_ip) -> ip_address_string\n\
1890\n\
1891Convert an IP address from 32-bit packed binary format to string format";
1892
1893static PyObject*
1894BUILD_FUNC_DEF_2(PySocket_inet_ntoa, PyObject *, self, PyObject *, args)
1895{
1896 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001897 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001898 struct in_addr packed_addr;
1899
1900 if (!PyArg_Parse(args, "s#", &packed_str, &addr_len)) {
1901 return NULL;
1902 }
1903
1904 if (addr_len != sizeof(packed_addr)) {
1905 PyErr_SetString(PySocket_Error,
1906 "packed IP wrong length for inet_ntoa");
1907 return NULL;
1908 }
1909
1910 memcpy(&packed_addr, packed_str, addr_len);
1911
1912 return PyString_FromString(inet_ntoa(packed_addr));
1913}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001914
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001915
1916#ifdef USE_SSL
1917
1918/* This is a C function to be called for new object initialization */
1919static SSLObject *
1920BUILD_FUNC_DEF_3(newSSLObject,
1921 PySocketSockObject *,Sock, char*,key_file, char*,cert_file)
1922{
1923 SSLObject *self;
1924 char *str;
1925
1926#if 0
1927 meth=SSLv23_client_method();
1928 meth=SSLv3_client_method();
1929 meth=SSLv2_client_method();
1930#endif
1931
1932 self = PyObject_NEW(SSLObject, &SSL_Type); /* Create new object */
1933 if (self == NULL){
1934 PyErr_SetObject(SSLErrorObject,
1935 PyString_FromString("newSSLObject error"));
1936 return NULL;
1937 }
1938 memset(self->server, NULL, sizeof(char) * 256);
1939 memset(self->issuer, NULL, sizeof(char) * 256);
1940
1941 self->x_attr = PyDict_New();
1942 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
1943 if (self->ctx == NULL) {
1944 PyErr_SetObject(SSLErrorObject,
1945 PyString_FromString("SSL_CTX_new error"));
1946 PyMem_DEL(self);
1947 return NULL;
1948 }
1949
1950 if ( (key_file && !cert_file) || (!key_file && cert_file) )
1951 {
1952 PyErr_SetObject(SSLErrorObject,
1953 PyString_FromString(
1954 "Both the key & certificate files must be specified"));
1955 PyMem_DEL(self);
1956 return NULL;
1957 }
1958
1959 if (key_file && cert_file)
1960 {
1961 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
1962 SSL_FILETYPE_PEM) < 1)
1963 {
1964 PyErr_SetObject(SSLErrorObject,
1965 PyString_FromString(
1966 "SSL_CTX_use_PrivateKey_file error"));
1967 PyMem_DEL(self);
1968 return NULL;
1969 }
1970
1971 if (SSL_CTX_use_certificate_chain_file(self->ctx,
1972 cert_file) < 1)
1973 {
1974 PyErr_SetObject(SSLErrorObject,
1975 PyString_FromString(
1976 "SSL_CTX_use_certificate_chain_file error"));
1977 PyMem_DEL(self);
1978 return NULL;
1979 }
1980 }
1981
1982 SSL_CTX_set_verify(self->ctx,
1983 SSL_VERIFY_NONE, NULL); /* set verify lvl */
1984 self->ssl = SSL_new(self->ctx); /* New ssl struct */
1985 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
1986 SSL_set_connect_state(self->ssl);
1987
1988 if ((SSL_connect(self->ssl)) == -1) {
1989 /* Actually negotiate SSL connection */
1990 PyErr_SetObject(SSLErrorObject,
1991 PyString_FromString("SSL_connect error"));
1992 PyMem_DEL(self);
1993 return NULL;
1994 }
1995 self->ssl->debug = 1;
1996
1997 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
1998 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
1999 self->server, 256);
2000 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2001 self->issuer, 256);
2002 }
2003 self->x_attr = NULL;
2004 self->Socket = Sock;
2005 Py_INCREF(self->Socket);
2006 return self;
2007}
2008
2009/* This is the Python function called for new object initialization */
2010static PyObject *
2011BUILD_FUNC_DEF_2(PySocket_ssl, PyObject *, self, PyObject *, args)
2012{
2013 SSLObject *rv;
2014 PySocketSockObject *Sock;
2015 char *key_file;
2016 char *cert_file;
2017
2018 if (!PyArg_ParseTuple(args, "O!zz",
2019 &PySocketSock_Type, (PyObject*)&Sock,
2020 &key_file, &cert_file) )
2021 return NULL;
2022
2023 rv = newSSLObject(Sock, key_file, cert_file);
2024 if ( rv == NULL )
2025 return NULL;
2026 return (PyObject *)rv;
2027}
2028
2029static char ssl_doc[] =
2030"ssl(socket, keyfile, certfile) -> sslobject";
2031
2032static PyObject *
2033BUILD_FUNC_DEF_2(SSL_server, SSLObject *, self, PyObject *, args)
2034{
2035 return PyString_FromString(self->server);
2036}
2037
2038static PyObject *
2039BUILD_FUNC_DEF_2(SSL_issuer, SSLObject *, self, PyObject *, args)
2040{
2041 return PyString_FromString(self->issuer);
2042}
2043
2044
2045/* SSL object methods */
2046
2047static PyMethodDef SSLMethods[] = {
2048 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2049 { "read", (PyCFunction)SSL_SSLread, 1 },
2050 { "server", (PyCFunction)SSL_server, 1 },
2051 { "issuer", (PyCFunction)SSL_issuer, 1 },
2052 { NULL, NULL}
2053};
2054
2055static void SSL_dealloc(SSLObject *self)
2056{
2057 if (self->server_cert) /* Possible not to have one? */
2058 X509_free (self->server_cert);
2059 SSL_CTX_free(self->ctx);
2060 SSL_free(self->ssl);
2061 Py_XDECREF(self->x_attr);
2062 Py_XDECREF(self->Socket);
2063 PyMem_DEL(self);
2064}
2065
2066static PyObject *SSL_getattr(SSLObject *self, char *name)
2067{
2068 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2069}
2070
2071staticforward PyTypeObject SSL_Type = {
2072 PyObject_HEAD_INIT(&PyType_Type)
2073 0, /*ob_size*/
2074 "SSL", /*tp_name*/
2075 sizeof(SSLObject), /*tp_basicsize*/
2076 0, /*tp_itemsize*/
2077 /* methods */
2078 (destructor)SSL_dealloc, /*tp_dealloc*/
2079 0, /*tp_print*/
2080 (getattrfunc)SSL_getattr, /*tp_getattr*/
2081 0, /*tp_setattr*/
2082 0, /*tp_compare*/
2083 0, /*tp_repr*/
2084 0, /*tp_as_number*/
2085 0, /*tp_as_sequence*/
2086 0, /*tp_as_mapping*/
2087 0, /*tp_hash*/
2088};
2089
2090
2091
2092static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2093{
2094 char *data;
2095 int len = 0;
2096
2097 if (!PyArg_ParseTuple(args, "s|i", &data, &len))
2098 return NULL;
2099
2100 if (!len)
2101 len = strlen(data);
2102
2103 len = SSL_write(self->ssl, data, len);
2104 return PyInt_FromLong((long)len);
2105}
2106
2107static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2108{
2109 PyObject *buf;
2110 int count = 0;
2111 int len = 1024;
2112 int res;
2113
2114 PyArg_ParseTuple(args, "|i", &len);
2115
2116 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2117 return NULL; /* Error object should already be set */
2118
2119 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2120 res = SSL_get_error(self->ssl, count);
2121
2122 switch (res) {
2123 case 0: /* Good return value! */
2124 break;
2125 case 6:
2126 PyErr_SetString(SSLErrorObject, "EOF");
2127 Py_DECREF(buf);
2128 return NULL;
2129 break;
2130 case 5:
2131 default:
2132 return PyErr_SetFromErrno(SSLErrorObject);
2133 break;
2134 }
2135
2136 fflush(stderr);
2137
2138 if (count < 0) {
2139 Py_DECREF(buf);
2140 return PyErr_SetFromErrno(SSLErrorObject);
2141 }
2142
2143 if (count != len && _PyString_Resize(&buf, count) < 0)
2144 return NULL;
2145 return buf;
2146}
2147
2148#endif /* USE_SSL */
2149
2150
Guido van Rossum30a685f1991-06-27 15:51:29 +00002151/* List of functions exported by this module. */
2152
Guido van Rossum73624e91994-10-10 17:59:00 +00002153static PyMethodDef PySocket_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00002154 {"gethostbyname", PySocket_gethostbyname, 0, gethostbyname_doc},
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002155 {"gethostbyname_ex", PySocket_gethostbyname_ex, 0, ghbn_ex_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00002156 {"gethostbyaddr", PySocket_gethostbyaddr, 0, gethostbyaddr_doc},
2157 {"gethostname", PySocket_gethostname, 0, gethostname_doc},
2158 {"getservbyname", PySocket_getservbyname, 0, getservbyname_doc},
2159 {"getprotobyname", PySocket_getprotobyname, 0,getprotobyname_doc},
2160 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002161#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00002162 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002163#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002164 {"ntohs", PySocket_ntohs, 0, ntohs_doc},
2165 {"ntohl", PySocket_ntohl, 0, ntohl_doc},
2166 {"htons", PySocket_htons, 0, htons_doc},
2167 {"htonl", PySocket_htonl, 0, htonl_doc},
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002168 {"inet_aton", PySocket_inet_aton, 0, inet_aton_doc},
2169 {"inet_ntoa", PySocket_inet_ntoa, 0, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002170#ifdef USE_SSL
2171 {"ssl", PySocket_ssl, 1, ssl_doc},
2172#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002173 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002174};
2175
Guido van Rossum30a685f1991-06-27 15:51:29 +00002176
2177/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002178 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002179 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002180 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002181static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002182BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002183{
Guido van Rossum73624e91994-10-10 17:59:00 +00002184 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002185 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002186 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002187
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002188 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002189}
2190
Guido van Rossum30a685f1991-06-27 15:51:29 +00002191
Guido van Rossum8d665e61996-06-26 18:22:49 +00002192#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002193
2194/* Additional initialization and cleanup for NT/Windows */
2195
2196static void
2197NTcleanup()
2198{
2199 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002200}
2201
2202static int
2203NTinit()
2204{
2205 WSADATA WSAData;
2206 int ret;
2207 char buf[100];
2208 ret = WSAStartup(0x0101, &WSAData);
2209 switch (ret) {
2210 case 0: /* no error */
2211 atexit(NTcleanup);
2212 return 1;
2213 case WSASYSNOTREADY:
2214 PyErr_SetString(PyExc_ImportError,
2215 "WSAStartup failed: network not ready");
2216 break;
2217 case WSAVERNOTSUPPORTED:
2218 case WSAEINVAL:
2219 PyErr_SetString(PyExc_ImportError,
2220 "WSAStartup failed: requested version not supported");
2221 break;
2222 default:
2223 sprintf(buf, "WSAStartup failed: error code %d", ret);
2224 PyErr_SetString(PyExc_ImportError, buf);
2225 break;
2226 }
2227 return 0;
2228}
2229
Guido van Rossum8d665e61996-06-26 18:22:49 +00002230#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002231
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002232#if defined(PYOS_OS2)
2233
2234/* Additional initialization and cleanup for OS/2 */
2235
2236static void
2237OS2cleanup()
2238{
2239 /* No cleanup is necessary for OS/2 Sockets */
2240}
2241
2242static int
2243OS2init()
2244{
2245 char reason[64];
2246 int rc = sock_init();
2247
2248 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002249 atexit(OS2cleanup);
2250 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002251 }
2252
2253 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2254 PyErr_SetString(PyExc_ImportError, reason);
2255
Guido van Rossum32c575d1997-12-02 20:37:32 +00002256 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002257}
2258
2259#endif /* PYOS_OS2 */
2260
Guido van Rossum30a685f1991-06-27 15:51:29 +00002261/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002262 * This is called when the first 'import socket' is done,
2263 * via a table in config.c, if config.c is compiled with USE_SOCKET
2264 * defined.
2265 *
2266 * For MS_WINDOWS (which means any Windows variant), this module
2267 * is actually called "_socket", and there's a wrapper "socket.py"
2268 * which implements some missing functionality (such as makefile(),
2269 * dup() and fromfd()). The import of "_socket" may fail with an
2270 * ImportError exception if initialization of WINSOCK fails. When
2271 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2272 * scheduled to be made at exit time.
2273 *
2274 * For OS/2, this module is also called "_socket" and uses a wrapper
2275 * "socket.py" which implements that functionality that is missing
2276 * when PC operating systems don't put socket descriptors in the
2277 * operating system's filesystem layer.
2278 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002279
Guido van Rossum82a5c661998-07-07 20:45:43 +00002280static char module_doc[] =
2281"This module provides socket operations and some related functions.\n\
2282On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
2283On other systems, it only supports IP.\n\
2284\n\
2285Functions:\n\
2286\n\
2287socket() -- create a new socket object\n\
2288fromfd() -- create a socket object from an open file descriptor (*)\n\
2289gethostname() -- return the current hostname\n\
2290gethostbyname() -- map a hostname to its IP number\n\
2291gethostbyaddr() -- map an IP number or hostname to DNS info\n\
2292getservbyname() -- map a service name and a protocol name to a port number\n\
2293getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
2294ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
2295htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002296inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format\n\
2297inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)\n\
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002298ssl() -- secure socket layer support (only available if configured)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002299\n\
2300(*) not available on all platforms!)\n\
2301\n\
2302Special objects:\n\
2303\n\
2304SocketType -- type object for socket objects\n\
2305error -- exception raised for I/O errors\n\
2306\n\
2307Integer constants:\n\
2308\n\
2309AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
2310SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
2311\n\
2312Many other constants may be defined; these may be used in calls to\n\
2313the setsockopt() and getsockopt() methods.\n\
2314";
2315
2316static char sockettype_doc[] =
2317"A socket represents one endpoint of a network connection.\n\
2318\n\
2319Methods:\n\
2320\n\
2321accept() -- accept a connection, returning new socket and client address\n\
2322bind() -- bind the socket to a local address\n\
2323close() -- close the socket\n\
2324connect() -- connect the socket to a remote address\n\
2325connect_ex() -- connect, return an error code instead of an exception \n\
2326dup() -- return a new socket object identical to the current one (*)\n\
2327fileno() -- return underlying file descriptor\n\
2328getpeername() -- return remote address (*)\n\
2329getsockname() -- return local address\n\
2330getsockopt() -- get socket options\n\
2331listen() -- start listening for incoming connections\n\
2332makefile() -- return a file object corresponding tot the socket (*)\n\
2333recv() -- receive data\n\
2334recvfrom() -- receive data and sender's address\n\
2335send() -- send data\n\
2336sendto() -- send data to a given address\n\
2337setblocking() -- set or clear the blocking I/O flag\n\
2338setsockopt() -- set socket options\n\
2339shutdown() -- shut down traffic in one or both directions\n\
2340\n\
2341(*) not available on all platforms!)";
2342
Guido van Rossum3886bb61998-12-04 18:50:17 +00002343DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00002344#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002345init_socket()
2346#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002347initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00002348#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002349{
Guido van Rossum73624e91994-10-10 17:59:00 +00002350 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00002351#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002352 if (!NTinit())
2353 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002354 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002355#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002356#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002357 if (!OS2init())
2358 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002359 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002360#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00002361#if defined(__BEOS__)
2362 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
2363#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002364 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002365#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00002366#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00002367#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002368 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002369 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2370 if (PySocket_Error == NULL)
2371 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002372#ifdef USE_SSL
2373 SSL_load_error_strings();
2374 SSLeay_add_ssl_algorithms();
2375 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2376 if (SSLErrorObject == NULL)
2377 return;
2378 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2379 Py_INCREF(&SSL_Type);
2380 if (PyDict_SetItemString(d, "SSLType",
2381 (PyObject *)&SSL_Type) != 0)
2382 return;
2383#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002384 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002385 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002386 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002387 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002388 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002389 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002390 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002391
2392 /* Address families (we only support AF_INET and AF_UNIX) */
2393#ifdef AF_UNSPEC
2394 insint(d, "AF_UNSPEC", AF_UNSPEC);
2395#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002396 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002397#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002398 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002399#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002400#ifdef AF_AX25
2401 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2402#endif
2403#ifdef AF_IPX
2404 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2405#endif
2406#ifdef AF_APPLETALK
2407 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2408#endif
2409#ifdef AF_NETROM
2410 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2411#endif
2412#ifdef AF_BRIDGE
2413 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2414#endif
2415#ifdef AF_AAL5
2416 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2417#endif
2418#ifdef AF_X25
2419 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2420#endif
2421#ifdef AF_INET6
2422 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2423#endif
2424#ifdef AF_ROSE
2425 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2426#endif
2427
2428 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002429 insint(d, "SOCK_STREAM", SOCK_STREAM);
2430 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002431#ifndef __BEOS__
2432/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002433 insint(d, "SOCK_RAW", SOCK_RAW);
2434 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2435 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002436#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002437
2438#ifdef SO_DEBUG
2439 insint(d, "SO_DEBUG", SO_DEBUG);
2440#endif
2441#ifdef SO_ACCEPTCONN
2442 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2443#endif
2444#ifdef SO_REUSEADDR
2445 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2446#endif
2447#ifdef SO_KEEPALIVE
2448 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2449#endif
2450#ifdef SO_DONTROUTE
2451 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2452#endif
2453#ifdef SO_BROADCAST
2454 insint(d, "SO_BROADCAST", SO_BROADCAST);
2455#endif
2456#ifdef SO_USELOOPBACK
2457 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2458#endif
2459#ifdef SO_LINGER
2460 insint(d, "SO_LINGER", SO_LINGER);
2461#endif
2462#ifdef SO_OOBINLINE
2463 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2464#endif
2465#ifdef SO_REUSEPORT
2466 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2467#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002468#ifdef SO_SNDBUF
2469 insint(d, "SO_SNDBUF", SO_SNDBUF);
2470#endif
2471#ifdef SO_RCVBUF
2472 insint(d, "SO_RCVBUF", SO_RCVBUF);
2473#endif
2474#ifdef SO_SNDLOWAT
2475 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2476#endif
2477#ifdef SO_RCVLOWAT
2478 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2479#endif
2480#ifdef SO_SNDTIMEO
2481 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2482#endif
2483#ifdef SO_RCVTIMEO
2484 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2485#endif
2486#ifdef SO_ERROR
2487 insint(d, "SO_ERROR", SO_ERROR);
2488#endif
2489#ifdef SO_TYPE
2490 insint(d, "SO_TYPE", SO_TYPE);
2491#endif
2492
2493 /* Maximum number of connections for "listen" */
2494#ifdef SOMAXCONN
2495 insint(d, "SOMAXCONN", SOMAXCONN);
2496#else
2497 insint(d, "SOMAXCONN", 5); /* Common value */
2498#endif
2499
2500 /* Flags for send, recv */
2501#ifdef MSG_OOB
2502 insint(d, "MSG_OOB", MSG_OOB);
2503#endif
2504#ifdef MSG_PEEK
2505 insint(d, "MSG_PEEK", MSG_PEEK);
2506#endif
2507#ifdef MSG_DONTROUTE
2508 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2509#endif
2510#ifdef MSG_EOR
2511 insint(d, "MSG_EOR", MSG_EOR);
2512#endif
2513#ifdef MSG_TRUNC
2514 insint(d, "MSG_TRUNC", MSG_TRUNC);
2515#endif
2516#ifdef MSG_CTRUNC
2517 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2518#endif
2519#ifdef MSG_WAITALL
2520 insint(d, "MSG_WAITALL", MSG_WAITALL);
2521#endif
2522#ifdef MSG_BTAG
2523 insint(d, "MSG_BTAG", MSG_BTAG);
2524#endif
2525#ifdef MSG_ETAG
2526 insint(d, "MSG_ETAG", MSG_ETAG);
2527#endif
2528
2529 /* Protocol level and numbers, usable for [gs]etsockopt */
2530#ifdef SOL_SOCKET
2531 insint(d, "SOL_SOCKET", SOL_SOCKET);
2532#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002533#ifdef SOL_IP
2534 insint(d, "SOL_IP", SOL_IP);
2535#else
2536 insint(d, "SOL_IP", 0);
2537#endif
2538#ifdef SOL_IPX
2539 insint(d, "SOL_IPX", SOL_IPX);
2540#endif
2541#ifdef SOL_AX25
2542 insint(d, "SOL_AX25", SOL_AX25);
2543#endif
2544#ifdef SOL_ATALK
2545 insint(d, "SOL_ATALK", SOL_ATALK);
2546#endif
2547#ifdef SOL_NETROM
2548 insint(d, "SOL_NETROM", SOL_NETROM);
2549#endif
2550#ifdef SOL_ROSE
2551 insint(d, "SOL_ROSE", SOL_ROSE);
2552#endif
2553#ifdef SOL_TCP
2554 insint(d, "SOL_TCP", SOL_TCP);
2555#else
2556 insint(d, "SOL_TCP", 6);
2557#endif
2558#ifdef SOL_UDP
2559 insint(d, "SOL_UDP", SOL_UDP);
2560#else
2561 insint(d, "SOL_UDP", 17);
2562#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002563#ifdef IPPROTO_IP
2564 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002565#else
2566 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002567#endif
2568#ifdef IPPROTO_ICMP
2569 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002570#else
2571 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002572#endif
2573#ifdef IPPROTO_IGMP
2574 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2575#endif
2576#ifdef IPPROTO_GGP
2577 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2578#endif
2579#ifdef IPPROTO_TCP
2580 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002581#else
2582 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002583#endif
2584#ifdef IPPROTO_EGP
2585 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2586#endif
2587#ifdef IPPROTO_PUP
2588 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2589#endif
2590#ifdef IPPROTO_UDP
2591 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002592#else
2593 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002594#endif
2595#ifdef IPPROTO_IDP
2596 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2597#endif
2598#ifdef IPPROTO_HELLO
2599 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2600#endif
2601#ifdef IPPROTO_ND
2602 insint(d, "IPPROTO_ND", IPPROTO_ND);
2603#endif
2604#ifdef IPPROTO_TP
2605 insint(d, "IPPROTO_TP", IPPROTO_TP);
2606#endif
2607#ifdef IPPROTO_XTP
2608 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2609#endif
2610#ifdef IPPROTO_EON
2611 insint(d, "IPPROTO_EON", IPPROTO_EON);
2612#endif
2613#ifdef IPPROTO_BIP
2614 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2615#endif
2616/**/
2617#ifdef IPPROTO_RAW
2618 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002619#else
2620 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002621#endif
2622#ifdef IPPROTO_MAX
2623 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2624#endif
2625
2626 /* Some port configuration */
2627#ifdef IPPORT_RESERVED
2628 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2629#else
2630 insint(d, "IPPORT_RESERVED", 1024);
2631#endif
2632#ifdef IPPORT_USERRESERVED
2633 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2634#else
2635 insint(d, "IPPORT_USERRESERVED", 5000);
2636#endif
2637
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002638 /* Some reserved IP v.4 addresses */
2639#ifdef INADDR_ANY
2640 insint(d, "INADDR_ANY", INADDR_ANY);
2641#else
2642 insint(d, "INADDR_ANY", 0x00000000);
2643#endif
2644#ifdef INADDR_BROADCAST
2645 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2646#else
2647 insint(d, "INADDR_BROADCAST", 0xffffffff);
2648#endif
2649#ifdef INADDR_LOOPBACK
2650 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2651#else
2652 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2653#endif
2654#ifdef INADDR_UNSPEC_GROUP
2655 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2656#else
2657 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2658#endif
2659#ifdef INADDR_ALLHOSTS_GROUP
2660 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2661#else
2662 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2663#endif
2664#ifdef INADDR_MAX_LOCAL_GROUP
2665 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2666#else
2667 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2668#endif
2669#ifdef INADDR_NONE
2670 insint(d, "INADDR_NONE", INADDR_NONE);
2671#else
2672 insint(d, "INADDR_NONE", 0xffffffff);
2673#endif
2674
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002675 /* IP [gs]etsockopt options */
2676#ifdef IP_OPTIONS
2677 insint(d, "IP_OPTIONS", IP_OPTIONS);
2678#endif
2679#ifdef IP_HDRINCL
2680 insint(d, "IP_HDRINCL", IP_HDRINCL);
2681#endif
2682#ifdef IP_TOS
2683 insint(d, "IP_TOS", IP_TOS);
2684#endif
2685#ifdef IP_TTL
2686 insint(d, "IP_TTL", IP_TTL);
2687#endif
2688#ifdef IP_RECVOPTS
2689 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2690#endif
2691#ifdef IP_RECVRETOPTS
2692 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2693#endif
2694#ifdef IP_RECVDSTADDR
2695 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2696#endif
2697#ifdef IP_RETOPTS
2698 insint(d, "IP_RETOPTS", IP_RETOPTS);
2699#endif
2700#ifdef IP_MULTICAST_IF
2701 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2702#endif
2703#ifdef IP_MULTICAST_TTL
2704 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2705#endif
2706#ifdef IP_MULTICAST_LOOP
2707 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2708#endif
2709#ifdef IP_ADD_MEMBERSHIP
2710 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2711#endif
2712#ifdef IP_DROP_MEMBERSHIP
2713 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2714#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002715#ifdef IP_DEFAULT_MULTICAST_TTL
2716 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2717#endif
2718#ifdef IP_DEFAULT_MULTICAST_LOOP
2719 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2720#endif
2721#ifdef IP_MAX_MEMBERSHIPS
2722 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2723#endif
2724
2725 /* TCP options */
2726#ifdef TCP_NODELAY
2727 insint(d, "TCP_NODELAY", TCP_NODELAY);
2728#endif
2729#ifdef TCP_MAXSEG
2730 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2731#endif
2732
2733 /* IPX options */
2734#ifdef IPX_TYPE
2735 insint(d, "IPX_TYPE", IPX_TYPE);
2736#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002737
2738 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002739#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002740 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002741#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002742}