blob: d37a2180186df9b25e2f79eab00d7f73df3fa091 [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
34/*
35This module provides an interface to Berkeley socket IPC.
36
37Limitations:
38
Guido van Rossum30a685f1991-06-27 15:51:29 +000039- only AF_INET and AF_UNIX address families are supported
Guido van Rossum81194471991-07-27 21:42:02 +000040- no read/write operations (use send/recv or makefile instead)
Guido van Rossumbe32c891996-06-20 16:25:29 +000041- additional restrictions apply on Windows
Guido van Rossum6574b3e1991-06-25 21:36:08 +000042
Guido van Rossum27e177d1995-03-16 15:43:47 +000043Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000044
Guido van Rossum27e177d1995-03-16 15:43:47 +000045- socket.error: exception raised for socket specific errors
Guido van Rossum30a685f1991-06-27 15:51:29 +000046- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000047- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000048- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000049- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000050- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000051- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000052- socket.ntohs(16 bit value) --> new int object
53- socket.ntohl(32 bit value) --> new int object
54- socket.htons(16 bit value) --> new int object
55- socket.htonl(32 bit value) --> new int object
Guido van Rossum27e177d1995-03-16 15:43:47 +000056- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000057- an Internet socket address is a pair (hostname, port)
58 where hostname can be anything recognized by gethostbyname()
59 (including the dd.dd.dd.dd notation) and port is in host byte order
60- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000061- a UNIX domain socket address is a string specifying the pathname
Guido van Rossum6574b3e1991-06-25 21:36:08 +000062
Guido van Rossum30a685f1991-06-27 15:51:29 +000063Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000064
Guido van Rossum81194471991-07-27 21:42:02 +000065- s.accept() --> new socket object, sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000066- s.bind(sockaddr) --> None
67- s.close() --> None
68- s.connect(sockaddr) --> None
Guido van Rossumfc4255d1997-11-19 18:57:13 +000069- s.connect_ex(sockaddr) --> 0 or errno (handy for e.g. async connect)
Guido van Rossum27e177d1995-03-16 15:43:47 +000070- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000071- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000072- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000073- s.getsockname() --> sockaddr
74- s.getsockopt(level, optname[, buflen]) --> int or string
75- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000076- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000077- s.recv(buflen [,flags]) --> string
78- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000079- s.send(string [,flags]) --> nbytes
80- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000081- s.setblocking(0 | 1) --> None
82- s.setsockopt(level, optname, value) --> None
83- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000084- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000085
Guido van Rossum6574b3e1991-06-25 21:36:08 +000086*/
87
Guido van Rossum73624e91994-10-10 17:59:00 +000088#include "Python.h"
Guido van Rossum3baaa131999-03-22 21:44:51 +000089
Guido van Rossume7de2061999-03-24 17:24:33 +000090#undef HAVE_GETHOSTBYNAME_R_3_ARG
91#undef HAVE_GETHOSTBYNAME_R_5_ARG
92#undef HAVE_GETHOSTBYNAME_R_6_ARG
93
94#ifdef HAVE_GETHOSTBYNAME_R
95#if defined(_AIX) || defined(__osf__)
96#define HAVE_GETHOSTBYNAME_R_3_ARG
97#elif defined(__sun__) || defined(__sgi)
98#define HAVE_GETHOSTBYNAME_R_5_ARG
99#elif defined(linux)
100#define HAVE_GETHOSTBYNAME_R_6_ARG
101#else
102#undef HAVE_GETHOSTBYNAME_R
103#endif
104#endif
105
Guido van Rossum3baaa131999-03-22 21:44:51 +0000106#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
107#define USE_GETHOSTBYNAME_LOCK
108#endif
109
110#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum49b56061998-10-01 20:42:43 +0000111#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000112#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000113
Guido van Rossuma376cc51996-12-05 23:43:35 +0000114#ifdef HAVE_UNISTD_H
115#include <unistd.h>
116#endif
117
Guido van Rossumbcc20741998-08-04 22:53:56 +0000118#if !defined(MS_WINDOWS) && !defined(PYOS_OS2) && !defined(__BEOS__)
Guido van Rossumfb4130d1996-12-10 15:17:08 +0000119extern int gethostname(); /* For Solaris, at least */
120#endif
121
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000122#if defined(PYCC_VACPP)
123#include <types.h>
124#include <io.h>
125#include <sys/ioctl.h>
126#include <utils.h>
127#include <ctype.h>
128#endif
129
130#if defined(PYOS_OS2)
131#define INCL_DOS
132#define INCL_DOSERRORS
133#define INCL_NOPMAPI
134#include <os2.h>
135#endif
136
Guido van Rossumbcc20741998-08-04 22:53:56 +0000137#if defined(__BEOS__)
138/* It's in the libs, but not the headers... - [cjh] */
139int shutdown( int, int );
140#endif
141
Guido van Rossumb6775db1994-08-01 11:34:53 +0000142#include <sys/types.h>
143#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +0000144
Guido van Rossum81194471991-07-27 21:42:02 +0000145#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000146#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000147#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000148#include <sys/socket.h>
149#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +0000150#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000151#else
152#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000153#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000154#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000155#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000156#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000157#else
158#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000159#endif
160
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000161#ifndef O_NDELAY
162#define O_NDELAY O_NONBLOCK /* For QNX only? */
163#endif
164
Jack Jansen508537b1996-02-14 15:57:45 +0000165#ifdef USE_GUSI
166/* fdopen() isn't declared in stdio.h (sigh) */
167#include <GUSI.h>
168#endif
169
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000170
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000171/* Here we have some hacks to choose between K&R or ANSI style function
172 definitions. For NT to build this as an extension module (ie, DLL)
173 it must be compiled by the C++ compiler, as it takes the address of
174 a static data item exported from the main Python DLL.
175*/
Guido van Rossumbcc20741998-08-04 22:53:56 +0000176#if defined(MS_WINDOWS) || defined(__BEOS__)
177/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000178/* seem to be a few differences in the API */
179#define close closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000180#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000181#define FORCE_ANSI_FUNC_DEFS
182#endif
183
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000184#if defined(PYOS_OS2)
185#define close soclose
186#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
187#define FORCE_ANSI_FUNC_DEFS
188#endif
189
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000190#ifdef FORCE_ANSI_FUNC_DEFS
191#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
192fnname( arg1type arg1name )
193
194#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
195fnname( arg1type arg1name, arg2type arg2name )
196
197#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
198fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
199
200#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
201fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
202
203#else /* !FORCE_ANSI_FN_DEFS */
204#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
205fnname( arg1name ) \
206 arg1type arg1name;
207
208#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
209fnname( arg1name, arg2name ) \
210 arg1type arg1name; \
211 arg2type arg2name;
212
213#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
214fnname( arg1name, arg2name, arg3name ) \
215 arg1type arg1name; \
216 arg2type arg2name; \
217 arg3type arg3name;
218
219#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
220fnname( arg1name, arg2name, arg3name, arg4name ) \
221 arg1type arg1name; \
222 arg2type arg2name; \
223 arg3type arg3name; \
224 arg4type arg4name;
225
226#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000227
228/* Global variable holding the exception type for errors detected
229 by this module (but not argument type or memory errors, etc.). */
230
Guido van Rossum73624e91994-10-10 17:59:00 +0000231static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000232
233
234/* Convenience function to raise an error according to errno
235 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000236
Guido van Rossum73624e91994-10-10 17:59:00 +0000237static PyObject *
238PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000239{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000240#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000241 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000242 PyObject *v;
243 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000244 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000245 PyErr_SetObject(PySocket_Error, v);
246 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000247 }
248 return NULL;
249 }
250 else
251#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000252
253#if defined(PYOS_OS2)
254 if (sock_errno() != NO_ERROR) {
255 APIRET rc;
256 ULONG msglen;
257 char outbuf[100];
258 int myerrorcode = sock_errno();
259
260 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
261 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
262 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
263 if (rc == NO_ERROR) {
264 PyObject *v;
265
266 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
267 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
268 char *lastc = &outbuf[ strlen(outbuf)-1 ];
269 while (lastc > outbuf && isspace(*lastc))
270 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
271 }
272 v = Py_BuildValue("(is)", myerrorcode, outbuf);
273 if (v != NULL) {
274 PyErr_SetObject(PySocket_Error, v);
275 Py_DECREF(v);
276 }
277 return NULL;
278 }
279 }
280#endif
281
Guido van Rossum73624e91994-10-10 17:59:00 +0000282 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000283}
284
Guido van Rossum30a685f1991-06-27 15:51:29 +0000285
286/* The object holding a socket. It holds some extra information,
287 like the address family, which is used to decode socket address
288 arguments properly. */
289
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000290typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000291 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000292 int sock_fd; /* Socket file descriptor */
293 int sock_family; /* Address family, e.g., AF_INET */
294 int sock_type; /* Socket type, e.g., SOCK_STREAM */
295 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000296 union sock_addr {
297 struct sockaddr_in in;
298#ifdef AF_UNIX
299 struct sockaddr_un un;
300#endif
301 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000302} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000303
Guido van Rossum30a685f1991-06-27 15:51:29 +0000304
305/* A forward reference to the Socktype type object.
306 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000307 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000308 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000309
Guido van Rossum73624e91994-10-10 17:59:00 +0000310staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000311
Guido van Rossum30a685f1991-06-27 15:51:29 +0000312
313/* Create a new socket object.
314 This just creates the object and initializes it.
315 If the creation fails, return NULL and set an exception (implicit
316 in NEWOBJ()). */
317
Guido van Rossum73624e91994-10-10 17:59:00 +0000318static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000319BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000320{
Guido van Rossum73624e91994-10-10 17:59:00 +0000321 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000322 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000323 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000324 if (s != NULL) {
325 s->sock_fd = fd;
326 s->sock_family = family;
327 s->sock_type = type;
328 s->sock_proto = proto;
329 }
330 return s;
331}
332
Guido van Rossum30a685f1991-06-27 15:51:29 +0000333
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000334/* Lock to allow python interpreter to continue, but only allow one
335 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000336#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000337PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000338#endif
339
340
Guido van Rossum30a685f1991-06-27 15:51:29 +0000341/* Convert a string specifying a host name or one of a few symbolic
342 names to a numeric IP address. This usually calls gethostbyname()
343 to do the work; the names "" and "<broadcast>" are special.
344 Return the length (should always be 4 bytes), or negative if
345 an error occurred; then an exception is raised. */
346
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000347static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000348BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000349{
350 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000351 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000352 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000353 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000354#ifdef HAVE_GETHOSTBYNAME_R
355 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000356#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
357 struct hostent_data data;
358#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000359 char buf[1001];
360 int buf_len = (sizeof buf) - 1;
361 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000362#endif
363#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000364 int result;
365#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000366#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000367
Guido van Rossuma376cc51996-12-05 23:43:35 +0000368 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000369 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000370 addr_ret->sin_addr.s_addr = INADDR_ANY;
371 return 4;
372 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000373 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000374 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
375 return 4;
376 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000377 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
378 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
379 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
380 addr_ret->sin_addr.s_addr = htonl(
381 ((long) d1 << 24) | ((long) d2 << 16) |
382 ((long) d3 << 8) | ((long) d4 << 0));
383 return 4;
384 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000385 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000386#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000387#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000388 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000389#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000390 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000391#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000392 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000393 result = gethostbyname_r(name, &hp_allocated, &data);
394 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000395#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000396#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000397#ifdef USE_GETHOSTBYNAME_LOCK
398 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000399#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000400 hp = gethostbyname(name);
401#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000402 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000403
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000404 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000405#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000406 /* Let's get real error message to return */
407 extern int h_errno;
408 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
409#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000410 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000411#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000412#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000413 PyThread_release_lock(gethostbyname_lock);
414#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000415 return -1;
416 }
417 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000418 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000419#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000420 PyThread_release_lock(gethostbyname_lock);
421#endif
422 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000423}
424
Guido van Rossum30a685f1991-06-27 15:51:29 +0000425
Guido van Rossum30a685f1991-06-27 15:51:29 +0000426/* Create a string object representing an IP address.
427 This is always a string of the form 'dd.dd.dd.dd' (with variable
428 size numbers). */
429
Guido van Rossum73624e91994-10-10 17:59:00 +0000430static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000431BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000432{
433 long x = ntohl(addr->sin_addr.s_addr);
434 char buf[100];
435 sprintf(buf, "%d.%d.%d.%d",
436 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
437 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000438 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000439}
440
441
442/* Create an object representing the given socket address,
443 suitable for passing it back to bind(), connect() etc.
444 The family field of the sockaddr structure is inspected
445 to determine what kind of address it really is. */
446
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000447/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000448static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000449BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000450{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000451 if (addrlen == 0) {
452 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000453 Py_INCREF(Py_None);
454 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000455 }
456
Guido van Rossumbcc20741998-08-04 22:53:56 +0000457#ifdef __BEOS__
458 /* XXX: BeOS version of accept() doesn't set family coreectly */
459 addr->sa_family = AF_INET;
460#endif
461
Guido van Rossum30a685f1991-06-27 15:51:29 +0000462 switch (addr->sa_family) {
463
464 case AF_INET:
465 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000466 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000467 PyObject *addrobj = makeipaddr(a);
468 PyObject *ret = NULL;
469 if (addrobj) {
470 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
471 Py_DECREF(addrobj);
472 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000473 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000474 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000475
Guido van Rossumb6775db1994-08-01 11:34:53 +0000476#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000477 case AF_UNIX:
478 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000479 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000480 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000481 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000482#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000483
484 /* More cases here... */
485
486 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000487 /* If we don't know the address family, don't raise an
488 exception -- return it as a tuple. */
489 return Py_BuildValue("is#",
490 addr->sa_family,
491 addr->sa_data,
492 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000493
Guido van Rossum30a685f1991-06-27 15:51:29 +0000494 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000495}
496
Guido van Rossum30a685f1991-06-27 15:51:29 +0000497
498/* Parse a socket address argument according to the socket object's
499 address family. Return 1 if the address was in the proper format,
500 0 of not. The address is returned through addr_ret, its length
501 through len_ret. */
502
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000503static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000504BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000505getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000506{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000507 switch (s->sock_family) {
508
Guido van Rossumb6775db1994-08-01 11:34:53 +0000509#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000510 case AF_UNIX:
511 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000512 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000513 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000514 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000515 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000516 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000517 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000518 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000519 PyErr_SetString(PySocket_Error,
520 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000521 return 0;
522 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000523 addr->sun_family = AF_UNIX;
524 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000525 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000526 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000527 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000528 return 1;
529 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000530#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000531
Guido van Rossum30a685f1991-06-27 15:51:29 +0000532 case AF_INET:
533 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000534 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000535 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000536 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000537 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000538 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000539 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000540 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000541 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000542 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000543 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000544 *addr_ret = (struct sockaddr *) addr;
545 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000546 return 1;
547 }
548
Guido van Rossum30a685f1991-06-27 15:51:29 +0000549 /* More cases here... */
550
551 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000552 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000553 return 0;
554
555 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000556}
557
Guido van Rossum30a685f1991-06-27 15:51:29 +0000558
Guido van Rossum710e1df1992-06-12 10:39:36 +0000559/* Get the address length according to the socket object's address family.
560 Return 1 if the family is known, 0 otherwise. The length is returned
561 through len_ret. */
562
563static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000564BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000565{
566 switch (s->sock_family) {
567
Guido van Rossumb6775db1994-08-01 11:34:53 +0000568#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000569 case AF_UNIX:
570 {
571 *len_ret = sizeof (struct sockaddr_un);
572 return 1;
573 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000574#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000575
576 case AF_INET:
577 {
578 *len_ret = sizeof (struct sockaddr_in);
579 return 1;
580 }
581
582 /* More cases here... */
583
584 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000585 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000586 return 0;
587
588 }
589}
590
591
Guido van Rossum30a685f1991-06-27 15:51:29 +0000592/* s.accept() method */
593
Guido van Rossum73624e91994-10-10 17:59:00 +0000594static PyObject *
595BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000596{
597 char addrbuf[256];
598 int addrlen, newfd;
Barry Warsaw752300b1997-01-03 17:18:10 +0000599 PyObject *sock = NULL;
600 PyObject *addr = NULL;
601 PyObject *res = NULL;
602
Guido van Rossum73624e91994-10-10 17:59:00 +0000603 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000604 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000605 if (!getsockaddrlen(s, &addrlen))
606 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000607 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000608 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000609 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000610 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000611 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000612
Guido van Rossum30a685f1991-06-27 15:51:29 +0000613 /* Create the new object with unspecified family,
614 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000615 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000616 s->sock_family,
617 s->sock_type,
618 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000619 if (sock == NULL) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000620 close(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000621 goto finally;
622 }
623 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
624 goto finally;
625
626 if (!(res = Py_BuildValue("OO", sock, addr)))
627 goto finally;
628
629 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000630 Py_XDECREF(sock);
631 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000632 return res;
633}
634
Guido van Rossum82a5c661998-07-07 20:45:43 +0000635static char accept_doc[] =
636"accept() -> (socket object, address info)\n\
637\n\
638Wait for an incoming connection. Return a new socket representing the\n\
639connection, and the address of the client. For IP sockets, the address\n\
640info is a pair (hostaddr, port).";
641
Guido van Rossum30a685f1991-06-27 15:51:29 +0000642
Guido van Rossume4485b01994-09-07 14:32:49 +0000643/* s.setblocking(1 | 0) method */
644
Guido van Rossum73624e91994-10-10 17:59:00 +0000645static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000646BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000647{
648 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000649#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000650 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000651#endif
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000652 if (!PyArg_Parse(args, "i", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000653 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000654 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000655#ifdef __BEOS__
656 block = !block;
657 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
658 (void *)(&block), sizeof( int ) );
659#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000660#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000661#ifdef PYOS_OS2
662 block = !block;
663 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
664#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000665 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
666 if (block)
667 delay_flag &= (~O_NDELAY);
668 else
669 delay_flag |= O_NDELAY;
670 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000671#endif /* !PYOS_OS2 */
672#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000673 block = !block;
674 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000675#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000676#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000677 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000678
Guido van Rossum73624e91994-10-10 17:59:00 +0000679 Py_INCREF(Py_None);
680 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000681}
Guido van Rossume4485b01994-09-07 14:32:49 +0000682
Guido van Rossum82a5c661998-07-07 20:45:43 +0000683static char setblocking_doc[] =
684"setblocking(flag)\n\
685\n\
686Set the socket to blocking (flag is true) or non-blocking (false).\n\
687This uses the FIONBIO ioctl with the O_NDELAY flag.";
688
Guido van Rossume4485b01994-09-07 14:32:49 +0000689
Guido van Rossumaee08791992-09-08 09:05:33 +0000690/* s.setsockopt() method.
691 With an integer third argument, sets an integer option.
692 With a string third argument, sets an option from a buffer;
693 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000694
Guido van Rossum73624e91994-10-10 17:59:00 +0000695static PyObject *
696BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000697{
698 int level;
699 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000700 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000701 char *buf;
702 int buflen;
703 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000704
Guido van Rossum73624e91994-10-10 17:59:00 +0000705 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000706 buf = (char *) &flag;
707 buflen = sizeof flag;
708 }
709 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000710 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +0000711 if (!PyArg_Parse(args, "(iis#)", &level, &optname,
712 &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000713 return NULL;
714 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000715 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000716 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000717 return PySocket_Err();
718 Py_INCREF(Py_None);
719 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000720}
721
Guido van Rossum82a5c661998-07-07 20:45:43 +0000722static char setsockopt_doc[] =
723"setsockopt(level, option, value)\n\
724\n\
725Set a socket option. See the Unix manual for level and option.\n\
726The value argument can either be an integer or a string.";
727
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000728
Guido van Rossumaee08791992-09-08 09:05:33 +0000729/* s.getsockopt() method.
730 With two arguments, retrieves an integer option.
731 With a third integer argument, retrieves a string buffer of that size;
732 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000733
Guido van Rossum73624e91994-10-10 17:59:00 +0000734static PyObject *
735BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000736{
737 int level;
738 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000739 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000740 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000741 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000742
Guido van Rossumbcc20741998-08-04 22:53:56 +0000743#ifdef __BEOS__
744/* We have incomplete socket support. */
745 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
746 return NULL;
747#else
748
Guido van Rossumbe32c891996-06-20 16:25:29 +0000749 if (!PyArg_ParseTuple(args, "ii|i", &level, &optname, &buflen))
750 return NULL;
751
752 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000753 int flag = 0;
754 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000755 res = getsockopt(s->sock_fd, level, optname,
756 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000757 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000758 return PySocket_Err();
759 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000760 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000761 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000762 PyErr_SetString(PySocket_Error,
763 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000764 return NULL;
765 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000766 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000767 if (buf == NULL)
768 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000769 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000770 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000771 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000772 Py_DECREF(buf);
773 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000774 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000775 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000776 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000777#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000778}
779
Guido van Rossum82a5c661998-07-07 20:45:43 +0000780static char getsockopt_doc[] =
781"getsockopt(level, option[, buffersize]) -> value\n\
782\n\
783Get a socket option. See the Unix manual for level and option.\n\
784If a nonzero buffersize argument is given, the return value is a\n\
785string of that length; otherwise it is an integer.";
786
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000787
Guido van Rossum30a685f1991-06-27 15:51:29 +0000788/* s.bind(sockaddr) method */
789
Guido van Rossum73624e91994-10-10 17:59:00 +0000790static PyObject *
791BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000792{
793 struct sockaddr *addr;
794 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000795 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000796 if (!getsockaddrarg(s, args, &addr, &addrlen))
797 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000798 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000799 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000800 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000801 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000802 return PySocket_Err();
803 Py_INCREF(Py_None);
804 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000805}
806
Guido van Rossum82a5c661998-07-07 20:45:43 +0000807static char bind_doc[] =
808"bind(address)\n\
809\n\
810Bind the socket to a local address. For IP sockets, the address is a\n\
811pair (host, port); the host must refer to the local host.";
812
Guido van Rossum30a685f1991-06-27 15:51:29 +0000813
814/* s.close() method.
815 Set the file descriptor to -1 so operations tried subsequently
816 will surely fail. */
817
Guido van Rossum73624e91994-10-10 17:59:00 +0000818static PyObject *
819BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000820{
Guido van Rossum73624e91994-10-10 17:59:00 +0000821 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000822 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000823 if (s->sock_fd != -1) {
824 Py_BEGIN_ALLOW_THREADS
825 (void) close(s->sock_fd);
826 Py_END_ALLOW_THREADS
827 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000828 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000829 Py_INCREF(Py_None);
830 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000831}
832
Guido van Rossum82a5c661998-07-07 20:45:43 +0000833static char close_doc[] =
834"close()\n\
835\n\
836Close the socket. It cannot be used after this call.";
837
Guido van Rossum30a685f1991-06-27 15:51:29 +0000838
839/* s.connect(sockaddr) method */
840
Guido van Rossum73624e91994-10-10 17:59:00 +0000841static PyObject *
842BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000843{
844 struct sockaddr *addr;
845 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000846 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000847 if (!getsockaddrarg(s, args, &addr, &addrlen))
848 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000849 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000850 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000851 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000852 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000853 return PySocket_Err();
854 Py_INCREF(Py_None);
855 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000856}
857
Guido van Rossum82a5c661998-07-07 20:45:43 +0000858static char connect_doc[] =
859"connect(address)\n\
860\n\
861Connect the socket to a remote address. For IP sockets, the address\n\
862is a pair (host, port).";
863
Guido van Rossum30a685f1991-06-27 15:51:29 +0000864
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000865/* s.connect_ex(sockaddr) method */
866
867static PyObject *
868BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
869{
870 struct sockaddr *addr;
871 int addrlen;
872 int res;
873 if (!getsockaddrarg(s, args, &addr, &addrlen))
874 return NULL;
875 Py_BEGIN_ALLOW_THREADS
876 res = connect(s->sock_fd, addr, addrlen);
877 Py_END_ALLOW_THREADS
878 if (res != 0)
879 res = errno;
880 return PyInt_FromLong((long) res);
881}
882
Guido van Rossum82a5c661998-07-07 20:45:43 +0000883static char connect_ex_doc[] =
884"connect_ex(address)\n\
885\n\
886This is like connect(address), but returns an error code (the errno value)\n\
887instead of raising an exception when an error occurs.";
888
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000889
Guido van Rossumed233a51992-06-23 09:07:03 +0000890/* s.fileno() method */
891
Guido van Rossum73624e91994-10-10 17:59:00 +0000892static PyObject *
893BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000894{
Guido van Rossum73624e91994-10-10 17:59:00 +0000895 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000896 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000897 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000898}
899
Guido van Rossum82a5c661998-07-07 20:45:43 +0000900static char fileno_doc[] =
901"fileno() -> integer\n\
902\n\
903Return the integer file descriptor of the socket.";
904
Guido van Rossumed233a51992-06-23 09:07:03 +0000905
Guido van Rossumbe32c891996-06-20 16:25:29 +0000906#ifndef NO_DUP
907/* s.dup() method */
908
909static PyObject *
910BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
911{
912 int newfd;
913 PyObject *sock;
914 if (!PyArg_NoArgs(args))
915 return NULL;
916 newfd = dup(s->sock_fd);
917 if (newfd < 0)
918 return PySocket_Err();
919 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000920 s->sock_family,
921 s->sock_type,
922 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000923 if (sock == NULL)
924 close(newfd);
925 return sock;
926}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000927
928static char dup_doc[] =
929"dup() -> socket object\n\
930\n\
931Return a new socket object connected to the same system resource.";
932
Guido van Rossumbe32c891996-06-20 16:25:29 +0000933#endif
934
935
Guido van Rossumc89705d1992-11-26 08:54:07 +0000936/* s.getsockname() method */
937
Guido van Rossum73624e91994-10-10 17:59:00 +0000938static PyObject *
939BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000940{
941 char addrbuf[256];
942 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000943 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000944 return NULL;
945 if (!getsockaddrlen(s, &addrlen))
946 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000947 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000948 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000949 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000950 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000951 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000952 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000953 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
954}
955
Guido van Rossum82a5c661998-07-07 20:45:43 +0000956static char getsockname_doc[] =
957"getsockname() -> address info\n\
958\n\
959Return the address of the local endpoint. For IP sockets, the address\n\
960info is a pair (hostaddr, port).";
961
Guido van Rossumc89705d1992-11-26 08:54:07 +0000962
Guido van Rossumb6775db1994-08-01 11:34:53 +0000963#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000964/* s.getpeername() method */
965
Guido van Rossum73624e91994-10-10 17:59:00 +0000966static PyObject *
967BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000968{
969 char addrbuf[256];
970 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000971 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000972 return NULL;
973 if (!getsockaddrlen(s, &addrlen))
974 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000975 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000976 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000977 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000978 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000979 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000980 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
981}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000982
983static char getpeername_doc[] =
984"getpeername() -> address info\n\
985\n\
986Return the address of the remote endpoint. For IP sockets, the address\n\
987info is a pair (hostaddr, port).";
988
Guido van Rossumb6775db1994-08-01 11:34:53 +0000989#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000990
991
Guido van Rossum30a685f1991-06-27 15:51:29 +0000992/* s.listen(n) method */
993
Guido van Rossum73624e91994-10-10 17:59:00 +0000994static PyObject *
995BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000996{
997 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000998 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000999 if (!PyArg_Parse(args, "i", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001000 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001001 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001002 if (backlog < 1)
1003 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001004 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001005 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001006 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001007 return PySocket_Err();
1008 Py_INCREF(Py_None);
1009 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001010}
1011
Guido van Rossum82a5c661998-07-07 20:45:43 +00001012static char listen_doc[] =
1013"listen(backlog)\n\
1014\n\
1015Enable a server to accept connections. The backlog argument must be at\n\
1016least 1; it specifies the number of unaccepted connection that the system\n\
1017will allow before refusing new connections.";
1018
1019
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001020#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001021/* s.makefile(mode) method.
1022 Create a new open file object referring to a dupped version of
1023 the socket's file descriptor. (The dup() call is necessary so
1024 that the open file and socket objects may be closed independent
1025 of each other.)
1026 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1027
Guido van Rossum73624e91994-10-10 17:59:00 +00001028static PyObject *
1029BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001030{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001031 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +00001032 char *mode = "r";
1033 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001034 int fd;
1035 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001036 PyObject *f;
1037
1038 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001039 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001040#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001041 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1042 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001043#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001044 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001045#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001046 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001047 if (fd >= 0)
1048 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001049 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001050 }
1051 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1052 if (f != NULL)
1053 PyFile_SetBufSize(f, bufsize);
1054 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001055}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001056
1057static char makefile_doc[] =
1058"makefile([mode[, buffersize]]) -> file object\n\
1059\n\
1060Return a regular file object corresponding to the socket.\n\
1061The mode and buffersize arguments are as for the built-in open() function.";
1062
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001063#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001064
Guido van Rossum82a5c661998-07-07 20:45:43 +00001065
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001066/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001067
Guido van Rossum73624e91994-10-10 17:59:00 +00001068static PyObject *
1069BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001070{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001071 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001072 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001073 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1074 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001075 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001076 if (buf == NULL)
1077 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001078 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001079 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001080 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001081 if (n < 0) {
1082 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001083 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001084 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001085 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001086 return NULL;
1087 return buf;
1088}
1089
Guido van Rossum82a5c661998-07-07 20:45:43 +00001090static char recv_doc[] =
1091"recv(buffersize[, flags]) -> data\n\
1092\n\
1093Receive up to buffersize bytes from the socket. For the optional flags\n\
1094argument, see the Unix manual. When no data is available, block until\n\
1095at least one byte is available or until the remote end is closed. When\n\
1096the remote end is closed and all data is read, return the empty string.";
1097
Guido van Rossum30a685f1991-06-27 15:51:29 +00001098
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001099/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001100
Guido van Rossum73624e91994-10-10 17:59:00 +00001101static PyObject *
1102BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001103{
1104 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001105 PyObject *buf = NULL;
1106 PyObject *addr = NULL;
1107 PyObject *ret = NULL;
1108
Guido van Rossumbe32c891996-06-20 16:25:29 +00001109 int addrlen, len, n, flags = 0;
1110 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1111 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001112 if (!getsockaddrlen(s, &addrlen))
1113 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001114 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001115 if (buf == NULL)
1116 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001117 Py_BEGIN_ALLOW_THREADS
1118 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001119#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001120#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001121 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001122#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001123 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001124#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001125#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001126 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001127#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001128 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001129 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001130 if (n < 0) {
1131 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001132 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001133 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001134 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001135 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001136
1137 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1138 goto finally;
1139
Guido van Rossum73624e91994-10-10 17:59:00 +00001140 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001141 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001142 Py_XDECREF(addr);
1143 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001144 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001145}
1146
Guido van Rossum82a5c661998-07-07 20:45:43 +00001147static char recvfrom_doc[] =
1148"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1149\n\
1150Like recv(buffersize, flags) but also return the sender's address info.";
1151
Guido van Rossum30a685f1991-06-27 15:51:29 +00001152
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001153/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001154
Guido van Rossum73624e91994-10-10 17:59:00 +00001155static PyObject *
1156BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001157{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001158 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001159 int len, n, flags = 0;
1160 if (!PyArg_ParseTuple(args, "s#|i", &buf, &len, &flags))
1161 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001162 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001163 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001164 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001165 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001166 return PySocket_Err();
1167 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001168}
1169
Guido van Rossum82a5c661998-07-07 20:45:43 +00001170static char send_doc[] =
1171"send(data[, flags])\n\
1172\n\
1173Send a data string to the socket. For the optional flags\n\
1174argument, see the Unix manual.";
1175
Guido van Rossum30a685f1991-06-27 15:51:29 +00001176
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001177/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001178
Guido van Rossum73624e91994-10-10 17:59:00 +00001179static PyObject *
1180BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001181{
Guido van Rossum73624e91994-10-10 17:59:00 +00001182 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001183 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001184 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001185 int addrlen, len, n, flags;
1186 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001187 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
1188 PyErr_Clear();
1189 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001190 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001191 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001192 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001193 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001194 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001195 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001196 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001197 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001198 return PySocket_Err();
1199 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001200}
1201
Guido van Rossum82a5c661998-07-07 20:45:43 +00001202static char sendto_doc[] =
1203"sendto(data[, flags], address)\n\
1204\n\
1205Like send(data, flags) but allows specifying the destination address.\n\
1206For IP sockets, the address is a pair (hostaddr, port).";
1207
Guido van Rossum30a685f1991-06-27 15:51:29 +00001208
1209/* s.shutdown(how) method */
1210
Guido van Rossum73624e91994-10-10 17:59:00 +00001211static PyObject *
1212BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001213{
1214 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001215 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +00001216 if (!PyArg_Parse(args, "i", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001217 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001218 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001219 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001220 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001221 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001222 return PySocket_Err();
1223 Py_INCREF(Py_None);
1224 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001225}
1226
Guido van Rossum82a5c661998-07-07 20:45:43 +00001227static char shutdown_doc[] =
1228"shutdown(flag)\n\
1229\n\
1230Shut down the reading side of the socket (flag == 0), the writing side\n\
1231of the socket (flag == 1), or both ends (flag == 2).";
1232
Guido van Rossum30a685f1991-06-27 15:51:29 +00001233
1234/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001235
Guido van Rossum73624e91994-10-10 17:59:00 +00001236static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001237 {"accept", (PyCFunction)PySocketSock_accept, 0,
1238 accept_doc},
1239 {"bind", (PyCFunction)PySocketSock_bind, 0,
1240 bind_doc},
1241 {"close", (PyCFunction)PySocketSock_close, 0,
1242 close_doc},
1243 {"connect", (PyCFunction)PySocketSock_connect, 0,
1244 connect_doc},
1245 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 0,
1246 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001247#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001248 {"dup", (PyCFunction)PySocketSock_dup, 0,
1249 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001250#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001251 {"fileno", (PyCFunction)PySocketSock_fileno, 0,
1252 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001253#ifdef HAVE_GETPEERNAME
Guido van Rossum82a5c661998-07-07 20:45:43 +00001254 {"getpeername", (PyCFunction)PySocketSock_getpeername, 0,
1255 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001256#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001257 {"getsockname", (PyCFunction)PySocketSock_getsockname, 0,
1258 getsockname_doc},
1259 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1260 getsockopt_doc},
1261 {"listen", (PyCFunction)PySocketSock_listen, 0,
1262 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001263#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001264 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1265 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001266#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001267 {"recv", (PyCFunction)PySocketSock_recv, 1,
1268 recv_doc},
1269 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1270 recvfrom_doc},
1271 {"send", (PyCFunction)PySocketSock_send, 1,
1272 send_doc},
1273 {"sendto", (PyCFunction)PySocketSock_sendto, 0,
1274 sendto_doc},
1275 {"setblocking", (PyCFunction)PySocketSock_setblocking, 0,
1276 setblocking_doc},
1277 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 0,
1278 setsockopt_doc},
1279 {"shutdown", (PyCFunction)PySocketSock_shutdown, 0,
1280 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001281 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001282};
1283
Guido van Rossum30a685f1991-06-27 15:51:29 +00001284
Guido van Rossum73624e91994-10-10 17:59:00 +00001285/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001286 First close the file description. */
1287
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001288static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001289BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001290{
1291 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001292 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001293}
1294
Guido van Rossum30a685f1991-06-27 15:51:29 +00001295
1296/* Return a socket object's named attribute. */
1297
Guido van Rossum73624e91994-10-10 17:59:00 +00001298static PyObject *
1299BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001300{
Guido van Rossum73624e91994-10-10 17:59:00 +00001301 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001302}
1303
Guido van Rossum30a685f1991-06-27 15:51:29 +00001304
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001305static PyObject *
1306BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1307{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001308 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001309 sprintf(buf,
1310 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1311 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001312 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001313}
1314
1315
Guido van Rossumb6775db1994-08-01 11:34:53 +00001316/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001317
Guido van Rossum73624e91994-10-10 17:59:00 +00001318static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001319 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001320 0,
1321 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001322 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001323 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001324 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001325 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001326 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001327 0, /*tp_setattr*/
1328 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001329 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001330 0, /*tp_as_number*/
1331 0, /*tp_as_sequence*/
1332 0, /*tp_as_mapping*/
1333};
1334
Guido van Rossum30a685f1991-06-27 15:51:29 +00001335
Guido van Rossum81194471991-07-27 21:42:02 +00001336/* Python interface to gethostname(). */
1337
1338/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001339static PyObject *
1340BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001341{
1342 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001343 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001344 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +00001345 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001346 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001347 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001348 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001349 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001350 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001351 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001352 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001353}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001354
Guido van Rossum82a5c661998-07-07 20:45:43 +00001355static char gethostname_doc[] =
1356"gethostname() -> string\n\
1357\n\
1358Return the current host name.";
1359
Guido van Rossumff4949e1992-08-05 19:58:53 +00001360
Guido van Rossum30a685f1991-06-27 15:51:29 +00001361/* Python interface to gethostbyname(name). */
1362
1363/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001364static PyObject *
1365BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001366{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001367 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001368 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001369 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001370 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001371 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001372 return NULL;
1373 return makeipaddr(&addrbuf);
1374}
1375
Guido van Rossum82a5c661998-07-07 20:45:43 +00001376static char gethostbyname_doc[] =
1377"gethostbyname(host) -> address\n\
1378\n\
1379Return the IP address (a string of the form '255.255.255.255') for a host.";
1380
1381
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001382/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1383
1384static PyObject *
1385gethost_common(h, addr)
1386 struct hostent *h;
1387 struct sockaddr_in *addr;
1388{
1389 char **pch;
1390 PyObject *rtn_tuple = (PyObject *)NULL;
1391 PyObject *name_list = (PyObject *)NULL;
1392 PyObject *addr_list = (PyObject *)NULL;
1393 PyObject *tmp;
1394 if (h == NULL) {
1395#ifdef HAVE_HSTRERROR
1396 /* Let's get real error message to return */
1397 extern int h_errno;
1398 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1399#else
1400 PyErr_SetString(PySocket_Error, "host not found");
1401#endif
1402 return NULL;
1403 }
1404 if ((name_list = PyList_New(0)) == NULL)
1405 goto err;
1406 if ((addr_list = PyList_New(0)) == NULL)
1407 goto err;
1408 for (pch = h->h_aliases; *pch != NULL; pch++) {
1409 int status;
1410 tmp = PyString_FromString(*pch);
1411 if (tmp == NULL)
1412 goto err;
1413 status = PyList_Append(name_list, tmp);
1414 Py_DECREF(tmp);
1415 if (status)
1416 goto err;
1417 }
1418 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1419 int status;
1420 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1421 tmp = makeipaddr(addr);
1422 if (tmp == NULL)
1423 goto err;
1424 status = PyList_Append(addr_list, tmp);
1425 Py_DECREF(tmp);
1426 if (status)
1427 goto err;
1428 }
1429 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1430 err:
1431 Py_XDECREF(name_list);
1432 Py_XDECREF(addr_list);
1433 return rtn_tuple;
1434}
1435
1436
1437/* Python interface to gethostbyname_ex(name). */
1438
1439/*ARGSUSED*/
1440static PyObject *
1441BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1442{
1443 char *name;
1444 struct hostent *h;
1445 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001446 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001447#ifdef HAVE_GETHOSTBYNAME_R
1448 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001449#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1450 struct hostent_data data;
1451#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001452 char buf[16384];
1453 int buf_len = (sizeof buf) - 1;
1454 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001455#endif
1456#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001457 int result;
1458#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001459#endif /* HAVE_GETHOSTBYNAME_R */
1460 if (!PyArg_Parse(args, "s", &name))
1461 return NULL;
1462 if (setipaddr(name, &addr) < 0)
1463 return NULL;
1464 Py_BEGIN_ALLOW_THREADS
1465#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001466#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001467 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001468#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001469 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001470#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001471 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001472 result = gethostbyname_r(name, &hp_allocated, &data);
1473 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001474#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001475#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001476#ifdef USE_GETHOSTBYNAME_LOCK
1477 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001478#endif
1479 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001480#endif /* HAVE_GETHOSTBYNAME_R */
1481 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001482 ret = gethost_common(h, &addr);
1483#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001484 PyThread_release_lock(gethostbyname_lock);
1485#endif
1486 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001487}
1488
1489static char ghbn_ex_doc[] =
1490"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1491\n\
1492Return the true host name, a list of aliases, and a list of IP addresses,\n\
1493for a host. The host argument is a string giving a host name or IP number.";
1494
1495
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001496/* Python interface to gethostbyaddr(IP). */
1497
1498/*ARGSUSED*/
1499static PyObject *
1500BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1501{
1502 struct sockaddr_in addr;
1503 char *ip_num;
1504 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001505 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001506#ifdef HAVE_GETHOSTBYNAME_R
1507 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001508#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1509 struct hostent_data data;
1510#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001511 char buf[16384];
1512 int buf_len = (sizeof buf) - 1;
1513 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001514#endif
1515#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001516 int result;
1517#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001518#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001519
1520 if (!PyArg_Parse(args, "s", &ip_num))
1521 return NULL;
1522 if (setipaddr(ip_num, &addr) < 0)
1523 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001524 Py_BEGIN_ALLOW_THREADS
1525#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001526#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001527 result = gethostbyaddr_r((char *)&addr.sin_addr,
1528 sizeof(addr.sin_addr),
1529 AF_INET, &hp_allocated, buf, buf_len,
1530 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001531#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001532 h = gethostbyaddr_r((char *)&addr.sin_addr,
1533 sizeof(addr.sin_addr),
1534 AF_INET,
1535 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001536#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001537 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001538 result = gethostbyaddr_r((char *)&addr.sin_addr,
1539 sizeof(addr.sin_addr),
1540 AF_INET, &hp_allocated, &data);
1541 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001542#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001543#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001544#ifdef USE_GETHOSTBYNAME_LOCK
1545 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001546#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001547 h = gethostbyaddr((char *)&addr.sin_addr,
1548 sizeof(addr.sin_addr),
1549 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001550#endif /* HAVE_GETHOSTBYNAME_R */
1551 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001552 ret = gethost_common(h, &addr);
1553#ifdef USE_GETHOSTBYNAME_LOCK
1554 PyThread_release_lock(gethostbyname_lock);
1555#endif
1556 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001557}
1558
Guido van Rossum82a5c661998-07-07 20:45:43 +00001559static char gethostbyaddr_doc[] =
1560"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1561\n\
1562Return the true host name, a list of aliases, and a list of IP addresses,\n\
1563for a host. The host argument is a string giving a host name or IP number.";
1564
Guido van Rossum30a685f1991-06-27 15:51:29 +00001565
1566/* Python interface to getservbyname(name).
1567 This only returns the port number, since the other info is already
1568 known or not useful (like the list of aliases). */
1569
1570/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001571static PyObject *
1572BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001573{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001574 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001575 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001576 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001577 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001578 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001579 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001580 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001581 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001582 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001583 return NULL;
1584 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001585 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001586}
1587
Guido van Rossum82a5c661998-07-07 20:45:43 +00001588static char getservbyname_doc[] =
1589"getservbyname(servicename, protocolname) -> integer\n\
1590\n\
1591Return a port number from a service name and protocol name.\n\
1592The protocol name should be 'tcp' or 'udp'.";
1593
Guido van Rossum30a685f1991-06-27 15:51:29 +00001594
Guido van Rossum3901d851996-12-19 16:35:04 +00001595/* Python interface to getprotobyname(name).
1596 This only returns the protocol number, since the other info is
1597 already known or not useful (like the list of aliases). */
1598
1599/*ARGSUSED*/
1600static PyObject *
1601BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1602{
1603 char *name;
1604 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001605#ifdef __BEOS__
1606/* Not available in BeOS yet. - [cjh] */
1607 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1608 return NULL;
1609#else
Guido van Rossum3901d851996-12-19 16:35:04 +00001610 if (!PyArg_Parse(args, "s", &name))
1611 return NULL;
1612 Py_BEGIN_ALLOW_THREADS
1613 sp = getprotobyname(name);
1614 Py_END_ALLOW_THREADS
1615 if (sp == NULL) {
1616 PyErr_SetString(PySocket_Error, "protocol not found");
1617 return NULL;
1618 }
1619 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001620#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001621}
1622
Guido van Rossum82a5c661998-07-07 20:45:43 +00001623static char getprotobyname_doc[] =
1624"getprotobyname(name) -> integer\n\
1625\n\
1626Return the protocol number for the named protocol. (Rarely used.)";
1627
Guido van Rossum3901d851996-12-19 16:35:04 +00001628
Guido van Rossum30a685f1991-06-27 15:51:29 +00001629/* Python interface to socket(family, type, proto).
1630 The third (protocol) argument is optional.
1631 Return a new socket object. */
1632
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001633/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001634static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001635BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001636{
Guido van Rossum73624e91994-10-10 17:59:00 +00001637 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001638#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001639 SOCKET fd;
1640#else
1641 int fd;
1642#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001643 int family, type, proto = 0;
1644 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1645 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001646 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001647 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001648 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001649#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001650 if (fd == INVALID_SOCKET)
1651#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001652 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001653#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001654 return PySocket_Err();
1655 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001656 /* If the object can't be created, don't forget to close the
1657 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001658 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001659 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001660 /* From now on, ignore SIGPIPE and let the error checking
1661 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001662#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001663 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001664#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001665 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001666}
1667
Guido van Rossum82a5c661998-07-07 20:45:43 +00001668static char socket_doc[] =
1669"socket(family, type[, proto]) -> socket object\n\
1670\n\
1671Open a socket of the given type. The family argument specifies the\n\
1672address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1673The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1674or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1675specifying the default protocol.";
1676
1677
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001678#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001679/* Create a socket object from a numeric file description.
1680 Useful e.g. if stdin is a socket.
1681 Additional arguments as for socket(). */
1682
1683/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001684static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001685BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001686{
Guido van Rossum73624e91994-10-10 17:59:00 +00001687 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001688 int fd, family, type, proto = 0;
1689 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1690 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001691 /* Dup the fd so it and the socket can be closed independently */
1692 fd = dup(fd);
1693 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001694 return PySocket_Err();
1695 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001696 /* From now on, ignore SIGPIPE and let the error checking
1697 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001698#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001699 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001700#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001701 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001702}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001703
1704static char fromfd_doc[] =
1705"fromfd(fd, family, type[, proto]) -> socket object\n\
1706\n\
1707Create a socket object from the given file descriptor.\n\
1708The remaining arguments are the same as for socket().";
1709
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001710#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001711
Guido van Rossum82a5c661998-07-07 20:45:43 +00001712
Guido van Rossum006bf911996-06-12 04:04:55 +00001713static PyObject *
1714BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1715{
1716 int x1, x2;
1717
1718 if (!PyArg_Parse(args, "i", &x1)) {
1719 return NULL;
1720 }
1721 x2 = (int)ntohs((short)x1);
1722 return PyInt_FromLong(x2);
1723}
1724
Guido van Rossum82a5c661998-07-07 20:45:43 +00001725static char ntohs_doc[] =
1726"ntohs(integer) -> integer\n\
1727\n\
1728Convert a 16-bit integer from network to host byte order.";
1729
1730
Guido van Rossum006bf911996-06-12 04:04:55 +00001731static PyObject *
1732BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1733{
1734 int x1, x2;
1735
1736 if (!PyArg_Parse(args, "i", &x1)) {
1737 return NULL;
1738 }
1739 x2 = ntohl(x1);
1740 return PyInt_FromLong(x2);
1741}
1742
Guido van Rossum82a5c661998-07-07 20:45:43 +00001743static char ntohl_doc[] =
1744"ntohl(integer) -> integer\n\
1745\n\
1746Convert a 32-bit integer from network to host byte order.";
1747
1748
Guido van Rossum006bf911996-06-12 04:04:55 +00001749static PyObject *
1750BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1751{
1752 int x1, x2;
1753
1754 if (!PyArg_Parse(args, "i", &x1)) {
1755 return NULL;
1756 }
1757 x2 = (int)htons((short)x1);
1758 return PyInt_FromLong(x2);
1759}
1760
Guido van Rossum82a5c661998-07-07 20:45:43 +00001761static char htons_doc[] =
1762"htons(integer) -> integer\n\
1763\n\
1764Convert a 16-bit integer from host to network byte order.";
1765
1766
Guido van Rossum006bf911996-06-12 04:04:55 +00001767static PyObject *
1768BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1769{
1770 int x1, x2;
1771
1772 if (!PyArg_Parse(args, "i", &x1)) {
1773 return NULL;
1774 }
1775 x2 = htonl(x1);
1776 return PyInt_FromLong(x2);
1777}
1778
Guido van Rossum82a5c661998-07-07 20:45:43 +00001779static char htonl_doc[] =
1780"htonl(integer) -> integer\n\
1781\n\
1782Convert a 32-bit integer from host to network byte order.";
1783
1784
Guido van Rossum30a685f1991-06-27 15:51:29 +00001785/* List of functions exported by this module. */
1786
Guido van Rossum73624e91994-10-10 17:59:00 +00001787static PyMethodDef PySocket_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001788 {"gethostbyname", PySocket_gethostbyname, 0, gethostbyname_doc},
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001789 {"gethostbyname_ex", PySocket_gethostbyname_ex, 0, ghbn_ex_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00001790 {"gethostbyaddr", PySocket_gethostbyaddr, 0, gethostbyaddr_doc},
1791 {"gethostname", PySocket_gethostname, 0, gethostname_doc},
1792 {"getservbyname", PySocket_getservbyname, 0, getservbyname_doc},
1793 {"getprotobyname", PySocket_getprotobyname, 0,getprotobyname_doc},
1794 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001795#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001796 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001797#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001798 {"ntohs", PySocket_ntohs, 0, ntohs_doc},
1799 {"ntohl", PySocket_ntohl, 0, ntohl_doc},
1800 {"htons", PySocket_htons, 0, htons_doc},
1801 {"htonl", PySocket_htonl, 0, htonl_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001802 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001803};
1804
Guido van Rossum30a685f1991-06-27 15:51:29 +00001805
1806/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00001807 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001808 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00001809 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001810static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001811BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001812{
Guido van Rossum73624e91994-10-10 17:59:00 +00001813 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00001814 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001815 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00001816
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001817 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001818}
1819
Guido van Rossum30a685f1991-06-27 15:51:29 +00001820
Guido van Rossum8d665e61996-06-26 18:22:49 +00001821#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001822
1823/* Additional initialization and cleanup for NT/Windows */
1824
1825static void
1826NTcleanup()
1827{
1828 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001829}
1830
1831static int
1832NTinit()
1833{
1834 WSADATA WSAData;
1835 int ret;
1836 char buf[100];
1837 ret = WSAStartup(0x0101, &WSAData);
1838 switch (ret) {
1839 case 0: /* no error */
1840 atexit(NTcleanup);
1841 return 1;
1842 case WSASYSNOTREADY:
1843 PyErr_SetString(PyExc_ImportError,
1844 "WSAStartup failed: network not ready");
1845 break;
1846 case WSAVERNOTSUPPORTED:
1847 case WSAEINVAL:
1848 PyErr_SetString(PyExc_ImportError,
1849 "WSAStartup failed: requested version not supported");
1850 break;
1851 default:
1852 sprintf(buf, "WSAStartup failed: error code %d", ret);
1853 PyErr_SetString(PyExc_ImportError, buf);
1854 break;
1855 }
1856 return 0;
1857}
1858
Guido van Rossum8d665e61996-06-26 18:22:49 +00001859#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00001860
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001861#if defined(PYOS_OS2)
1862
1863/* Additional initialization and cleanup for OS/2 */
1864
1865static void
1866OS2cleanup()
1867{
1868 /* No cleanup is necessary for OS/2 Sockets */
1869}
1870
1871static int
1872OS2init()
1873{
1874 char reason[64];
1875 int rc = sock_init();
1876
1877 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00001878 atexit(OS2cleanup);
1879 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001880 }
1881
1882 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
1883 PyErr_SetString(PyExc_ImportError, reason);
1884
Guido van Rossum32c575d1997-12-02 20:37:32 +00001885 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001886}
1887
1888#endif /* PYOS_OS2 */
1889
Guido van Rossumbe32c891996-06-20 16:25:29 +00001890
Guido van Rossum30a685f1991-06-27 15:51:29 +00001891/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001892 * This is called when the first 'import socket' is done,
1893 * via a table in config.c, if config.c is compiled with USE_SOCKET
1894 * defined.
1895 *
1896 * For MS_WINDOWS (which means any Windows variant), this module
1897 * is actually called "_socket", and there's a wrapper "socket.py"
1898 * which implements some missing functionality (such as makefile(),
1899 * dup() and fromfd()). The import of "_socket" may fail with an
1900 * ImportError exception if initialization of WINSOCK fails. When
1901 * WINSOCK is initialized succesfully, a call to WSACleanup() is
1902 * scheduled to be made at exit time.
1903 *
1904 * For OS/2, this module is also called "_socket" and uses a wrapper
1905 * "socket.py" which implements that functionality that is missing
1906 * when PC operating systems don't put socket descriptors in the
1907 * operating system's filesystem layer.
1908 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001909
Guido van Rossum82a5c661998-07-07 20:45:43 +00001910static char module_doc[] =
1911"This module provides socket operations and some related functions.\n\
1912On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
1913On other systems, it only supports IP.\n\
1914\n\
1915Functions:\n\
1916\n\
1917socket() -- create a new socket object\n\
1918fromfd() -- create a socket object from an open file descriptor (*)\n\
1919gethostname() -- return the current hostname\n\
1920gethostbyname() -- map a hostname to its IP number\n\
1921gethostbyaddr() -- map an IP number or hostname to DNS info\n\
1922getservbyname() -- map a service name and a protocol name to a port number\n\
1923getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
1924ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
1925htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
1926\n\
1927(*) not available on all platforms!)\n\
1928\n\
1929Special objects:\n\
1930\n\
1931SocketType -- type object for socket objects\n\
1932error -- exception raised for I/O errors\n\
1933\n\
1934Integer constants:\n\
1935\n\
1936AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
1937SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
1938\n\
1939Many other constants may be defined; these may be used in calls to\n\
1940the setsockopt() and getsockopt() methods.\n\
1941";
1942
1943static char sockettype_doc[] =
1944"A socket represents one endpoint of a network connection.\n\
1945\n\
1946Methods:\n\
1947\n\
1948accept() -- accept a connection, returning new socket and client address\n\
1949bind() -- bind the socket to a local address\n\
1950close() -- close the socket\n\
1951connect() -- connect the socket to a remote address\n\
1952connect_ex() -- connect, return an error code instead of an exception \n\
1953dup() -- return a new socket object identical to the current one (*)\n\
1954fileno() -- return underlying file descriptor\n\
1955getpeername() -- return remote address (*)\n\
1956getsockname() -- return local address\n\
1957getsockopt() -- get socket options\n\
1958listen() -- start listening for incoming connections\n\
1959makefile() -- return a file object corresponding tot the socket (*)\n\
1960recv() -- receive data\n\
1961recvfrom() -- receive data and sender's address\n\
1962send() -- send data\n\
1963sendto() -- send data to a given address\n\
1964setblocking() -- set or clear the blocking I/O flag\n\
1965setsockopt() -- set socket options\n\
1966shutdown() -- shut down traffic in one or both directions\n\
1967\n\
1968(*) not available on all platforms!)";
1969
Guido van Rossum3886bb61998-12-04 18:50:17 +00001970DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00001971#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001972init_socket()
1973#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001974initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00001975#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001976{
Guido van Rossum73624e91994-10-10 17:59:00 +00001977 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001978#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001979 if (!NTinit())
1980 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001981 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001982#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00001983#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001984 if (!OS2init())
1985 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001986 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00001987#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00001988#if defined(__BEOS__)
1989 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
1990#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001991 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001992#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00001993#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001994#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001995 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001996 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
1997 if (PySocket_Error == NULL)
1998 return;
1999 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002000 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002001 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002002 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002003 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002004 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002005 return;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002006 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002007#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002008 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002009#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002010 insint(d, "SOCK_STREAM", SOCK_STREAM);
2011 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002012#ifndef __BEOS__
2013/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002014 insint(d, "SOCK_RAW", SOCK_RAW);
2015 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2016 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002017#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002018
2019#ifdef SO_DEBUG
2020 insint(d, "SO_DEBUG", SO_DEBUG);
2021#endif
2022#ifdef SO_ACCEPTCONN
2023 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2024#endif
2025#ifdef SO_REUSEADDR
2026 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2027#endif
2028#ifdef SO_KEEPALIVE
2029 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2030#endif
2031#ifdef SO_DONTROUTE
2032 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2033#endif
2034#ifdef SO_BROADCAST
2035 insint(d, "SO_BROADCAST", SO_BROADCAST);
2036#endif
2037#ifdef SO_USELOOPBACK
2038 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2039#endif
2040#ifdef SO_LINGER
2041 insint(d, "SO_LINGER", SO_LINGER);
2042#endif
2043#ifdef SO_OOBINLINE
2044 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2045#endif
2046#ifdef SO_REUSEPORT
2047 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2048#endif
2049
2050#ifdef SO_SNDBUF
2051 insint(d, "SO_SNDBUF", SO_SNDBUF);
2052#endif
2053#ifdef SO_RCVBUF
2054 insint(d, "SO_RCVBUF", SO_RCVBUF);
2055#endif
2056#ifdef SO_SNDLOWAT
2057 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2058#endif
2059#ifdef SO_RCVLOWAT
2060 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2061#endif
2062#ifdef SO_SNDTIMEO
2063 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2064#endif
2065#ifdef SO_RCVTIMEO
2066 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2067#endif
2068#ifdef SO_ERROR
2069 insint(d, "SO_ERROR", SO_ERROR);
2070#endif
2071#ifdef SO_TYPE
2072 insint(d, "SO_TYPE", SO_TYPE);
2073#endif
2074
2075 /* Maximum number of connections for "listen" */
2076#ifdef SOMAXCONN
2077 insint(d, "SOMAXCONN", SOMAXCONN);
2078#else
2079 insint(d, "SOMAXCONN", 5); /* Common value */
2080#endif
2081
2082 /* Flags for send, recv */
2083#ifdef MSG_OOB
2084 insint(d, "MSG_OOB", MSG_OOB);
2085#endif
2086#ifdef MSG_PEEK
2087 insint(d, "MSG_PEEK", MSG_PEEK);
2088#endif
2089#ifdef MSG_DONTROUTE
2090 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2091#endif
2092#ifdef MSG_EOR
2093 insint(d, "MSG_EOR", MSG_EOR);
2094#endif
2095#ifdef MSG_TRUNC
2096 insint(d, "MSG_TRUNC", MSG_TRUNC);
2097#endif
2098#ifdef MSG_CTRUNC
2099 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2100#endif
2101#ifdef MSG_WAITALL
2102 insint(d, "MSG_WAITALL", MSG_WAITALL);
2103#endif
2104#ifdef MSG_BTAG
2105 insint(d, "MSG_BTAG", MSG_BTAG);
2106#endif
2107#ifdef MSG_ETAG
2108 insint(d, "MSG_ETAG", MSG_ETAG);
2109#endif
2110
2111 /* Protocol level and numbers, usable for [gs]etsockopt */
Guido van Rossum578de301998-05-28 20:18:18 +00002112/* Sigh -- some systems (e.g. Linux) use enums for these. */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002113#ifdef SOL_SOCKET
2114 insint(d, "SOL_SOCKET", SOL_SOCKET);
2115#endif
2116#ifdef IPPROTO_IP
2117 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002118#else
2119 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002120#endif
2121#ifdef IPPROTO_ICMP
2122 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002123#else
2124 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002125#endif
2126#ifdef IPPROTO_IGMP
2127 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2128#endif
2129#ifdef IPPROTO_GGP
2130 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2131#endif
2132#ifdef IPPROTO_TCP
2133 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002134#else
2135 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002136#endif
2137#ifdef IPPROTO_EGP
2138 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2139#endif
2140#ifdef IPPROTO_PUP
2141 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2142#endif
2143#ifdef IPPROTO_UDP
2144 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002145#else
2146 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002147#endif
2148#ifdef IPPROTO_IDP
2149 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2150#endif
2151#ifdef IPPROTO_HELLO
2152 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2153#endif
2154#ifdef IPPROTO_ND
2155 insint(d, "IPPROTO_ND", IPPROTO_ND);
2156#endif
2157#ifdef IPPROTO_TP
2158 insint(d, "IPPROTO_TP", IPPROTO_TP);
2159#endif
2160#ifdef IPPROTO_XTP
2161 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2162#endif
2163#ifdef IPPROTO_EON
2164 insint(d, "IPPROTO_EON", IPPROTO_EON);
2165#endif
2166#ifdef IPPROTO_BIP
2167 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2168#endif
2169/**/
2170#ifdef IPPROTO_RAW
2171 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002172#else
2173 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002174#endif
2175#ifdef IPPROTO_MAX
2176 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2177#endif
2178
2179 /* Some port configuration */
2180#ifdef IPPORT_RESERVED
2181 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2182#else
2183 insint(d, "IPPORT_RESERVED", 1024);
2184#endif
2185#ifdef IPPORT_USERRESERVED
2186 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2187#else
2188 insint(d, "IPPORT_USERRESERVED", 5000);
2189#endif
2190
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002191 /* Some reserved IP v.4 addresses */
2192#ifdef INADDR_ANY
2193 insint(d, "INADDR_ANY", INADDR_ANY);
2194#else
2195 insint(d, "INADDR_ANY", 0x00000000);
2196#endif
2197#ifdef INADDR_BROADCAST
2198 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2199#else
2200 insint(d, "INADDR_BROADCAST", 0xffffffff);
2201#endif
2202#ifdef INADDR_LOOPBACK
2203 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2204#else
2205 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2206#endif
2207#ifdef INADDR_UNSPEC_GROUP
2208 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2209#else
2210 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2211#endif
2212#ifdef INADDR_ALLHOSTS_GROUP
2213 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2214#else
2215 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2216#endif
2217#ifdef INADDR_MAX_LOCAL_GROUP
2218 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2219#else
2220 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2221#endif
2222#ifdef INADDR_NONE
2223 insint(d, "INADDR_NONE", INADDR_NONE);
2224#else
2225 insint(d, "INADDR_NONE", 0xffffffff);
2226#endif
2227
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002228 /* IP [gs]etsockopt options */
2229#ifdef IP_OPTIONS
2230 insint(d, "IP_OPTIONS", IP_OPTIONS);
2231#endif
2232#ifdef IP_HDRINCL
2233 insint(d, "IP_HDRINCL", IP_HDRINCL);
2234#endif
2235#ifdef IP_TOS
2236 insint(d, "IP_TOS", IP_TOS);
2237#endif
2238#ifdef IP_TTL
2239 insint(d, "IP_TTL", IP_TTL);
2240#endif
2241#ifdef IP_RECVOPTS
2242 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2243#endif
2244#ifdef IP_RECVRETOPTS
2245 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2246#endif
2247#ifdef IP_RECVDSTADDR
2248 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2249#endif
2250#ifdef IP_RETOPTS
2251 insint(d, "IP_RETOPTS", IP_RETOPTS);
2252#endif
2253#ifdef IP_MULTICAST_IF
2254 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2255#endif
2256#ifdef IP_MULTICAST_TTL
2257 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2258#endif
2259#ifdef IP_MULTICAST_LOOP
2260 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2261#endif
2262#ifdef IP_ADD_MEMBERSHIP
2263 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2264#endif
2265#ifdef IP_DROP_MEMBERSHIP
2266 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2267#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002268
2269 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002270#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002271 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002272#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002273}