blob: c3524bd393ca4db723f4ee9da7c013b0520b0108 [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
90#if defined(HAVE_GETHOSTBYNAME_R) && defined(HAVE_GETHOSTBYNAME_R_3_ARG)
91/* XXX Somebody please submit code for the 3-arg version! */
92#undef HAVE_GETHOSTBYNAME_R
93#endif
94
95#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
96#define USE_GETHOSTBYNAME_LOCK
97#endif
98
99#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum49b56061998-10-01 20:42:43 +0000100#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000101#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000102
Guido van Rossuma376cc51996-12-05 23:43:35 +0000103#ifdef HAVE_UNISTD_H
104#include <unistd.h>
105#endif
106
Guido van Rossumbcc20741998-08-04 22:53:56 +0000107#if !defined(MS_WINDOWS) && !defined(PYOS_OS2) && !defined(__BEOS__)
Guido van Rossumfb4130d1996-12-10 15:17:08 +0000108extern int gethostname(); /* For Solaris, at least */
109#endif
110
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000111#if defined(PYCC_VACPP)
112#include <types.h>
113#include <io.h>
114#include <sys/ioctl.h>
115#include <utils.h>
116#include <ctype.h>
117#endif
118
119#if defined(PYOS_OS2)
120#define INCL_DOS
121#define INCL_DOSERRORS
122#define INCL_NOPMAPI
123#include <os2.h>
124#endif
125
Guido van Rossumbcc20741998-08-04 22:53:56 +0000126#if defined(__BEOS__)
127/* It's in the libs, but not the headers... - [cjh] */
128int shutdown( int, int );
129#endif
130
Guido van Rossumb6775db1994-08-01 11:34:53 +0000131#include <sys/types.h>
132#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +0000133
Guido van Rossum81194471991-07-27 21:42:02 +0000134#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000135#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000136#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000137#include <sys/socket.h>
138#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +0000139#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000140#else
141#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000142#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000143#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000144#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000145#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000146#else
147#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000148#endif
149
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000150#ifndef O_NDELAY
151#define O_NDELAY O_NONBLOCK /* For QNX only? */
152#endif
153
Jack Jansen508537b1996-02-14 15:57:45 +0000154#ifdef USE_GUSI
155/* fdopen() isn't declared in stdio.h (sigh) */
156#include <GUSI.h>
157#endif
158
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000159
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000160/* Here we have some hacks to choose between K&R or ANSI style function
161 definitions. For NT to build this as an extension module (ie, DLL)
162 it must be compiled by the C++ compiler, as it takes the address of
163 a static data item exported from the main Python DLL.
164*/
Guido van Rossumbcc20741998-08-04 22:53:56 +0000165#if defined(MS_WINDOWS) || defined(__BEOS__)
166/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000167/* seem to be a few differences in the API */
168#define close closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000169#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000170#define FORCE_ANSI_FUNC_DEFS
171#endif
172
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000173#if defined(PYOS_OS2)
174#define close soclose
175#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
176#define FORCE_ANSI_FUNC_DEFS
177#endif
178
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000179#ifdef FORCE_ANSI_FUNC_DEFS
180#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
181fnname( arg1type arg1name )
182
183#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
184fnname( arg1type arg1name, arg2type arg2name )
185
186#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
187fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
188
189#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
190fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
191
192#else /* !FORCE_ANSI_FN_DEFS */
193#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
194fnname( arg1name ) \
195 arg1type arg1name;
196
197#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
198fnname( arg1name, arg2name ) \
199 arg1type arg1name; \
200 arg2type arg2name;
201
202#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
203fnname( arg1name, arg2name, arg3name ) \
204 arg1type arg1name; \
205 arg2type arg2name; \
206 arg3type arg3name;
207
208#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
209fnname( arg1name, arg2name, arg3name, arg4name ) \
210 arg1type arg1name; \
211 arg2type arg2name; \
212 arg3type arg3name; \
213 arg4type arg4name;
214
215#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000216
217/* Global variable holding the exception type for errors detected
218 by this module (but not argument type or memory errors, etc.). */
219
Guido van Rossum73624e91994-10-10 17:59:00 +0000220static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000221
222
223/* Convenience function to raise an error according to errno
224 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000225
Guido van Rossum73624e91994-10-10 17:59:00 +0000226static PyObject *
227PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000228{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000229#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000230 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000231 PyObject *v;
232 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000233 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000234 PyErr_SetObject(PySocket_Error, v);
235 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000236 }
237 return NULL;
238 }
239 else
240#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000241
242#if defined(PYOS_OS2)
243 if (sock_errno() != NO_ERROR) {
244 APIRET rc;
245 ULONG msglen;
246 char outbuf[100];
247 int myerrorcode = sock_errno();
248
249 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
250 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
251 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
252 if (rc == NO_ERROR) {
253 PyObject *v;
254
255 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
256 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
257 char *lastc = &outbuf[ strlen(outbuf)-1 ];
258 while (lastc > outbuf && isspace(*lastc))
259 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
260 }
261 v = Py_BuildValue("(is)", myerrorcode, outbuf);
262 if (v != NULL) {
263 PyErr_SetObject(PySocket_Error, v);
264 Py_DECREF(v);
265 }
266 return NULL;
267 }
268 }
269#endif
270
Guido van Rossum73624e91994-10-10 17:59:00 +0000271 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000272}
273
Guido van Rossum30a685f1991-06-27 15:51:29 +0000274
275/* The object holding a socket. It holds some extra information,
276 like the address family, which is used to decode socket address
277 arguments properly. */
278
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000279typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000280 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000281 int sock_fd; /* Socket file descriptor */
282 int sock_family; /* Address family, e.g., AF_INET */
283 int sock_type; /* Socket type, e.g., SOCK_STREAM */
284 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000285 union sock_addr {
286 struct sockaddr_in in;
287#ifdef AF_UNIX
288 struct sockaddr_un un;
289#endif
290 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000291} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000292
Guido van Rossum30a685f1991-06-27 15:51:29 +0000293
294/* A forward reference to the Socktype type object.
295 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000296 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000297 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000298
Guido van Rossum73624e91994-10-10 17:59:00 +0000299staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000300
Guido van Rossum30a685f1991-06-27 15:51:29 +0000301
302/* Create a new socket object.
303 This just creates the object and initializes it.
304 If the creation fails, return NULL and set an exception (implicit
305 in NEWOBJ()). */
306
Guido van Rossum73624e91994-10-10 17:59:00 +0000307static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000308BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000309{
Guido van Rossum73624e91994-10-10 17:59:00 +0000310 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000311 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000312 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000313 if (s != NULL) {
314 s->sock_fd = fd;
315 s->sock_family = family;
316 s->sock_type = type;
317 s->sock_proto = proto;
318 }
319 return s;
320}
321
Guido van Rossum30a685f1991-06-27 15:51:29 +0000322
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000323/* Lock to allow python interpreter to continue, but only allow one
324 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000325#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000326PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000327#endif
328
329
Guido van Rossum30a685f1991-06-27 15:51:29 +0000330/* Convert a string specifying a host name or one of a few symbolic
331 names to a numeric IP address. This usually calls gethostbyname()
332 to do the work; the names "" and "<broadcast>" are special.
333 Return the length (should always be 4 bytes), or negative if
334 an error occurred; then an exception is raised. */
335
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000336static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000337BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000338{
339 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000340 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000341 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000342 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000343#ifdef HAVE_GETHOSTBYNAME_R
344 struct hostent hp_allocated;
345 char buf[1001];
346 int buf_len = (sizeof buf) - 1;
347 int errnop;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000348#ifdef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000349 int result;
350#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000351#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000352
Guido van Rossuma376cc51996-12-05 23:43:35 +0000353 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000354 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000355 addr_ret->sin_addr.s_addr = INADDR_ANY;
356 return 4;
357 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000358 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000359 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
360 return 4;
361 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000362 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
363 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
364 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
365 addr_ret->sin_addr.s_addr = htonl(
366 ((long) d1 << 24) | ((long) d2 << 16) |
367 ((long) d3 << 8) | ((long) d4 << 0));
368 return 4;
369 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000370 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000371#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum3baaa131999-03-22 21:44:51 +0000372#ifdef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000373 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
374#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000375 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000376#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000377#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000378#ifdef USE_GETHOSTBYNAME_LOCK
379 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000380#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000381 hp = gethostbyname(name);
382#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000383 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000384
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000385 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000386#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000387 /* Let's get real error message to return */
388 extern int h_errno;
389 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
390#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000391 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000392#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000393#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000394 PyThread_release_lock(gethostbyname_lock);
395#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000396 return -1;
397 }
398 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000399 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000400#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000401 PyThread_release_lock(gethostbyname_lock);
402#endif
403 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000404}
405
Guido van Rossum30a685f1991-06-27 15:51:29 +0000406
Guido van Rossum30a685f1991-06-27 15:51:29 +0000407/* Create a string object representing an IP address.
408 This is always a string of the form 'dd.dd.dd.dd' (with variable
409 size numbers). */
410
Guido van Rossum73624e91994-10-10 17:59:00 +0000411static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000412BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000413{
414 long x = ntohl(addr->sin_addr.s_addr);
415 char buf[100];
416 sprintf(buf, "%d.%d.%d.%d",
417 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
418 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000419 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000420}
421
422
423/* Create an object representing the given socket address,
424 suitable for passing it back to bind(), connect() etc.
425 The family field of the sockaddr structure is inspected
426 to determine what kind of address it really is. */
427
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000428/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000429static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000430BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000431{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000432 if (addrlen == 0) {
433 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000434 Py_INCREF(Py_None);
435 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000436 }
437
Guido van Rossumbcc20741998-08-04 22:53:56 +0000438#ifdef __BEOS__
439 /* XXX: BeOS version of accept() doesn't set family coreectly */
440 addr->sa_family = AF_INET;
441#endif
442
Guido van Rossum30a685f1991-06-27 15:51:29 +0000443 switch (addr->sa_family) {
444
445 case AF_INET:
446 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000447 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000448 PyObject *addrobj = makeipaddr(a);
449 PyObject *ret = NULL;
450 if (addrobj) {
451 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
452 Py_DECREF(addrobj);
453 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000454 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000455 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000456
Guido van Rossumb6775db1994-08-01 11:34:53 +0000457#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000458 case AF_UNIX:
459 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000460 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000461 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000462 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000463#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000464
465 /* More cases here... */
466
467 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000468 /* If we don't know the address family, don't raise an
469 exception -- return it as a tuple. */
470 return Py_BuildValue("is#",
471 addr->sa_family,
472 addr->sa_data,
473 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000474
Guido van Rossum30a685f1991-06-27 15:51:29 +0000475 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000476}
477
Guido van Rossum30a685f1991-06-27 15:51:29 +0000478
479/* Parse a socket address argument according to the socket object's
480 address family. Return 1 if the address was in the proper format,
481 0 of not. The address is returned through addr_ret, its length
482 through len_ret. */
483
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000484static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000485BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000486getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000487{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000488 switch (s->sock_family) {
489
Guido van Rossumb6775db1994-08-01 11:34:53 +0000490#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000491 case AF_UNIX:
492 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000493 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000494 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000495 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000496 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000497 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000498 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000499 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000500 PyErr_SetString(PySocket_Error,
501 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000502 return 0;
503 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000504 addr->sun_family = AF_UNIX;
505 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000506 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000507 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000508 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000509 return 1;
510 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000511#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000512
Guido van Rossum30a685f1991-06-27 15:51:29 +0000513 case AF_INET:
514 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000515 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000516 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000517 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000518 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000519 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000520 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000521 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000522 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000523 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000524 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000525 *addr_ret = (struct sockaddr *) addr;
526 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000527 return 1;
528 }
529
Guido van Rossum30a685f1991-06-27 15:51:29 +0000530 /* More cases here... */
531
532 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000533 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000534 return 0;
535
536 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000537}
538
Guido van Rossum30a685f1991-06-27 15:51:29 +0000539
Guido van Rossum710e1df1992-06-12 10:39:36 +0000540/* Get the address length according to the socket object's address family.
541 Return 1 if the family is known, 0 otherwise. The length is returned
542 through len_ret. */
543
544static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000545BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000546{
547 switch (s->sock_family) {
548
Guido van Rossumb6775db1994-08-01 11:34:53 +0000549#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000550 case AF_UNIX:
551 {
552 *len_ret = sizeof (struct sockaddr_un);
553 return 1;
554 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000555#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000556
557 case AF_INET:
558 {
559 *len_ret = sizeof (struct sockaddr_in);
560 return 1;
561 }
562
563 /* More cases here... */
564
565 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000566 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000567 return 0;
568
569 }
570}
571
572
Guido van Rossum30a685f1991-06-27 15:51:29 +0000573/* s.accept() method */
574
Guido van Rossum73624e91994-10-10 17:59:00 +0000575static PyObject *
576BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000577{
578 char addrbuf[256];
579 int addrlen, newfd;
Barry Warsaw752300b1997-01-03 17:18:10 +0000580 PyObject *sock = NULL;
581 PyObject *addr = NULL;
582 PyObject *res = NULL;
583
Guido van Rossum73624e91994-10-10 17:59:00 +0000584 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000585 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000586 if (!getsockaddrlen(s, &addrlen))
587 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000588 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000589 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000590 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000591 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000592 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000593
Guido van Rossum30a685f1991-06-27 15:51:29 +0000594 /* Create the new object with unspecified family,
595 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000596 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000597 s->sock_family,
598 s->sock_type,
599 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000600 if (sock == NULL) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000601 close(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000602 goto finally;
603 }
604 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
605 goto finally;
606
607 if (!(res = Py_BuildValue("OO", sock, addr)))
608 goto finally;
609
610 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000611 Py_XDECREF(sock);
612 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000613 return res;
614}
615
Guido van Rossum82a5c661998-07-07 20:45:43 +0000616static char accept_doc[] =
617"accept() -> (socket object, address info)\n\
618\n\
619Wait for an incoming connection. Return a new socket representing the\n\
620connection, and the address of the client. For IP sockets, the address\n\
621info is a pair (hostaddr, port).";
622
Guido van Rossum30a685f1991-06-27 15:51:29 +0000623
Guido van Rossume4485b01994-09-07 14:32:49 +0000624/* s.setblocking(1 | 0) method */
625
Guido van Rossum73624e91994-10-10 17:59:00 +0000626static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000627BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000628{
629 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000630#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000631 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000632#endif
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000633 if (!PyArg_Parse(args, "i", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000634 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000635 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000636#ifdef __BEOS__
637 block = !block;
638 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
639 (void *)(&block), sizeof( int ) );
640#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000641#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000642#ifdef PYOS_OS2
643 block = !block;
644 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
645#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000646 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
647 if (block)
648 delay_flag &= (~O_NDELAY);
649 else
650 delay_flag |= O_NDELAY;
651 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000652#endif /* !PYOS_OS2 */
653#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000654 block = !block;
655 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000656#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000657#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000658 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000659
Guido van Rossum73624e91994-10-10 17:59:00 +0000660 Py_INCREF(Py_None);
661 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000662}
Guido van Rossume4485b01994-09-07 14:32:49 +0000663
Guido van Rossum82a5c661998-07-07 20:45:43 +0000664static char setblocking_doc[] =
665"setblocking(flag)\n\
666\n\
667Set the socket to blocking (flag is true) or non-blocking (false).\n\
668This uses the FIONBIO ioctl with the O_NDELAY flag.";
669
Guido van Rossume4485b01994-09-07 14:32:49 +0000670
Guido van Rossumaee08791992-09-08 09:05:33 +0000671/* s.setsockopt() method.
672 With an integer third argument, sets an integer option.
673 With a string third argument, sets an option from a buffer;
674 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000675
Guido van Rossum73624e91994-10-10 17:59:00 +0000676static PyObject *
677BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000678{
679 int level;
680 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000681 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000682 char *buf;
683 int buflen;
684 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000685
Guido van Rossum73624e91994-10-10 17:59:00 +0000686 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000687 buf = (char *) &flag;
688 buflen = sizeof flag;
689 }
690 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000691 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +0000692 if (!PyArg_Parse(args, "(iis#)", &level, &optname,
693 &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000694 return NULL;
695 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000696 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000697 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000698 return PySocket_Err();
699 Py_INCREF(Py_None);
700 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000701}
702
Guido van Rossum82a5c661998-07-07 20:45:43 +0000703static char setsockopt_doc[] =
704"setsockopt(level, option, value)\n\
705\n\
706Set a socket option. See the Unix manual for level and option.\n\
707The value argument can either be an integer or a string.";
708
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000709
Guido van Rossumaee08791992-09-08 09:05:33 +0000710/* s.getsockopt() method.
711 With two arguments, retrieves an integer option.
712 With a third integer argument, retrieves a string buffer of that size;
713 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000714
Guido van Rossum73624e91994-10-10 17:59:00 +0000715static PyObject *
716BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000717{
718 int level;
719 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000720 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000721 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000722 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000723
Guido van Rossumbcc20741998-08-04 22:53:56 +0000724#ifdef __BEOS__
725/* We have incomplete socket support. */
726 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
727 return NULL;
728#else
729
Guido van Rossumbe32c891996-06-20 16:25:29 +0000730 if (!PyArg_ParseTuple(args, "ii|i", &level, &optname, &buflen))
731 return NULL;
732
733 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000734 int flag = 0;
735 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000736 res = getsockopt(s->sock_fd, level, optname,
737 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000738 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000739 return PySocket_Err();
740 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000741 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000742 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000743 PyErr_SetString(PySocket_Error,
744 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000745 return NULL;
746 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000747 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000748 if (buf == NULL)
749 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000750 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000751 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000752 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000753 Py_DECREF(buf);
754 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000755 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000756 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000757 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000758#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000759}
760
Guido van Rossum82a5c661998-07-07 20:45:43 +0000761static char getsockopt_doc[] =
762"getsockopt(level, option[, buffersize]) -> value\n\
763\n\
764Get a socket option. See the Unix manual for level and option.\n\
765If a nonzero buffersize argument is given, the return value is a\n\
766string of that length; otherwise it is an integer.";
767
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000768
Guido van Rossum30a685f1991-06-27 15:51:29 +0000769/* s.bind(sockaddr) method */
770
Guido van Rossum73624e91994-10-10 17:59:00 +0000771static PyObject *
772BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000773{
774 struct sockaddr *addr;
775 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000776 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000777 if (!getsockaddrarg(s, args, &addr, &addrlen))
778 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000779 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000780 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000781 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000782 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000783 return PySocket_Err();
784 Py_INCREF(Py_None);
785 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000786}
787
Guido van Rossum82a5c661998-07-07 20:45:43 +0000788static char bind_doc[] =
789"bind(address)\n\
790\n\
791Bind the socket to a local address. For IP sockets, the address is a\n\
792pair (host, port); the host must refer to the local host.";
793
Guido van Rossum30a685f1991-06-27 15:51:29 +0000794
795/* s.close() method.
796 Set the file descriptor to -1 so operations tried subsequently
797 will surely fail. */
798
Guido van Rossum73624e91994-10-10 17:59:00 +0000799static PyObject *
800BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000801{
Guido van Rossum73624e91994-10-10 17:59:00 +0000802 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000803 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000804 if (s->sock_fd != -1) {
805 Py_BEGIN_ALLOW_THREADS
806 (void) close(s->sock_fd);
807 Py_END_ALLOW_THREADS
808 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000809 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000810 Py_INCREF(Py_None);
811 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000812}
813
Guido van Rossum82a5c661998-07-07 20:45:43 +0000814static char close_doc[] =
815"close()\n\
816\n\
817Close the socket. It cannot be used after this call.";
818
Guido van Rossum30a685f1991-06-27 15:51:29 +0000819
820/* s.connect(sockaddr) method */
821
Guido van Rossum73624e91994-10-10 17:59:00 +0000822static PyObject *
823BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000824{
825 struct sockaddr *addr;
826 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000827 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000828 if (!getsockaddrarg(s, args, &addr, &addrlen))
829 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000830 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000831 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000832 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000833 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000834 return PySocket_Err();
835 Py_INCREF(Py_None);
836 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000837}
838
Guido van Rossum82a5c661998-07-07 20:45:43 +0000839static char connect_doc[] =
840"connect(address)\n\
841\n\
842Connect the socket to a remote address. For IP sockets, the address\n\
843is a pair (host, port).";
844
Guido van Rossum30a685f1991-06-27 15:51:29 +0000845
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000846/* s.connect_ex(sockaddr) method */
847
848static PyObject *
849BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
850{
851 struct sockaddr *addr;
852 int addrlen;
853 int res;
854 if (!getsockaddrarg(s, args, &addr, &addrlen))
855 return NULL;
856 Py_BEGIN_ALLOW_THREADS
857 res = connect(s->sock_fd, addr, addrlen);
858 Py_END_ALLOW_THREADS
859 if (res != 0)
860 res = errno;
861 return PyInt_FromLong((long) res);
862}
863
Guido van Rossum82a5c661998-07-07 20:45:43 +0000864static char connect_ex_doc[] =
865"connect_ex(address)\n\
866\n\
867This is like connect(address), but returns an error code (the errno value)\n\
868instead of raising an exception when an error occurs.";
869
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000870
Guido van Rossumed233a51992-06-23 09:07:03 +0000871/* s.fileno() method */
872
Guido van Rossum73624e91994-10-10 17:59:00 +0000873static PyObject *
874BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000875{
Guido van Rossum73624e91994-10-10 17:59:00 +0000876 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000877 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000878 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000879}
880
Guido van Rossum82a5c661998-07-07 20:45:43 +0000881static char fileno_doc[] =
882"fileno() -> integer\n\
883\n\
884Return the integer file descriptor of the socket.";
885
Guido van Rossumed233a51992-06-23 09:07:03 +0000886
Guido van Rossumbe32c891996-06-20 16:25:29 +0000887#ifndef NO_DUP
888/* s.dup() method */
889
890static PyObject *
891BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
892{
893 int newfd;
894 PyObject *sock;
895 if (!PyArg_NoArgs(args))
896 return NULL;
897 newfd = dup(s->sock_fd);
898 if (newfd < 0)
899 return PySocket_Err();
900 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000901 s->sock_family,
902 s->sock_type,
903 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000904 if (sock == NULL)
905 close(newfd);
906 return sock;
907}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000908
909static char dup_doc[] =
910"dup() -> socket object\n\
911\n\
912Return a new socket object connected to the same system resource.";
913
Guido van Rossumbe32c891996-06-20 16:25:29 +0000914#endif
915
916
Guido van Rossumc89705d1992-11-26 08:54:07 +0000917/* s.getsockname() method */
918
Guido van Rossum73624e91994-10-10 17:59:00 +0000919static PyObject *
920BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000921{
922 char addrbuf[256];
923 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000924 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000925 return NULL;
926 if (!getsockaddrlen(s, &addrlen))
927 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000928 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000929 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000930 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000931 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000932 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000933 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000934 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
935}
936
Guido van Rossum82a5c661998-07-07 20:45:43 +0000937static char getsockname_doc[] =
938"getsockname() -> address info\n\
939\n\
940Return the address of the local endpoint. For IP sockets, the address\n\
941info is a pair (hostaddr, port).";
942
Guido van Rossumc89705d1992-11-26 08:54:07 +0000943
Guido van Rossumb6775db1994-08-01 11:34:53 +0000944#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000945/* s.getpeername() method */
946
Guido van Rossum73624e91994-10-10 17:59:00 +0000947static PyObject *
948BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000949{
950 char addrbuf[256];
951 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000952 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000953 return NULL;
954 if (!getsockaddrlen(s, &addrlen))
955 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000956 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000957 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000958 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000959 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000960 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000961 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
962}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000963
964static char getpeername_doc[] =
965"getpeername() -> address info\n\
966\n\
967Return the address of the remote endpoint. For IP sockets, the address\n\
968info is a pair (hostaddr, port).";
969
Guido van Rossumb6775db1994-08-01 11:34:53 +0000970#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000971
972
Guido van Rossum30a685f1991-06-27 15:51:29 +0000973/* s.listen(n) method */
974
Guido van Rossum73624e91994-10-10 17:59:00 +0000975static PyObject *
976BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000977{
978 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000979 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000980 if (!PyArg_Parse(args, "i", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000981 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000982 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000983 if (backlog < 1)
984 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000985 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000986 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000987 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000988 return PySocket_Err();
989 Py_INCREF(Py_None);
990 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000991}
992
Guido van Rossum82a5c661998-07-07 20:45:43 +0000993static char listen_doc[] =
994"listen(backlog)\n\
995\n\
996Enable a server to accept connections. The backlog argument must be at\n\
997least 1; it specifies the number of unaccepted connection that the system\n\
998will allow before refusing new connections.";
999
1000
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001001#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001002/* s.makefile(mode) method.
1003 Create a new open file object referring to a dupped version of
1004 the socket's file descriptor. (The dup() call is necessary so
1005 that the open file and socket objects may be closed independent
1006 of each other.)
1007 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1008
Guido van Rossum73624e91994-10-10 17:59:00 +00001009static PyObject *
1010BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001011{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001012 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +00001013 char *mode = "r";
1014 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001015 int fd;
1016 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001017 PyObject *f;
1018
1019 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001020 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001021#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001022 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1023 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001024#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001025 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001026#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001027 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001028 if (fd >= 0)
1029 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001030 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001031 }
1032 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1033 if (f != NULL)
1034 PyFile_SetBufSize(f, bufsize);
1035 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001036}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001037
1038static char makefile_doc[] =
1039"makefile([mode[, buffersize]]) -> file object\n\
1040\n\
1041Return a regular file object corresponding to the socket.\n\
1042The mode and buffersize arguments are as for the built-in open() function.";
1043
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001044#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001045
Guido van Rossum82a5c661998-07-07 20:45:43 +00001046
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001047/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001048
Guido van Rossum73624e91994-10-10 17:59:00 +00001049static PyObject *
1050BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001051{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001052 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001053 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001054 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1055 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001056 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001057 if (buf == NULL)
1058 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001059 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001060 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001061 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001062 if (n < 0) {
1063 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001064 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001065 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001066 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001067 return NULL;
1068 return buf;
1069}
1070
Guido van Rossum82a5c661998-07-07 20:45:43 +00001071static char recv_doc[] =
1072"recv(buffersize[, flags]) -> data\n\
1073\n\
1074Receive up to buffersize bytes from the socket. For the optional flags\n\
1075argument, see the Unix manual. When no data is available, block until\n\
1076at least one byte is available or until the remote end is closed. When\n\
1077the remote end is closed and all data is read, return the empty string.";
1078
Guido van Rossum30a685f1991-06-27 15:51:29 +00001079
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001080/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001081
Guido van Rossum73624e91994-10-10 17:59:00 +00001082static PyObject *
1083BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001084{
1085 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001086 PyObject *buf = NULL;
1087 PyObject *addr = NULL;
1088 PyObject *ret = NULL;
1089
Guido van Rossumbe32c891996-06-20 16:25:29 +00001090 int addrlen, len, n, flags = 0;
1091 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1092 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001093 if (!getsockaddrlen(s, &addrlen))
1094 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001095 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001096 if (buf == NULL)
1097 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001098 Py_BEGIN_ALLOW_THREADS
1099 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001100#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001101#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001102 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001103#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001104 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001105#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001106#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001107 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001108#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001109 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001110 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001111 if (n < 0) {
1112 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001113 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001114 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001115 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001116 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001117
1118 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1119 goto finally;
1120
Guido van Rossum73624e91994-10-10 17:59:00 +00001121 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001122 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001123 Py_XDECREF(addr);
1124 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001125 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001126}
1127
Guido van Rossum82a5c661998-07-07 20:45:43 +00001128static char recvfrom_doc[] =
1129"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1130\n\
1131Like recv(buffersize, flags) but also return the sender's address info.";
1132
Guido van Rossum30a685f1991-06-27 15:51:29 +00001133
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001134/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001135
Guido van Rossum73624e91994-10-10 17:59:00 +00001136static PyObject *
1137BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001138{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001139 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001140 int len, n, flags = 0;
1141 if (!PyArg_ParseTuple(args, "s#|i", &buf, &len, &flags))
1142 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001143 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001144 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001145 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001146 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001147 return PySocket_Err();
1148 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001149}
1150
Guido van Rossum82a5c661998-07-07 20:45:43 +00001151static char send_doc[] =
1152"send(data[, flags])\n\
1153\n\
1154Send a data string to the socket. For the optional flags\n\
1155argument, see the Unix manual.";
1156
Guido van Rossum30a685f1991-06-27 15:51:29 +00001157
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001158/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001159
Guido van Rossum73624e91994-10-10 17:59:00 +00001160static PyObject *
1161BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001162{
Guido van Rossum73624e91994-10-10 17:59:00 +00001163 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001164 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001165 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001166 int addrlen, len, n, flags;
1167 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001168 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
1169 PyErr_Clear();
1170 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001171 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001172 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001173 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001174 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001175 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001176 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001177 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001178 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001179 return PySocket_Err();
1180 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001181}
1182
Guido van Rossum82a5c661998-07-07 20:45:43 +00001183static char sendto_doc[] =
1184"sendto(data[, flags], address)\n\
1185\n\
1186Like send(data, flags) but allows specifying the destination address.\n\
1187For IP sockets, the address is a pair (hostaddr, port).";
1188
Guido van Rossum30a685f1991-06-27 15:51:29 +00001189
1190/* s.shutdown(how) method */
1191
Guido van Rossum73624e91994-10-10 17:59:00 +00001192static PyObject *
1193BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001194{
1195 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001196 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +00001197 if (!PyArg_Parse(args, "i", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001198 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001199 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001200 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001201 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001202 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001203 return PySocket_Err();
1204 Py_INCREF(Py_None);
1205 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001206}
1207
Guido van Rossum82a5c661998-07-07 20:45:43 +00001208static char shutdown_doc[] =
1209"shutdown(flag)\n\
1210\n\
1211Shut down the reading side of the socket (flag == 0), the writing side\n\
1212of the socket (flag == 1), or both ends (flag == 2).";
1213
Guido van Rossum30a685f1991-06-27 15:51:29 +00001214
1215/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001216
Guido van Rossum73624e91994-10-10 17:59:00 +00001217static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001218 {"accept", (PyCFunction)PySocketSock_accept, 0,
1219 accept_doc},
1220 {"bind", (PyCFunction)PySocketSock_bind, 0,
1221 bind_doc},
1222 {"close", (PyCFunction)PySocketSock_close, 0,
1223 close_doc},
1224 {"connect", (PyCFunction)PySocketSock_connect, 0,
1225 connect_doc},
1226 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 0,
1227 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001228#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001229 {"dup", (PyCFunction)PySocketSock_dup, 0,
1230 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001231#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001232 {"fileno", (PyCFunction)PySocketSock_fileno, 0,
1233 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001234#ifdef HAVE_GETPEERNAME
Guido van Rossum82a5c661998-07-07 20:45:43 +00001235 {"getpeername", (PyCFunction)PySocketSock_getpeername, 0,
1236 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001237#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001238 {"getsockname", (PyCFunction)PySocketSock_getsockname, 0,
1239 getsockname_doc},
1240 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1241 getsockopt_doc},
1242 {"listen", (PyCFunction)PySocketSock_listen, 0,
1243 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001244#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001245 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1246 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001247#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001248 {"recv", (PyCFunction)PySocketSock_recv, 1,
1249 recv_doc},
1250 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1251 recvfrom_doc},
1252 {"send", (PyCFunction)PySocketSock_send, 1,
1253 send_doc},
1254 {"sendto", (PyCFunction)PySocketSock_sendto, 0,
1255 sendto_doc},
1256 {"setblocking", (PyCFunction)PySocketSock_setblocking, 0,
1257 setblocking_doc},
1258 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 0,
1259 setsockopt_doc},
1260 {"shutdown", (PyCFunction)PySocketSock_shutdown, 0,
1261 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001262 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001263};
1264
Guido van Rossum30a685f1991-06-27 15:51:29 +00001265
Guido van Rossum73624e91994-10-10 17:59:00 +00001266/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001267 First close the file description. */
1268
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001269static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001270BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001271{
1272 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001273 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001274}
1275
Guido van Rossum30a685f1991-06-27 15:51:29 +00001276
1277/* Return a socket object's named attribute. */
1278
Guido van Rossum73624e91994-10-10 17:59:00 +00001279static PyObject *
1280BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001281{
Guido van Rossum73624e91994-10-10 17:59:00 +00001282 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001283}
1284
Guido van Rossum30a685f1991-06-27 15:51:29 +00001285
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001286static PyObject *
1287BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1288{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001289 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001290 sprintf(buf,
1291 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1292 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001293 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001294}
1295
1296
Guido van Rossumb6775db1994-08-01 11:34:53 +00001297/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001298
Guido van Rossum73624e91994-10-10 17:59:00 +00001299static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001300 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001301 0,
1302 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001303 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001304 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001305 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001306 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001307 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001308 0, /*tp_setattr*/
1309 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001310 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001311 0, /*tp_as_number*/
1312 0, /*tp_as_sequence*/
1313 0, /*tp_as_mapping*/
1314};
1315
Guido van Rossum30a685f1991-06-27 15:51:29 +00001316
Guido van Rossum81194471991-07-27 21:42:02 +00001317/* Python interface to gethostname(). */
1318
1319/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001320static PyObject *
1321BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001322{
1323 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001324 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001325 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +00001326 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001327 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001328 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001329 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001330 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001331 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001332 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001333 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001334}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001335
Guido van Rossum82a5c661998-07-07 20:45:43 +00001336static char gethostname_doc[] =
1337"gethostname() -> string\n\
1338\n\
1339Return the current host name.";
1340
Guido van Rossumff4949e1992-08-05 19:58:53 +00001341
Guido van Rossum30a685f1991-06-27 15:51:29 +00001342/* Python interface to gethostbyname(name). */
1343
1344/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001345static PyObject *
1346BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001347{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001348 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001349 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001350 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001351 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001352 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001353 return NULL;
1354 return makeipaddr(&addrbuf);
1355}
1356
Guido van Rossum82a5c661998-07-07 20:45:43 +00001357static char gethostbyname_doc[] =
1358"gethostbyname(host) -> address\n\
1359\n\
1360Return the IP address (a string of the form '255.255.255.255') for a host.";
1361
1362
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001363/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1364
1365static PyObject *
1366gethost_common(h, addr)
1367 struct hostent *h;
1368 struct sockaddr_in *addr;
1369{
1370 char **pch;
1371 PyObject *rtn_tuple = (PyObject *)NULL;
1372 PyObject *name_list = (PyObject *)NULL;
1373 PyObject *addr_list = (PyObject *)NULL;
1374 PyObject *tmp;
1375 if (h == NULL) {
1376#ifdef HAVE_HSTRERROR
1377 /* Let's get real error message to return */
1378 extern int h_errno;
1379 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1380#else
1381 PyErr_SetString(PySocket_Error, "host not found");
1382#endif
1383 return NULL;
1384 }
1385 if ((name_list = PyList_New(0)) == NULL)
1386 goto err;
1387 if ((addr_list = PyList_New(0)) == NULL)
1388 goto err;
1389 for (pch = h->h_aliases; *pch != NULL; pch++) {
1390 int status;
1391 tmp = PyString_FromString(*pch);
1392 if (tmp == NULL)
1393 goto err;
1394 status = PyList_Append(name_list, tmp);
1395 Py_DECREF(tmp);
1396 if (status)
1397 goto err;
1398 }
1399 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1400 int status;
1401 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1402 tmp = makeipaddr(addr);
1403 if (tmp == NULL)
1404 goto err;
1405 status = PyList_Append(addr_list, tmp);
1406 Py_DECREF(tmp);
1407 if (status)
1408 goto err;
1409 }
1410 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1411 err:
1412 Py_XDECREF(name_list);
1413 Py_XDECREF(addr_list);
1414 return rtn_tuple;
1415}
1416
1417
1418/* Python interface to gethostbyname_ex(name). */
1419
1420/*ARGSUSED*/
1421static PyObject *
1422BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1423{
1424 char *name;
1425 struct hostent *h;
1426 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001427 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001428#ifdef HAVE_GETHOSTBYNAME_R
1429 struct hostent hp_allocated;
1430 char buf[16384];
1431 int buf_len = (sizeof buf) - 1;
1432 int errnop;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001433#ifdef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001434 int result;
1435#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001436#endif /* HAVE_GETHOSTBYNAME_R */
1437 if (!PyArg_Parse(args, "s", &name))
1438 return NULL;
1439 if (setipaddr(name, &addr) < 0)
1440 return NULL;
1441 Py_BEGIN_ALLOW_THREADS
1442#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum3baaa131999-03-22 21:44:51 +00001443#ifdef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001444 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
1445#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001446 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001447#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001448#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001449#ifdef USE_GETHOSTBYNAME_LOCK
1450 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001451#endif
1452 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001453#endif /* HAVE_GETHOSTBYNAME_R */
1454 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001455 ret = gethost_common(h, &addr);
1456#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001457 PyThread_release_lock(gethostbyname_lock);
1458#endif
1459 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001460}
1461
1462static char ghbn_ex_doc[] =
1463"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1464\n\
1465Return the true host name, a list of aliases, and a list of IP addresses,\n\
1466for a host. The host argument is a string giving a host name or IP number.";
1467
1468
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001469/* Python interface to gethostbyaddr(IP). */
1470
1471/*ARGSUSED*/
1472static PyObject *
1473BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1474{
1475 struct sockaddr_in addr;
1476 char *ip_num;
1477 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001478 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001479#ifdef HAVE_GETHOSTBYNAME_R
1480 struct hostent hp_allocated;
1481 char buf[16384];
1482 int buf_len = (sizeof buf) - 1;
1483 int errnop;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001484#ifdef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001485 int result;
1486#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001487#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001488
1489 if (!PyArg_Parse(args, "s", &ip_num))
1490 return NULL;
1491 if (setipaddr(ip_num, &addr) < 0)
1492 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001493 Py_BEGIN_ALLOW_THREADS
1494#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum3baaa131999-03-22 21:44:51 +00001495#ifdef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001496 result = gethostbyaddr_r((char *)&addr.sin_addr,
1497 sizeof(addr.sin_addr),
1498 AF_INET, &hp_allocated, buf, buf_len,
1499 &h, &errnop);
1500#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001501 h = gethostbyaddr_r((char *)&addr.sin_addr,
1502 sizeof(addr.sin_addr),
1503 AF_INET,
1504 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001505#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001506#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001507#ifdef USE_GETHOSTBYNAME_LOCK
1508 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001509#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001510 h = gethostbyaddr((char *)&addr.sin_addr,
1511 sizeof(addr.sin_addr),
1512 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001513#endif /* HAVE_GETHOSTBYNAME_R */
1514 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001515 ret = gethost_common(h, &addr);
1516#ifdef USE_GETHOSTBYNAME_LOCK
1517 PyThread_release_lock(gethostbyname_lock);
1518#endif
1519 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001520}
1521
Guido van Rossum82a5c661998-07-07 20:45:43 +00001522static char gethostbyaddr_doc[] =
1523"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1524\n\
1525Return the true host name, a list of aliases, and a list of IP addresses,\n\
1526for a host. The host argument is a string giving a host name or IP number.";
1527
Guido van Rossum30a685f1991-06-27 15:51:29 +00001528
1529/* Python interface to getservbyname(name).
1530 This only returns the port number, since the other info is already
1531 known or not useful (like the list of aliases). */
1532
1533/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001534static PyObject *
1535BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001536{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001537 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001538 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001539 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001540 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001541 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001542 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001543 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001544 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001545 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001546 return NULL;
1547 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001548 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001549}
1550
Guido van Rossum82a5c661998-07-07 20:45:43 +00001551static char getservbyname_doc[] =
1552"getservbyname(servicename, protocolname) -> integer\n\
1553\n\
1554Return a port number from a service name and protocol name.\n\
1555The protocol name should be 'tcp' or 'udp'.";
1556
Guido van Rossum30a685f1991-06-27 15:51:29 +00001557
Guido van Rossum3901d851996-12-19 16:35:04 +00001558/* Python interface to getprotobyname(name).
1559 This only returns the protocol number, since the other info is
1560 already known or not useful (like the list of aliases). */
1561
1562/*ARGSUSED*/
1563static PyObject *
1564BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1565{
1566 char *name;
1567 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001568#ifdef __BEOS__
1569/* Not available in BeOS yet. - [cjh] */
1570 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1571 return NULL;
1572#else
Guido van Rossum3901d851996-12-19 16:35:04 +00001573 if (!PyArg_Parse(args, "s", &name))
1574 return NULL;
1575 Py_BEGIN_ALLOW_THREADS
1576 sp = getprotobyname(name);
1577 Py_END_ALLOW_THREADS
1578 if (sp == NULL) {
1579 PyErr_SetString(PySocket_Error, "protocol not found");
1580 return NULL;
1581 }
1582 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001583#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001584}
1585
Guido van Rossum82a5c661998-07-07 20:45:43 +00001586static char getprotobyname_doc[] =
1587"getprotobyname(name) -> integer\n\
1588\n\
1589Return the protocol number for the named protocol. (Rarely used.)";
1590
Guido van Rossum3901d851996-12-19 16:35:04 +00001591
Guido van Rossum30a685f1991-06-27 15:51:29 +00001592/* Python interface to socket(family, type, proto).
1593 The third (protocol) argument is optional.
1594 Return a new socket object. */
1595
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001596/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001597static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001598BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001599{
Guido van Rossum73624e91994-10-10 17:59:00 +00001600 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001601#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001602 SOCKET fd;
1603#else
1604 int fd;
1605#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001606 int family, type, proto = 0;
1607 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1608 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001609 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001610 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001611 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001612#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001613 if (fd == INVALID_SOCKET)
1614#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001615 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001616#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001617 return PySocket_Err();
1618 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001619 /* If the object can't be created, don't forget to close the
1620 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001621 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001622 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001623 /* From now on, ignore SIGPIPE and let the error checking
1624 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001625#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001626 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001627#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001628 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001629}
1630
Guido van Rossum82a5c661998-07-07 20:45:43 +00001631static char socket_doc[] =
1632"socket(family, type[, proto]) -> socket object\n\
1633\n\
1634Open a socket of the given type. The family argument specifies the\n\
1635address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1636The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1637or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1638specifying the default protocol.";
1639
1640
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001641#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001642/* Create a socket object from a numeric file description.
1643 Useful e.g. if stdin is a socket.
1644 Additional arguments as for socket(). */
1645
1646/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001647static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001648BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001649{
Guido van Rossum73624e91994-10-10 17:59:00 +00001650 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001651 int fd, family, type, proto = 0;
1652 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1653 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001654 /* Dup the fd so it and the socket can be closed independently */
1655 fd = dup(fd);
1656 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001657 return PySocket_Err();
1658 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001659 /* From now on, ignore SIGPIPE and let the error checking
1660 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001661#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001662 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001663#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001664 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001665}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001666
1667static char fromfd_doc[] =
1668"fromfd(fd, family, type[, proto]) -> socket object\n\
1669\n\
1670Create a socket object from the given file descriptor.\n\
1671The remaining arguments are the same as for socket().";
1672
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001673#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001674
Guido van Rossum82a5c661998-07-07 20:45:43 +00001675
Guido van Rossum006bf911996-06-12 04:04:55 +00001676static PyObject *
1677BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1678{
1679 int x1, x2;
1680
1681 if (!PyArg_Parse(args, "i", &x1)) {
1682 return NULL;
1683 }
1684 x2 = (int)ntohs((short)x1);
1685 return PyInt_FromLong(x2);
1686}
1687
Guido van Rossum82a5c661998-07-07 20:45:43 +00001688static char ntohs_doc[] =
1689"ntohs(integer) -> integer\n\
1690\n\
1691Convert a 16-bit integer from network to host byte order.";
1692
1693
Guido van Rossum006bf911996-06-12 04:04:55 +00001694static PyObject *
1695BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1696{
1697 int x1, x2;
1698
1699 if (!PyArg_Parse(args, "i", &x1)) {
1700 return NULL;
1701 }
1702 x2 = ntohl(x1);
1703 return PyInt_FromLong(x2);
1704}
1705
Guido van Rossum82a5c661998-07-07 20:45:43 +00001706static char ntohl_doc[] =
1707"ntohl(integer) -> integer\n\
1708\n\
1709Convert a 32-bit integer from network to host byte order.";
1710
1711
Guido van Rossum006bf911996-06-12 04:04:55 +00001712static PyObject *
1713BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1714{
1715 int x1, x2;
1716
1717 if (!PyArg_Parse(args, "i", &x1)) {
1718 return NULL;
1719 }
1720 x2 = (int)htons((short)x1);
1721 return PyInt_FromLong(x2);
1722}
1723
Guido van Rossum82a5c661998-07-07 20:45:43 +00001724static char htons_doc[] =
1725"htons(integer) -> integer\n\
1726\n\
1727Convert a 16-bit integer from host to network byte order.";
1728
1729
Guido van Rossum006bf911996-06-12 04:04:55 +00001730static PyObject *
1731BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1732{
1733 int x1, x2;
1734
1735 if (!PyArg_Parse(args, "i", &x1)) {
1736 return NULL;
1737 }
1738 x2 = htonl(x1);
1739 return PyInt_FromLong(x2);
1740}
1741
Guido van Rossum82a5c661998-07-07 20:45:43 +00001742static char htonl_doc[] =
1743"htonl(integer) -> integer\n\
1744\n\
1745Convert a 32-bit integer from host to network byte order.";
1746
1747
Guido van Rossum30a685f1991-06-27 15:51:29 +00001748/* List of functions exported by this module. */
1749
Guido van Rossum73624e91994-10-10 17:59:00 +00001750static PyMethodDef PySocket_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001751 {"gethostbyname", PySocket_gethostbyname, 0, gethostbyname_doc},
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001752 {"gethostbyname_ex", PySocket_gethostbyname_ex, 0, ghbn_ex_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00001753 {"gethostbyaddr", PySocket_gethostbyaddr, 0, gethostbyaddr_doc},
1754 {"gethostname", PySocket_gethostname, 0, gethostname_doc},
1755 {"getservbyname", PySocket_getservbyname, 0, getservbyname_doc},
1756 {"getprotobyname", PySocket_getprotobyname, 0,getprotobyname_doc},
1757 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001758#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001759 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001760#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001761 {"ntohs", PySocket_ntohs, 0, ntohs_doc},
1762 {"ntohl", PySocket_ntohl, 0, ntohl_doc},
1763 {"htons", PySocket_htons, 0, htons_doc},
1764 {"htonl", PySocket_htonl, 0, htonl_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001765 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001766};
1767
Guido van Rossum30a685f1991-06-27 15:51:29 +00001768
1769/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00001770 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001771 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00001772 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001773static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001774BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001775{
Guido van Rossum73624e91994-10-10 17:59:00 +00001776 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00001777 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001778 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00001779
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001780 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001781}
1782
Guido van Rossum30a685f1991-06-27 15:51:29 +00001783
Guido van Rossum8d665e61996-06-26 18:22:49 +00001784#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001785
1786/* Additional initialization and cleanup for NT/Windows */
1787
1788static void
1789NTcleanup()
1790{
1791 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001792}
1793
1794static int
1795NTinit()
1796{
1797 WSADATA WSAData;
1798 int ret;
1799 char buf[100];
1800 ret = WSAStartup(0x0101, &WSAData);
1801 switch (ret) {
1802 case 0: /* no error */
1803 atexit(NTcleanup);
1804 return 1;
1805 case WSASYSNOTREADY:
1806 PyErr_SetString(PyExc_ImportError,
1807 "WSAStartup failed: network not ready");
1808 break;
1809 case WSAVERNOTSUPPORTED:
1810 case WSAEINVAL:
1811 PyErr_SetString(PyExc_ImportError,
1812 "WSAStartup failed: requested version not supported");
1813 break;
1814 default:
1815 sprintf(buf, "WSAStartup failed: error code %d", ret);
1816 PyErr_SetString(PyExc_ImportError, buf);
1817 break;
1818 }
1819 return 0;
1820}
1821
Guido van Rossum8d665e61996-06-26 18:22:49 +00001822#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00001823
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001824#if defined(PYOS_OS2)
1825
1826/* Additional initialization and cleanup for OS/2 */
1827
1828static void
1829OS2cleanup()
1830{
1831 /* No cleanup is necessary for OS/2 Sockets */
1832}
1833
1834static int
1835OS2init()
1836{
1837 char reason[64];
1838 int rc = sock_init();
1839
1840 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00001841 atexit(OS2cleanup);
1842 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001843 }
1844
1845 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
1846 PyErr_SetString(PyExc_ImportError, reason);
1847
Guido van Rossum32c575d1997-12-02 20:37:32 +00001848 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001849}
1850
1851#endif /* PYOS_OS2 */
1852
Guido van Rossumbe32c891996-06-20 16:25:29 +00001853
Guido van Rossum30a685f1991-06-27 15:51:29 +00001854/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001855 * This is called when the first 'import socket' is done,
1856 * via a table in config.c, if config.c is compiled with USE_SOCKET
1857 * defined.
1858 *
1859 * For MS_WINDOWS (which means any Windows variant), this module
1860 * is actually called "_socket", and there's a wrapper "socket.py"
1861 * which implements some missing functionality (such as makefile(),
1862 * dup() and fromfd()). The import of "_socket" may fail with an
1863 * ImportError exception if initialization of WINSOCK fails. When
1864 * WINSOCK is initialized succesfully, a call to WSACleanup() is
1865 * scheduled to be made at exit time.
1866 *
1867 * For OS/2, this module is also called "_socket" and uses a wrapper
1868 * "socket.py" which implements that functionality that is missing
1869 * when PC operating systems don't put socket descriptors in the
1870 * operating system's filesystem layer.
1871 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001872
Guido van Rossum82a5c661998-07-07 20:45:43 +00001873static char module_doc[] =
1874"This module provides socket operations and some related functions.\n\
1875On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
1876On other systems, it only supports IP.\n\
1877\n\
1878Functions:\n\
1879\n\
1880socket() -- create a new socket object\n\
1881fromfd() -- create a socket object from an open file descriptor (*)\n\
1882gethostname() -- return the current hostname\n\
1883gethostbyname() -- map a hostname to its IP number\n\
1884gethostbyaddr() -- map an IP number or hostname to DNS info\n\
1885getservbyname() -- map a service name and a protocol name to a port number\n\
1886getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
1887ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
1888htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
1889\n\
1890(*) not available on all platforms!)\n\
1891\n\
1892Special objects:\n\
1893\n\
1894SocketType -- type object for socket objects\n\
1895error -- exception raised for I/O errors\n\
1896\n\
1897Integer constants:\n\
1898\n\
1899AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
1900SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
1901\n\
1902Many other constants may be defined; these may be used in calls to\n\
1903the setsockopt() and getsockopt() methods.\n\
1904";
1905
1906static char sockettype_doc[] =
1907"A socket represents one endpoint of a network connection.\n\
1908\n\
1909Methods:\n\
1910\n\
1911accept() -- accept a connection, returning new socket and client address\n\
1912bind() -- bind the socket to a local address\n\
1913close() -- close the socket\n\
1914connect() -- connect the socket to a remote address\n\
1915connect_ex() -- connect, return an error code instead of an exception \n\
1916dup() -- return a new socket object identical to the current one (*)\n\
1917fileno() -- return underlying file descriptor\n\
1918getpeername() -- return remote address (*)\n\
1919getsockname() -- return local address\n\
1920getsockopt() -- get socket options\n\
1921listen() -- start listening for incoming connections\n\
1922makefile() -- return a file object corresponding tot the socket (*)\n\
1923recv() -- receive data\n\
1924recvfrom() -- receive data and sender's address\n\
1925send() -- send data\n\
1926sendto() -- send data to a given address\n\
1927setblocking() -- set or clear the blocking I/O flag\n\
1928setsockopt() -- set socket options\n\
1929shutdown() -- shut down traffic in one or both directions\n\
1930\n\
1931(*) not available on all platforms!)";
1932
Guido van Rossum3886bb61998-12-04 18:50:17 +00001933DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00001934#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001935init_socket()
1936#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001937initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00001938#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001939{
Guido van Rossum73624e91994-10-10 17:59:00 +00001940 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001941#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001942 if (!NTinit())
1943 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001944 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001945#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00001946#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001947 if (!OS2init())
1948 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001949 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00001950#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00001951#if defined(__BEOS__)
1952 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
1953#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001954 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001955#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00001956#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001957#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001958 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001959 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
1960 if (PySocket_Error == NULL)
1961 return;
1962 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001963 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001964 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001965 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00001966 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001967 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001968 return;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001969 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001970#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001971 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001972#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001973 insint(d, "SOCK_STREAM", SOCK_STREAM);
1974 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001975#ifndef __BEOS__
1976/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001977 insint(d, "SOCK_RAW", SOCK_RAW);
1978 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1979 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001980#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001981
1982#ifdef SO_DEBUG
1983 insint(d, "SO_DEBUG", SO_DEBUG);
1984#endif
1985#ifdef SO_ACCEPTCONN
1986 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1987#endif
1988#ifdef SO_REUSEADDR
1989 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1990#endif
1991#ifdef SO_KEEPALIVE
1992 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1993#endif
1994#ifdef SO_DONTROUTE
1995 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1996#endif
1997#ifdef SO_BROADCAST
1998 insint(d, "SO_BROADCAST", SO_BROADCAST);
1999#endif
2000#ifdef SO_USELOOPBACK
2001 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2002#endif
2003#ifdef SO_LINGER
2004 insint(d, "SO_LINGER", SO_LINGER);
2005#endif
2006#ifdef SO_OOBINLINE
2007 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2008#endif
2009#ifdef SO_REUSEPORT
2010 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2011#endif
2012
2013#ifdef SO_SNDBUF
2014 insint(d, "SO_SNDBUF", SO_SNDBUF);
2015#endif
2016#ifdef SO_RCVBUF
2017 insint(d, "SO_RCVBUF", SO_RCVBUF);
2018#endif
2019#ifdef SO_SNDLOWAT
2020 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2021#endif
2022#ifdef SO_RCVLOWAT
2023 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2024#endif
2025#ifdef SO_SNDTIMEO
2026 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2027#endif
2028#ifdef SO_RCVTIMEO
2029 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2030#endif
2031#ifdef SO_ERROR
2032 insint(d, "SO_ERROR", SO_ERROR);
2033#endif
2034#ifdef SO_TYPE
2035 insint(d, "SO_TYPE", SO_TYPE);
2036#endif
2037
2038 /* Maximum number of connections for "listen" */
2039#ifdef SOMAXCONN
2040 insint(d, "SOMAXCONN", SOMAXCONN);
2041#else
2042 insint(d, "SOMAXCONN", 5); /* Common value */
2043#endif
2044
2045 /* Flags for send, recv */
2046#ifdef MSG_OOB
2047 insint(d, "MSG_OOB", MSG_OOB);
2048#endif
2049#ifdef MSG_PEEK
2050 insint(d, "MSG_PEEK", MSG_PEEK);
2051#endif
2052#ifdef MSG_DONTROUTE
2053 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2054#endif
2055#ifdef MSG_EOR
2056 insint(d, "MSG_EOR", MSG_EOR);
2057#endif
2058#ifdef MSG_TRUNC
2059 insint(d, "MSG_TRUNC", MSG_TRUNC);
2060#endif
2061#ifdef MSG_CTRUNC
2062 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2063#endif
2064#ifdef MSG_WAITALL
2065 insint(d, "MSG_WAITALL", MSG_WAITALL);
2066#endif
2067#ifdef MSG_BTAG
2068 insint(d, "MSG_BTAG", MSG_BTAG);
2069#endif
2070#ifdef MSG_ETAG
2071 insint(d, "MSG_ETAG", MSG_ETAG);
2072#endif
2073
2074 /* Protocol level and numbers, usable for [gs]etsockopt */
Guido van Rossum578de301998-05-28 20:18:18 +00002075/* Sigh -- some systems (e.g. Linux) use enums for these. */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002076#ifdef SOL_SOCKET
2077 insint(d, "SOL_SOCKET", SOL_SOCKET);
2078#endif
2079#ifdef IPPROTO_IP
2080 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002081#else
2082 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002083#endif
2084#ifdef IPPROTO_ICMP
2085 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002086#else
2087 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002088#endif
2089#ifdef IPPROTO_IGMP
2090 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2091#endif
2092#ifdef IPPROTO_GGP
2093 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2094#endif
2095#ifdef IPPROTO_TCP
2096 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002097#else
2098 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002099#endif
2100#ifdef IPPROTO_EGP
2101 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2102#endif
2103#ifdef IPPROTO_PUP
2104 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2105#endif
2106#ifdef IPPROTO_UDP
2107 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002108#else
2109 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002110#endif
2111#ifdef IPPROTO_IDP
2112 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2113#endif
2114#ifdef IPPROTO_HELLO
2115 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2116#endif
2117#ifdef IPPROTO_ND
2118 insint(d, "IPPROTO_ND", IPPROTO_ND);
2119#endif
2120#ifdef IPPROTO_TP
2121 insint(d, "IPPROTO_TP", IPPROTO_TP);
2122#endif
2123#ifdef IPPROTO_XTP
2124 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2125#endif
2126#ifdef IPPROTO_EON
2127 insint(d, "IPPROTO_EON", IPPROTO_EON);
2128#endif
2129#ifdef IPPROTO_BIP
2130 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2131#endif
2132/**/
2133#ifdef IPPROTO_RAW
2134 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002135#else
2136 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002137#endif
2138#ifdef IPPROTO_MAX
2139 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2140#endif
2141
2142 /* Some port configuration */
2143#ifdef IPPORT_RESERVED
2144 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2145#else
2146 insint(d, "IPPORT_RESERVED", 1024);
2147#endif
2148#ifdef IPPORT_USERRESERVED
2149 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2150#else
2151 insint(d, "IPPORT_USERRESERVED", 5000);
2152#endif
2153
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002154 /* Some reserved IP v.4 addresses */
2155#ifdef INADDR_ANY
2156 insint(d, "INADDR_ANY", INADDR_ANY);
2157#else
2158 insint(d, "INADDR_ANY", 0x00000000);
2159#endif
2160#ifdef INADDR_BROADCAST
2161 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2162#else
2163 insint(d, "INADDR_BROADCAST", 0xffffffff);
2164#endif
2165#ifdef INADDR_LOOPBACK
2166 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2167#else
2168 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2169#endif
2170#ifdef INADDR_UNSPEC_GROUP
2171 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2172#else
2173 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2174#endif
2175#ifdef INADDR_ALLHOSTS_GROUP
2176 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2177#else
2178 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2179#endif
2180#ifdef INADDR_MAX_LOCAL_GROUP
2181 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2182#else
2183 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2184#endif
2185#ifdef INADDR_NONE
2186 insint(d, "INADDR_NONE", INADDR_NONE);
2187#else
2188 insint(d, "INADDR_NONE", 0xffffffff);
2189#endif
2190
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002191 /* IP [gs]etsockopt options */
2192#ifdef IP_OPTIONS
2193 insint(d, "IP_OPTIONS", IP_OPTIONS);
2194#endif
2195#ifdef IP_HDRINCL
2196 insint(d, "IP_HDRINCL", IP_HDRINCL);
2197#endif
2198#ifdef IP_TOS
2199 insint(d, "IP_TOS", IP_TOS);
2200#endif
2201#ifdef IP_TTL
2202 insint(d, "IP_TTL", IP_TTL);
2203#endif
2204#ifdef IP_RECVOPTS
2205 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2206#endif
2207#ifdef IP_RECVRETOPTS
2208 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2209#endif
2210#ifdef IP_RECVDSTADDR
2211 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2212#endif
2213#ifdef IP_RETOPTS
2214 insint(d, "IP_RETOPTS", IP_RETOPTS);
2215#endif
2216#ifdef IP_MULTICAST_IF
2217 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2218#endif
2219#ifdef IP_MULTICAST_TTL
2220 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2221#endif
2222#ifdef IP_MULTICAST_LOOP
2223 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2224#endif
2225#ifdef IP_ADD_MEMBERSHIP
2226 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2227#endif
2228#ifdef IP_DROP_MEMBERSHIP
2229 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2230#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002231
2232 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002233#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002234 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002235#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002236}