blob: 4507eaa913f962e7dbf3ebec70c7f7a265d09e8a [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum6574b3e1991-06-25 21:36:08 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum6574b3e1991-06-25 21:36:08 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000029
30******************************************************************/
31
32/* Socket module */
33
34/*
35This module provides an interface to Berkeley socket IPC.
36
37Limitations:
38
Guido van Rossum30a685f1991-06-27 15:51:29 +000039- only AF_INET and AF_UNIX address families are supported
Guido van Rossum81194471991-07-27 21:42:02 +000040- no read/write operations (use send/recv or makefile instead)
Guido van Rossumbe32c891996-06-20 16:25:29 +000041- additional restrictions apply on Windows
Guido van Rossum6574b3e1991-06-25 21:36:08 +000042
Guido van Rossum27e177d1995-03-16 15:43:47 +000043Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000044
Guido van Rossum27e177d1995-03-16 15:43:47 +000045- socket.error: exception raised for socket specific errors
Guido van Rossum30a685f1991-06-27 15:51:29 +000046- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000047- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000048- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000049- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000050- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000051- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000052- socket.ntohs(16 bit value) --> new int object
53- socket.ntohl(32 bit value) --> new int object
54- socket.htons(16 bit value) --> new int object
55- socket.htonl(32 bit value) --> new int object
Guido van Rossum27e177d1995-03-16 15:43:47 +000056- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000057- an Internet socket address is a pair (hostname, port)
58 where hostname can be anything recognized by gethostbyname()
59 (including the dd.dd.dd.dd notation) and port is in host byte order
60- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000061- a UNIX domain socket address is a string specifying the pathname
Guido van Rossum6574b3e1991-06-25 21:36:08 +000062
Guido van Rossum30a685f1991-06-27 15:51:29 +000063Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000064
Guido van Rossum81194471991-07-27 21:42:02 +000065- s.accept() --> new socket object, sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000066- s.bind(sockaddr) --> None
67- s.close() --> None
68- s.connect(sockaddr) --> None
Guido van Rossumfc4255d1997-11-19 18:57:13 +000069- s.connect_ex(sockaddr) --> 0 or errno (handy for e.g. async connect)
Guido van Rossum27e177d1995-03-16 15:43:47 +000070- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000071- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000072- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000073- s.getsockname() --> sockaddr
74- s.getsockopt(level, optname[, buflen]) --> int or string
75- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000076- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000077- s.recv(buflen [,flags]) --> string
78- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000079- s.send(string [,flags]) --> nbytes
80- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000081- s.setblocking(0 | 1) --> None
82- s.setsockopt(level, optname, value) --> None
83- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000084- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000085
Guido van Rossum6574b3e1991-06-25 21:36:08 +000086*/
87
Guido van Rossum73624e91994-10-10 17:59:00 +000088#include "Python.h"
Guido van Rossum3baaa131999-03-22 21:44:51 +000089
Guido van Rossume7de2061999-03-24 17:24:33 +000090#undef HAVE_GETHOSTBYNAME_R_3_ARG
91#undef HAVE_GETHOSTBYNAME_R_5_ARG
92#undef HAVE_GETHOSTBYNAME_R_6_ARG
93
Guido van Rossum7a122991999-04-13 04:07:32 +000094#ifndef WITH_THREAD
95#undef HAVE_GETHOSTBYNAME_R
96#endif
97
Guido van Rossume7de2061999-03-24 17:24:33 +000098#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +000099#if defined(_AIX) || defined(__osf__)
Guido van Rossume7de2061999-03-24 17:24:33 +0000100#define HAVE_GETHOSTBYNAME_R_3_ARG
101#elif defined(__sun__) || defined(__sgi)
102#define HAVE_GETHOSTBYNAME_R_5_ARG
103#elif defined(linux)
104#define HAVE_GETHOSTBYNAME_R_6_ARG
105#else
106#undef HAVE_GETHOSTBYNAME_R
107#endif
108#endif
109
Guido van Rossum3baaa131999-03-22 21:44:51 +0000110#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
111#define USE_GETHOSTBYNAME_LOCK
112#endif
113
114#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum49b56061998-10-01 20:42:43 +0000115#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000116#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000117
Guido van Rossuma376cc51996-12-05 23:43:35 +0000118#ifdef HAVE_UNISTD_H
119#include <unistd.h>
120#endif
121
Guido van Rossumbcc20741998-08-04 22:53:56 +0000122#if !defined(MS_WINDOWS) && !defined(PYOS_OS2) && !defined(__BEOS__)
Guido van Rossumfb4130d1996-12-10 15:17:08 +0000123extern int gethostname(); /* For Solaris, at least */
124#endif
125
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000126#if defined(PYCC_VACPP)
127#include <types.h>
128#include <io.h>
129#include <sys/ioctl.h>
130#include <utils.h>
131#include <ctype.h>
132#endif
133
134#if defined(PYOS_OS2)
135#define INCL_DOS
136#define INCL_DOSERRORS
137#define INCL_NOPMAPI
138#include <os2.h>
139#endif
140
Guido van Rossumbcc20741998-08-04 22:53:56 +0000141#if defined(__BEOS__)
142/* It's in the libs, but not the headers... - [cjh] */
143int shutdown( int, int );
144#endif
145
Guido van Rossumb6775db1994-08-01 11:34:53 +0000146#include <sys/types.h>
147#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +0000148
Guido van Rossum81194471991-07-27 21:42:02 +0000149#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000150#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000151#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000152#include <sys/socket.h>
153#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +0000154#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000155#else
156#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000157#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000158#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000159#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000160#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000161#else
162#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000163#endif
164
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000165#ifndef O_NDELAY
166#define O_NDELAY O_NONBLOCK /* For QNX only? */
167#endif
168
Jack Jansen508537b1996-02-14 15:57:45 +0000169#ifdef USE_GUSI
170/* fdopen() isn't declared in stdio.h (sigh) */
171#include <GUSI.h>
172#endif
173
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000174
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000175/* Here we have some hacks to choose between K&R or ANSI style function
176 definitions. For NT to build this as an extension module (ie, DLL)
177 it must be compiled by the C++ compiler, as it takes the address of
178 a static data item exported from the main Python DLL.
179*/
Guido van Rossumbcc20741998-08-04 22:53:56 +0000180#if defined(MS_WINDOWS) || defined(__BEOS__)
181/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000182/* seem to be a few differences in the API */
183#define close closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000184#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000185#define FORCE_ANSI_FUNC_DEFS
186#endif
187
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000188#if defined(PYOS_OS2)
189#define close soclose
190#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
191#define FORCE_ANSI_FUNC_DEFS
192#endif
193
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000194#ifdef FORCE_ANSI_FUNC_DEFS
195#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
196fnname( arg1type arg1name )
197
198#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
199fnname( arg1type arg1name, arg2type arg2name )
200
201#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
202fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
203
204#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
205fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
206
207#else /* !FORCE_ANSI_FN_DEFS */
208#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
209fnname( arg1name ) \
210 arg1type arg1name;
211
212#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
213fnname( arg1name, arg2name ) \
214 arg1type arg1name; \
215 arg2type arg2name;
216
217#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
218fnname( arg1name, arg2name, arg3name ) \
219 arg1type arg1name; \
220 arg2type arg2name; \
221 arg3type arg3name;
222
223#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
224fnname( arg1name, arg2name, arg3name, arg4name ) \
225 arg1type arg1name; \
226 arg2type arg2name; \
227 arg3type arg3name; \
228 arg4type arg4name;
229
230#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000231
232/* Global variable holding the exception type for errors detected
233 by this module (but not argument type or memory errors, etc.). */
234
Guido van Rossum73624e91994-10-10 17:59:00 +0000235static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000236
237
238/* Convenience function to raise an error according to errno
239 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000240
Guido van Rossum73624e91994-10-10 17:59:00 +0000241static PyObject *
242PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000243{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000244#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000245 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000246 PyObject *v;
247 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000248 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000249 PyErr_SetObject(PySocket_Error, v);
250 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000251 }
252 return NULL;
253 }
254 else
255#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000256
257#if defined(PYOS_OS2)
258 if (sock_errno() != NO_ERROR) {
259 APIRET rc;
260 ULONG msglen;
261 char outbuf[100];
262 int myerrorcode = sock_errno();
263
264 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
265 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
266 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
267 if (rc == NO_ERROR) {
268 PyObject *v;
269
270 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
271 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
272 char *lastc = &outbuf[ strlen(outbuf)-1 ];
273 while (lastc > outbuf && isspace(*lastc))
274 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
275 }
276 v = Py_BuildValue("(is)", myerrorcode, outbuf);
277 if (v != NULL) {
278 PyErr_SetObject(PySocket_Error, v);
279 Py_DECREF(v);
280 }
281 return NULL;
282 }
283 }
284#endif
285
Guido van Rossum73624e91994-10-10 17:59:00 +0000286 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000287}
288
Guido van Rossum30a685f1991-06-27 15:51:29 +0000289
290/* The object holding a socket. It holds some extra information,
291 like the address family, which is used to decode socket address
292 arguments properly. */
293
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000294typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000295 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000296 int sock_fd; /* Socket file descriptor */
297 int sock_family; /* Address family, e.g., AF_INET */
298 int sock_type; /* Socket type, e.g., SOCK_STREAM */
299 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000300 union sock_addr {
301 struct sockaddr_in in;
302#ifdef AF_UNIX
303 struct sockaddr_un un;
304#endif
305 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000306} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000307
Guido van Rossum30a685f1991-06-27 15:51:29 +0000308
309/* A forward reference to the Socktype type object.
310 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000311 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000312 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000313
Guido van Rossum73624e91994-10-10 17:59:00 +0000314staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000315
Guido van Rossum30a685f1991-06-27 15:51:29 +0000316
317/* Create a new socket object.
318 This just creates the object and initializes it.
319 If the creation fails, return NULL and set an exception (implicit
320 in NEWOBJ()). */
321
Guido van Rossum73624e91994-10-10 17:59:00 +0000322static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000323BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000324{
Guido van Rossum73624e91994-10-10 17:59:00 +0000325 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000326 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000327 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000328 if (s != NULL) {
329 s->sock_fd = fd;
330 s->sock_family = family;
331 s->sock_type = type;
332 s->sock_proto = proto;
333 }
334 return s;
335}
336
Guido van Rossum30a685f1991-06-27 15:51:29 +0000337
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000338/* Lock to allow python interpreter to continue, but only allow one
339 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000340#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000341PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000342#endif
343
344
Guido van Rossum30a685f1991-06-27 15:51:29 +0000345/* Convert a string specifying a host name or one of a few symbolic
346 names to a numeric IP address. This usually calls gethostbyname()
347 to do the work; the names "" and "<broadcast>" are special.
348 Return the length (should always be 4 bytes), or negative if
349 an error occurred; then an exception is raised. */
350
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000351static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000352BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000353{
354 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000355 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000356 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000357 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000358#ifdef HAVE_GETHOSTBYNAME_R
359 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000360#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
361 struct hostent_data data;
362#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000363 char buf[1001];
364 int buf_len = (sizeof buf) - 1;
365 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000366#endif
367#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000368 int result;
369#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000370#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000371
Guido van Rossuma376cc51996-12-05 23:43:35 +0000372 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000373 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000374 addr_ret->sin_addr.s_addr = INADDR_ANY;
375 return 4;
376 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000377 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000378 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
379 return 4;
380 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000381 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
382 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
383 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
384 addr_ret->sin_addr.s_addr = htonl(
385 ((long) d1 << 24) | ((long) d2 << 16) |
386 ((long) d3 << 8) | ((long) d4 << 0));
387 return 4;
388 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000389 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000390#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000391#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000392 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000393#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000394 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000395#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000396 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000397 result = gethostbyname_r(name, &hp_allocated, &data);
398 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000399#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000400#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000401#ifdef USE_GETHOSTBYNAME_LOCK
402 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000403#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000404 hp = gethostbyname(name);
405#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000406 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000407
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000408 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000409#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000410 /* Let's get real error message to return */
411 extern int h_errno;
412 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
413#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000414 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000415#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000416#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000417 PyThread_release_lock(gethostbyname_lock);
418#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000419 return -1;
420 }
421 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000422 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000423#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000424 PyThread_release_lock(gethostbyname_lock);
425#endif
426 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000427}
428
Guido van Rossum30a685f1991-06-27 15:51:29 +0000429
Guido van Rossum30a685f1991-06-27 15:51:29 +0000430/* Create a string object representing an IP address.
431 This is always a string of the form 'dd.dd.dd.dd' (with variable
432 size numbers). */
433
Guido van Rossum73624e91994-10-10 17:59:00 +0000434static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000435BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000436{
437 long x = ntohl(addr->sin_addr.s_addr);
438 char buf[100];
439 sprintf(buf, "%d.%d.%d.%d",
440 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
441 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000442 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000443}
444
445
446/* Create an object representing the given socket address,
447 suitable for passing it back to bind(), connect() etc.
448 The family field of the sockaddr structure is inspected
449 to determine what kind of address it really is. */
450
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000451/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000452static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000453BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000454{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000455 if (addrlen == 0) {
456 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000457 Py_INCREF(Py_None);
458 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000459 }
460
Guido van Rossumbcc20741998-08-04 22:53:56 +0000461#ifdef __BEOS__
462 /* XXX: BeOS version of accept() doesn't set family coreectly */
463 addr->sa_family = AF_INET;
464#endif
465
Guido van Rossum30a685f1991-06-27 15:51:29 +0000466 switch (addr->sa_family) {
467
468 case AF_INET:
469 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000470 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000471 PyObject *addrobj = makeipaddr(a);
472 PyObject *ret = NULL;
473 if (addrobj) {
474 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
475 Py_DECREF(addrobj);
476 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000477 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000478 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000479
Guido van Rossumb6775db1994-08-01 11:34:53 +0000480#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000481 case AF_UNIX:
482 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000483 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000484 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000485 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000486#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000487
488 /* More cases here... */
489
490 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000491 /* If we don't know the address family, don't raise an
492 exception -- return it as a tuple. */
493 return Py_BuildValue("is#",
494 addr->sa_family,
495 addr->sa_data,
496 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000497
Guido van Rossum30a685f1991-06-27 15:51:29 +0000498 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000499}
500
Guido van Rossum30a685f1991-06-27 15:51:29 +0000501
502/* Parse a socket address argument according to the socket object's
503 address family. Return 1 if the address was in the proper format,
504 0 of not. The address is returned through addr_ret, its length
505 through len_ret. */
506
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000507static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000508BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000509getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000510{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000511 switch (s->sock_family) {
512
Guido van Rossumb6775db1994-08-01 11:34:53 +0000513#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000514 case AF_UNIX:
515 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000516 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000517 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000518 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000519 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000520 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000521 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000522 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000523 PyErr_SetString(PySocket_Error,
524 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000525 return 0;
526 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000527 addr->sun_family = AF_UNIX;
528 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000529 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000530 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000531 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000532 return 1;
533 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000534#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000535
Guido van Rossum30a685f1991-06-27 15:51:29 +0000536 case AF_INET:
537 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000538 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000539 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000540 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000541 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000542 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000543 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000544 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000545 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000546 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000547 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000548 *addr_ret = (struct sockaddr *) addr;
549 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000550 return 1;
551 }
552
Guido van Rossum30a685f1991-06-27 15:51:29 +0000553 /* More cases here... */
554
555 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000556 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000557 return 0;
558
559 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000560}
561
Guido van Rossum30a685f1991-06-27 15:51:29 +0000562
Guido van Rossum710e1df1992-06-12 10:39:36 +0000563/* Get the address length according to the socket object's address family.
564 Return 1 if the family is known, 0 otherwise. The length is returned
565 through len_ret. */
566
567static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000568BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000569{
570 switch (s->sock_family) {
571
Guido van Rossumb6775db1994-08-01 11:34:53 +0000572#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000573 case AF_UNIX:
574 {
575 *len_ret = sizeof (struct sockaddr_un);
576 return 1;
577 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000578#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000579
580 case AF_INET:
581 {
582 *len_ret = sizeof (struct sockaddr_in);
583 return 1;
584 }
585
586 /* More cases here... */
587
588 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000589 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000590 return 0;
591
592 }
593}
594
595
Guido van Rossum30a685f1991-06-27 15:51:29 +0000596/* s.accept() method */
597
Guido van Rossum73624e91994-10-10 17:59:00 +0000598static PyObject *
599BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000600{
601 char addrbuf[256];
602 int addrlen, newfd;
Barry Warsaw752300b1997-01-03 17:18:10 +0000603 PyObject *sock = NULL;
604 PyObject *addr = NULL;
605 PyObject *res = NULL;
606
Guido van Rossum73624e91994-10-10 17:59:00 +0000607 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000608 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000609 if (!getsockaddrlen(s, &addrlen))
610 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000611 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000612 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000613 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000614 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000615 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000616
Guido van Rossum30a685f1991-06-27 15:51:29 +0000617 /* Create the new object with unspecified family,
618 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000619 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000620 s->sock_family,
621 s->sock_type,
622 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000623 if (sock == NULL) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000624 close(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000625 goto finally;
626 }
627 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
628 goto finally;
629
630 if (!(res = Py_BuildValue("OO", sock, addr)))
631 goto finally;
632
633 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000634 Py_XDECREF(sock);
635 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000636 return res;
637}
638
Guido van Rossum82a5c661998-07-07 20:45:43 +0000639static char accept_doc[] =
640"accept() -> (socket object, address info)\n\
641\n\
642Wait for an incoming connection. Return a new socket representing the\n\
643connection, and the address of the client. For IP sockets, the address\n\
644info is a pair (hostaddr, port).";
645
Guido van Rossum30a685f1991-06-27 15:51:29 +0000646
Guido van Rossume4485b01994-09-07 14:32:49 +0000647/* s.setblocking(1 | 0) method */
648
Guido van Rossum73624e91994-10-10 17:59:00 +0000649static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000650BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000651{
652 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000653#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000654 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000655#endif
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000656 if (!PyArg_Parse(args, "i", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000657 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000658 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000659#ifdef __BEOS__
660 block = !block;
661 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
662 (void *)(&block), sizeof( int ) );
663#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000664#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000665#ifdef PYOS_OS2
666 block = !block;
667 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
668#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000669 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
670 if (block)
671 delay_flag &= (~O_NDELAY);
672 else
673 delay_flag |= O_NDELAY;
674 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000675#endif /* !PYOS_OS2 */
676#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000677 block = !block;
678 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000679#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000680#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000681 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000682
Guido van Rossum73624e91994-10-10 17:59:00 +0000683 Py_INCREF(Py_None);
684 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000685}
Guido van Rossume4485b01994-09-07 14:32:49 +0000686
Guido van Rossum82a5c661998-07-07 20:45:43 +0000687static char setblocking_doc[] =
688"setblocking(flag)\n\
689\n\
690Set the socket to blocking (flag is true) or non-blocking (false).\n\
691This uses the FIONBIO ioctl with the O_NDELAY flag.";
692
Guido van Rossume4485b01994-09-07 14:32:49 +0000693
Guido van Rossumaee08791992-09-08 09:05:33 +0000694/* s.setsockopt() method.
695 With an integer third argument, sets an integer option.
696 With a string third argument, sets an option from a buffer;
697 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000698
Guido van Rossum73624e91994-10-10 17:59:00 +0000699static PyObject *
700BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000701{
702 int level;
703 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000704 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000705 char *buf;
706 int buflen;
707 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000708
Guido van Rossum73624e91994-10-10 17:59:00 +0000709 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000710 buf = (char *) &flag;
711 buflen = sizeof flag;
712 }
713 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000714 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +0000715 if (!PyArg_Parse(args, "(iis#)", &level, &optname,
716 &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000717 return NULL;
718 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000719 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000720 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000721 return PySocket_Err();
722 Py_INCREF(Py_None);
723 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000724}
725
Guido van Rossum82a5c661998-07-07 20:45:43 +0000726static char setsockopt_doc[] =
727"setsockopt(level, option, value)\n\
728\n\
729Set a socket option. See the Unix manual for level and option.\n\
730The value argument can either be an integer or a string.";
731
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000732
Guido van Rossumaee08791992-09-08 09:05:33 +0000733/* s.getsockopt() method.
734 With two arguments, retrieves an integer option.
735 With a third integer argument, retrieves a string buffer of that size;
736 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000737
Guido van Rossum73624e91994-10-10 17:59:00 +0000738static PyObject *
739BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000740{
741 int level;
742 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000743 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000744 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000745 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000746
Guido van Rossumbcc20741998-08-04 22:53:56 +0000747#ifdef __BEOS__
748/* We have incomplete socket support. */
749 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
750 return NULL;
751#else
752
Guido van Rossumbe32c891996-06-20 16:25:29 +0000753 if (!PyArg_ParseTuple(args, "ii|i", &level, &optname, &buflen))
754 return NULL;
755
756 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000757 int flag = 0;
758 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000759 res = getsockopt(s->sock_fd, level, optname,
760 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000761 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000762 return PySocket_Err();
763 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000764 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000765 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000766 PyErr_SetString(PySocket_Error,
767 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000768 return NULL;
769 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000770 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000771 if (buf == NULL)
772 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000773 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000774 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000775 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000776 Py_DECREF(buf);
777 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000778 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000779 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000780 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000781#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000782}
783
Guido van Rossum82a5c661998-07-07 20:45:43 +0000784static char getsockopt_doc[] =
785"getsockopt(level, option[, buffersize]) -> value\n\
786\n\
787Get a socket option. See the Unix manual for level and option.\n\
788If a nonzero buffersize argument is given, the return value is a\n\
789string of that length; otherwise it is an integer.";
790
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000791
Guido van Rossum30a685f1991-06-27 15:51:29 +0000792/* s.bind(sockaddr) method */
793
Guido van Rossum73624e91994-10-10 17:59:00 +0000794static PyObject *
795BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000796{
797 struct sockaddr *addr;
798 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000799 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000800 if (!getsockaddrarg(s, args, &addr, &addrlen))
801 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000802 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000803 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000804 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000805 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000806 return PySocket_Err();
807 Py_INCREF(Py_None);
808 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000809}
810
Guido van Rossum82a5c661998-07-07 20:45:43 +0000811static char bind_doc[] =
812"bind(address)\n\
813\n\
814Bind the socket to a local address. For IP sockets, the address is a\n\
815pair (host, port); the host must refer to the local host.";
816
Guido van Rossum30a685f1991-06-27 15:51:29 +0000817
818/* s.close() method.
819 Set the file descriptor to -1 so operations tried subsequently
820 will surely fail. */
821
Guido van Rossum73624e91994-10-10 17:59:00 +0000822static PyObject *
823BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000824{
Guido van Rossum73624e91994-10-10 17:59:00 +0000825 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000826 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000827 if (s->sock_fd != -1) {
828 Py_BEGIN_ALLOW_THREADS
829 (void) close(s->sock_fd);
830 Py_END_ALLOW_THREADS
831 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000832 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000833 Py_INCREF(Py_None);
834 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000835}
836
Guido van Rossum82a5c661998-07-07 20:45:43 +0000837static char close_doc[] =
838"close()\n\
839\n\
840Close the socket. It cannot be used after this call.";
841
Guido van Rossum30a685f1991-06-27 15:51:29 +0000842
843/* s.connect(sockaddr) method */
844
Guido van Rossum73624e91994-10-10 17:59:00 +0000845static PyObject *
846BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000847{
848 struct sockaddr *addr;
849 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000850 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000851 if (!getsockaddrarg(s, args, &addr, &addrlen))
852 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000853 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000854 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000855 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000856 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000857 return PySocket_Err();
858 Py_INCREF(Py_None);
859 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000860}
861
Guido van Rossum82a5c661998-07-07 20:45:43 +0000862static char connect_doc[] =
863"connect(address)\n\
864\n\
865Connect the socket to a remote address. For IP sockets, the address\n\
866is a pair (host, port).";
867
Guido van Rossum30a685f1991-06-27 15:51:29 +0000868
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000869/* s.connect_ex(sockaddr) method */
870
871static PyObject *
872BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
873{
874 struct sockaddr *addr;
875 int addrlen;
876 int res;
877 if (!getsockaddrarg(s, args, &addr, &addrlen))
878 return NULL;
879 Py_BEGIN_ALLOW_THREADS
880 res = connect(s->sock_fd, addr, addrlen);
881 Py_END_ALLOW_THREADS
882 if (res != 0)
883 res = errno;
884 return PyInt_FromLong((long) res);
885}
886
Guido van Rossum82a5c661998-07-07 20:45:43 +0000887static char connect_ex_doc[] =
888"connect_ex(address)\n\
889\n\
890This is like connect(address), but returns an error code (the errno value)\n\
891instead of raising an exception when an error occurs.";
892
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000893
Guido van Rossumed233a51992-06-23 09:07:03 +0000894/* s.fileno() method */
895
Guido van Rossum73624e91994-10-10 17:59:00 +0000896static PyObject *
897BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000898{
Guido van Rossum73624e91994-10-10 17:59:00 +0000899 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000900 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000901 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000902}
903
Guido van Rossum82a5c661998-07-07 20:45:43 +0000904static char fileno_doc[] =
905"fileno() -> integer\n\
906\n\
907Return the integer file descriptor of the socket.";
908
Guido van Rossumed233a51992-06-23 09:07:03 +0000909
Guido van Rossumbe32c891996-06-20 16:25:29 +0000910#ifndef NO_DUP
911/* s.dup() method */
912
913static PyObject *
914BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
915{
916 int newfd;
917 PyObject *sock;
918 if (!PyArg_NoArgs(args))
919 return NULL;
920 newfd = dup(s->sock_fd);
921 if (newfd < 0)
922 return PySocket_Err();
923 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000924 s->sock_family,
925 s->sock_type,
926 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000927 if (sock == NULL)
928 close(newfd);
929 return sock;
930}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000931
932static char dup_doc[] =
933"dup() -> socket object\n\
934\n\
935Return a new socket object connected to the same system resource.";
936
Guido van Rossumbe32c891996-06-20 16:25:29 +0000937#endif
938
939
Guido van Rossumc89705d1992-11-26 08:54:07 +0000940/* s.getsockname() method */
941
Guido van Rossum73624e91994-10-10 17:59:00 +0000942static PyObject *
943BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000944{
945 char addrbuf[256];
946 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000947 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000948 return NULL;
949 if (!getsockaddrlen(s, &addrlen))
950 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000951 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000952 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000953 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000954 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000955 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000956 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000957 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
958}
959
Guido van Rossum82a5c661998-07-07 20:45:43 +0000960static char getsockname_doc[] =
961"getsockname() -> address info\n\
962\n\
963Return the address of the local endpoint. For IP sockets, the address\n\
964info is a pair (hostaddr, port).";
965
Guido van Rossumc89705d1992-11-26 08:54:07 +0000966
Guido van Rossumb6775db1994-08-01 11:34:53 +0000967#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000968/* s.getpeername() method */
969
Guido van Rossum73624e91994-10-10 17:59:00 +0000970static PyObject *
971BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000972{
973 char addrbuf[256];
974 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000975 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000976 return NULL;
977 if (!getsockaddrlen(s, &addrlen))
978 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000979 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000980 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000981 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000982 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000983 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000984 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
985}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000986
987static char getpeername_doc[] =
988"getpeername() -> address info\n\
989\n\
990Return the address of the remote endpoint. For IP sockets, the address\n\
991info is a pair (hostaddr, port).";
992
Guido van Rossumb6775db1994-08-01 11:34:53 +0000993#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000994
995
Guido van Rossum30a685f1991-06-27 15:51:29 +0000996/* s.listen(n) method */
997
Guido van Rossum73624e91994-10-10 17:59:00 +0000998static PyObject *
999BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001000{
1001 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001002 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +00001003 if (!PyArg_Parse(args, "i", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001004 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001005 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001006 if (backlog < 1)
1007 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001008 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001009 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001010 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001011 return PySocket_Err();
1012 Py_INCREF(Py_None);
1013 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001014}
1015
Guido van Rossum82a5c661998-07-07 20:45:43 +00001016static char listen_doc[] =
1017"listen(backlog)\n\
1018\n\
1019Enable a server to accept connections. The backlog argument must be at\n\
1020least 1; it specifies the number of unaccepted connection that the system\n\
1021will allow before refusing new connections.";
1022
1023
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001024#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001025/* s.makefile(mode) method.
1026 Create a new open file object referring to a dupped version of
1027 the socket's file descriptor. (The dup() call is necessary so
1028 that the open file and socket objects may be closed independent
1029 of each other.)
1030 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1031
Guido van Rossum73624e91994-10-10 17:59:00 +00001032static PyObject *
1033BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001034{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001035 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +00001036 char *mode = "r";
1037 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001038 int fd;
1039 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001040 PyObject *f;
1041
1042 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001043 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001044#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001045 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1046 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001047#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001048 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001049#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001050 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001051 if (fd >= 0)
1052 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001053 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001054 }
1055 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1056 if (f != NULL)
1057 PyFile_SetBufSize(f, bufsize);
1058 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001059}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001060
1061static char makefile_doc[] =
1062"makefile([mode[, buffersize]]) -> file object\n\
1063\n\
1064Return a regular file object corresponding to the socket.\n\
1065The mode and buffersize arguments are as for the built-in open() function.";
1066
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001067#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001068
Guido van Rossum82a5c661998-07-07 20:45:43 +00001069
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001070/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001071
Guido van Rossum73624e91994-10-10 17:59:00 +00001072static PyObject *
1073BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001074{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001075 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001076 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001077 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1078 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001079 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001080 if (buf == NULL)
1081 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001082 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001083 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001084 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001085 if (n < 0) {
1086 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001087 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001088 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001089 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001090 return NULL;
1091 return buf;
1092}
1093
Guido van Rossum82a5c661998-07-07 20:45:43 +00001094static char recv_doc[] =
1095"recv(buffersize[, flags]) -> data\n\
1096\n\
1097Receive up to buffersize bytes from the socket. For the optional flags\n\
1098argument, see the Unix manual. When no data is available, block until\n\
1099at least one byte is available or until the remote end is closed. When\n\
1100the remote end is closed and all data is read, return the empty string.";
1101
Guido van Rossum30a685f1991-06-27 15:51:29 +00001102
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001103/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001104
Guido van Rossum73624e91994-10-10 17:59:00 +00001105static PyObject *
1106BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001107{
1108 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001109 PyObject *buf = NULL;
1110 PyObject *addr = NULL;
1111 PyObject *ret = NULL;
1112
Guido van Rossumbe32c891996-06-20 16:25:29 +00001113 int addrlen, len, n, flags = 0;
1114 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1115 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001116 if (!getsockaddrlen(s, &addrlen))
1117 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001118 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001119 if (buf == NULL)
1120 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001121 Py_BEGIN_ALLOW_THREADS
1122 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001123#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001124#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001125 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001126#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001127 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001128#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001129#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001130 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001131#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001132 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001133 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001134 if (n < 0) {
1135 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001136 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001137 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001138 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001139 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001140
1141 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1142 goto finally;
1143
Guido van Rossum73624e91994-10-10 17:59:00 +00001144 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001145 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001146 Py_XDECREF(addr);
1147 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001148 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001149}
1150
Guido van Rossum82a5c661998-07-07 20:45:43 +00001151static char recvfrom_doc[] =
1152"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1153\n\
1154Like recv(buffersize, flags) but also return the sender's address info.";
1155
Guido van Rossum30a685f1991-06-27 15:51:29 +00001156
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001157/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001158
Guido van Rossum73624e91994-10-10 17:59:00 +00001159static PyObject *
1160BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001161{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001162 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001163 int len, n, flags = 0;
1164 if (!PyArg_ParseTuple(args, "s#|i", &buf, &len, &flags))
1165 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001166 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001167 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001168 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001169 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001170 return PySocket_Err();
1171 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001172}
1173
Guido van Rossum82a5c661998-07-07 20:45:43 +00001174static char send_doc[] =
1175"send(data[, flags])\n\
1176\n\
1177Send a data string to the socket. For the optional flags\n\
1178argument, see the Unix manual.";
1179
Guido van Rossum30a685f1991-06-27 15:51:29 +00001180
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001181/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001182
Guido van Rossum73624e91994-10-10 17:59:00 +00001183static PyObject *
1184BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001185{
Guido van Rossum73624e91994-10-10 17:59:00 +00001186 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001187 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001188 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001189 int addrlen, len, n, flags;
1190 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001191 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
1192 PyErr_Clear();
1193 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001194 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001195 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001196 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001197 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001198 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001199 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001200 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001201 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001202 return PySocket_Err();
1203 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001204}
1205
Guido van Rossum82a5c661998-07-07 20:45:43 +00001206static char sendto_doc[] =
1207"sendto(data[, flags], address)\n\
1208\n\
1209Like send(data, flags) but allows specifying the destination address.\n\
1210For IP sockets, the address is a pair (hostaddr, port).";
1211
Guido van Rossum30a685f1991-06-27 15:51:29 +00001212
1213/* s.shutdown(how) method */
1214
Guido van Rossum73624e91994-10-10 17:59:00 +00001215static PyObject *
1216BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001217{
1218 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001219 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +00001220 if (!PyArg_Parse(args, "i", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001221 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001222 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001223 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001224 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001225 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001226 return PySocket_Err();
1227 Py_INCREF(Py_None);
1228 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001229}
1230
Guido van Rossum82a5c661998-07-07 20:45:43 +00001231static char shutdown_doc[] =
1232"shutdown(flag)\n\
1233\n\
1234Shut down the reading side of the socket (flag == 0), the writing side\n\
1235of the socket (flag == 1), or both ends (flag == 2).";
1236
Guido van Rossum30a685f1991-06-27 15:51:29 +00001237
1238/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001239
Guido van Rossum73624e91994-10-10 17:59:00 +00001240static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001241 {"accept", (PyCFunction)PySocketSock_accept, 0,
1242 accept_doc},
1243 {"bind", (PyCFunction)PySocketSock_bind, 0,
1244 bind_doc},
1245 {"close", (PyCFunction)PySocketSock_close, 0,
1246 close_doc},
1247 {"connect", (PyCFunction)PySocketSock_connect, 0,
1248 connect_doc},
1249 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 0,
1250 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001251#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001252 {"dup", (PyCFunction)PySocketSock_dup, 0,
1253 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001254#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001255 {"fileno", (PyCFunction)PySocketSock_fileno, 0,
1256 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001257#ifdef HAVE_GETPEERNAME
Guido van Rossum82a5c661998-07-07 20:45:43 +00001258 {"getpeername", (PyCFunction)PySocketSock_getpeername, 0,
1259 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001260#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001261 {"getsockname", (PyCFunction)PySocketSock_getsockname, 0,
1262 getsockname_doc},
1263 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1264 getsockopt_doc},
1265 {"listen", (PyCFunction)PySocketSock_listen, 0,
1266 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001267#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001268 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1269 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001270#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001271 {"recv", (PyCFunction)PySocketSock_recv, 1,
1272 recv_doc},
1273 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1274 recvfrom_doc},
1275 {"send", (PyCFunction)PySocketSock_send, 1,
1276 send_doc},
1277 {"sendto", (PyCFunction)PySocketSock_sendto, 0,
1278 sendto_doc},
1279 {"setblocking", (PyCFunction)PySocketSock_setblocking, 0,
1280 setblocking_doc},
1281 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 0,
1282 setsockopt_doc},
1283 {"shutdown", (PyCFunction)PySocketSock_shutdown, 0,
1284 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001285 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001286};
1287
Guido van Rossum30a685f1991-06-27 15:51:29 +00001288
Guido van Rossum73624e91994-10-10 17:59:00 +00001289/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001290 First close the file description. */
1291
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001292static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001293BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001294{
1295 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001296 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001297}
1298
Guido van Rossum30a685f1991-06-27 15:51:29 +00001299
1300/* Return a socket object's named attribute. */
1301
Guido van Rossum73624e91994-10-10 17:59:00 +00001302static PyObject *
1303BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001304{
Guido van Rossum73624e91994-10-10 17:59:00 +00001305 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001306}
1307
Guido van Rossum30a685f1991-06-27 15:51:29 +00001308
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001309static PyObject *
1310BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1311{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001312 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001313 sprintf(buf,
1314 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1315 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001316 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001317}
1318
1319
Guido van Rossumb6775db1994-08-01 11:34:53 +00001320/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001321
Guido van Rossum73624e91994-10-10 17:59:00 +00001322static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001323 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001324 0,
1325 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001326 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001327 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001328 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001329 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001330 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001331 0, /*tp_setattr*/
1332 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001333 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001334 0, /*tp_as_number*/
1335 0, /*tp_as_sequence*/
1336 0, /*tp_as_mapping*/
1337};
1338
Guido van Rossum30a685f1991-06-27 15:51:29 +00001339
Guido van Rossum81194471991-07-27 21:42:02 +00001340/* Python interface to gethostname(). */
1341
1342/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001343static PyObject *
1344BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001345{
1346 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001347 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001348 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +00001349 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001350 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001351 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001352 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001353 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001354 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001355 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001356 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001357}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001358
Guido van Rossum82a5c661998-07-07 20:45:43 +00001359static char gethostname_doc[] =
1360"gethostname() -> string\n\
1361\n\
1362Return the current host name.";
1363
Guido van Rossumff4949e1992-08-05 19:58:53 +00001364
Guido van Rossum30a685f1991-06-27 15:51:29 +00001365/* Python interface to gethostbyname(name). */
1366
1367/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001368static PyObject *
1369BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001370{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001371 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001372 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001373 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001374 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001375 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001376 return NULL;
1377 return makeipaddr(&addrbuf);
1378}
1379
Guido van Rossum82a5c661998-07-07 20:45:43 +00001380static char gethostbyname_doc[] =
1381"gethostbyname(host) -> address\n\
1382\n\
1383Return the IP address (a string of the form '255.255.255.255') for a host.";
1384
1385
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001386/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1387
1388static PyObject *
1389gethost_common(h, addr)
1390 struct hostent *h;
1391 struct sockaddr_in *addr;
1392{
1393 char **pch;
1394 PyObject *rtn_tuple = (PyObject *)NULL;
1395 PyObject *name_list = (PyObject *)NULL;
1396 PyObject *addr_list = (PyObject *)NULL;
1397 PyObject *tmp;
1398 if (h == NULL) {
1399#ifdef HAVE_HSTRERROR
1400 /* Let's get real error message to return */
1401 extern int h_errno;
1402 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1403#else
1404 PyErr_SetString(PySocket_Error, "host not found");
1405#endif
1406 return NULL;
1407 }
1408 if ((name_list = PyList_New(0)) == NULL)
1409 goto err;
1410 if ((addr_list = PyList_New(0)) == NULL)
1411 goto err;
1412 for (pch = h->h_aliases; *pch != NULL; pch++) {
1413 int status;
1414 tmp = PyString_FromString(*pch);
1415 if (tmp == NULL)
1416 goto err;
1417 status = PyList_Append(name_list, tmp);
1418 Py_DECREF(tmp);
1419 if (status)
1420 goto err;
1421 }
1422 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1423 int status;
1424 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1425 tmp = makeipaddr(addr);
1426 if (tmp == NULL)
1427 goto err;
1428 status = PyList_Append(addr_list, tmp);
1429 Py_DECREF(tmp);
1430 if (status)
1431 goto err;
1432 }
1433 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1434 err:
1435 Py_XDECREF(name_list);
1436 Py_XDECREF(addr_list);
1437 return rtn_tuple;
1438}
1439
1440
1441/* Python interface to gethostbyname_ex(name). */
1442
1443/*ARGSUSED*/
1444static PyObject *
1445BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1446{
1447 char *name;
1448 struct hostent *h;
1449 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001450 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001451#ifdef HAVE_GETHOSTBYNAME_R
1452 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001453#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1454 struct hostent_data data;
1455#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001456 char buf[16384];
1457 int buf_len = (sizeof buf) - 1;
1458 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001459#endif
1460#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001461 int result;
1462#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001463#endif /* HAVE_GETHOSTBYNAME_R */
1464 if (!PyArg_Parse(args, "s", &name))
1465 return NULL;
1466 if (setipaddr(name, &addr) < 0)
1467 return NULL;
1468 Py_BEGIN_ALLOW_THREADS
1469#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001470#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001471 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001472#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001473 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001474#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001475 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001476 result = gethostbyname_r(name, &hp_allocated, &data);
1477 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001478#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001479#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001480#ifdef USE_GETHOSTBYNAME_LOCK
1481 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001482#endif
1483 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001484#endif /* HAVE_GETHOSTBYNAME_R */
1485 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001486 ret = gethost_common(h, &addr);
1487#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001488 PyThread_release_lock(gethostbyname_lock);
1489#endif
1490 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001491}
1492
1493static char ghbn_ex_doc[] =
1494"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1495\n\
1496Return the true host name, a list of aliases, and a list of IP addresses,\n\
1497for a host. The host argument is a string giving a host name or IP number.";
1498
1499
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001500/* Python interface to gethostbyaddr(IP). */
1501
1502/*ARGSUSED*/
1503static PyObject *
1504BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1505{
1506 struct sockaddr_in addr;
1507 char *ip_num;
1508 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001509 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001510#ifdef HAVE_GETHOSTBYNAME_R
1511 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001512#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1513 struct hostent_data data;
1514#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001515 char buf[16384];
1516 int buf_len = (sizeof buf) - 1;
1517 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001518#endif
1519#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001520 int result;
1521#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001522#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001523
1524 if (!PyArg_Parse(args, "s", &ip_num))
1525 return NULL;
1526 if (setipaddr(ip_num, &addr) < 0)
1527 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001528 Py_BEGIN_ALLOW_THREADS
1529#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001530#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001531 result = gethostbyaddr_r((char *)&addr.sin_addr,
1532 sizeof(addr.sin_addr),
1533 AF_INET, &hp_allocated, buf, buf_len,
1534 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001535#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001536 h = gethostbyaddr_r((char *)&addr.sin_addr,
1537 sizeof(addr.sin_addr),
1538 AF_INET,
1539 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001540#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001541 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001542 result = gethostbyaddr_r((char *)&addr.sin_addr,
1543 sizeof(addr.sin_addr),
1544 AF_INET, &hp_allocated, &data);
1545 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001546#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001547#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001548#ifdef USE_GETHOSTBYNAME_LOCK
1549 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001550#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001551 h = gethostbyaddr((char *)&addr.sin_addr,
1552 sizeof(addr.sin_addr),
1553 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001554#endif /* HAVE_GETHOSTBYNAME_R */
1555 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001556 ret = gethost_common(h, &addr);
1557#ifdef USE_GETHOSTBYNAME_LOCK
1558 PyThread_release_lock(gethostbyname_lock);
1559#endif
1560 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001561}
1562
Guido van Rossum82a5c661998-07-07 20:45:43 +00001563static char gethostbyaddr_doc[] =
1564"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1565\n\
1566Return the true host name, a list of aliases, and a list of IP addresses,\n\
1567for a host. The host argument is a string giving a host name or IP number.";
1568
Guido van Rossum30a685f1991-06-27 15:51:29 +00001569
1570/* Python interface to getservbyname(name).
1571 This only returns the port number, since the other info is already
1572 known or not useful (like the list of aliases). */
1573
1574/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001575static PyObject *
1576BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001577{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001578 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001579 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001580 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001581 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001582 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001583 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001584 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001585 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001586 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001587 return NULL;
1588 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001589 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001590}
1591
Guido van Rossum82a5c661998-07-07 20:45:43 +00001592static char getservbyname_doc[] =
1593"getservbyname(servicename, protocolname) -> integer\n\
1594\n\
1595Return a port number from a service name and protocol name.\n\
1596The protocol name should be 'tcp' or 'udp'.";
1597
Guido van Rossum30a685f1991-06-27 15:51:29 +00001598
Guido van Rossum3901d851996-12-19 16:35:04 +00001599/* Python interface to getprotobyname(name).
1600 This only returns the protocol number, since the other info is
1601 already known or not useful (like the list of aliases). */
1602
1603/*ARGSUSED*/
1604static PyObject *
1605BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1606{
1607 char *name;
1608 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001609#ifdef __BEOS__
1610/* Not available in BeOS yet. - [cjh] */
1611 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1612 return NULL;
1613#else
Guido van Rossum3901d851996-12-19 16:35:04 +00001614 if (!PyArg_Parse(args, "s", &name))
1615 return NULL;
1616 Py_BEGIN_ALLOW_THREADS
1617 sp = getprotobyname(name);
1618 Py_END_ALLOW_THREADS
1619 if (sp == NULL) {
1620 PyErr_SetString(PySocket_Error, "protocol not found");
1621 return NULL;
1622 }
1623 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001624#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001625}
1626
Guido van Rossum82a5c661998-07-07 20:45:43 +00001627static char getprotobyname_doc[] =
1628"getprotobyname(name) -> integer\n\
1629\n\
1630Return the protocol number for the named protocol. (Rarely used.)";
1631
Guido van Rossum3901d851996-12-19 16:35:04 +00001632
Guido van Rossum30a685f1991-06-27 15:51:29 +00001633/* Python interface to socket(family, type, proto).
1634 The third (protocol) argument is optional.
1635 Return a new socket object. */
1636
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001637/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001638static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001639BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001640{
Guido van Rossum73624e91994-10-10 17:59:00 +00001641 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001642#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001643 SOCKET fd;
1644#else
1645 int fd;
1646#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001647 int family, type, proto = 0;
1648 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1649 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001650 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001651 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001652 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001653#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001654 if (fd == INVALID_SOCKET)
1655#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001656 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001657#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001658 return PySocket_Err();
1659 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001660 /* If the object can't be created, don't forget to close the
1661 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001662 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001663 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001664 /* From now on, ignore SIGPIPE and let the error checking
1665 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001666#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001667 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001668#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001669 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001670}
1671
Guido van Rossum82a5c661998-07-07 20:45:43 +00001672static char socket_doc[] =
1673"socket(family, type[, proto]) -> socket object\n\
1674\n\
1675Open a socket of the given type. The family argument specifies the\n\
1676address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1677The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1678or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1679specifying the default protocol.";
1680
1681
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001682#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001683/* Create a socket object from a numeric file description.
1684 Useful e.g. if stdin is a socket.
1685 Additional arguments as for socket(). */
1686
1687/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001688static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001689BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001690{
Guido van Rossum73624e91994-10-10 17:59:00 +00001691 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001692 int fd, family, type, proto = 0;
1693 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1694 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001695 /* Dup the fd so it and the socket can be closed independently */
1696 fd = dup(fd);
1697 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001698 return PySocket_Err();
1699 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001700 /* From now on, ignore SIGPIPE and let the error checking
1701 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001702#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001703 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001704#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001705 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001706}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001707
1708static char fromfd_doc[] =
1709"fromfd(fd, family, type[, proto]) -> socket object\n\
1710\n\
1711Create a socket object from the given file descriptor.\n\
1712The remaining arguments are the same as for socket().";
1713
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001714#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001715
Guido van Rossum82a5c661998-07-07 20:45:43 +00001716
Guido van Rossum006bf911996-06-12 04:04:55 +00001717static PyObject *
1718BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1719{
1720 int x1, x2;
1721
1722 if (!PyArg_Parse(args, "i", &x1)) {
1723 return NULL;
1724 }
1725 x2 = (int)ntohs((short)x1);
1726 return PyInt_FromLong(x2);
1727}
1728
Guido van Rossum82a5c661998-07-07 20:45:43 +00001729static char ntohs_doc[] =
1730"ntohs(integer) -> integer\n\
1731\n\
1732Convert a 16-bit integer from network to host byte order.";
1733
1734
Guido van Rossum006bf911996-06-12 04:04:55 +00001735static PyObject *
1736BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1737{
1738 int x1, x2;
1739
1740 if (!PyArg_Parse(args, "i", &x1)) {
1741 return NULL;
1742 }
1743 x2 = ntohl(x1);
1744 return PyInt_FromLong(x2);
1745}
1746
Guido van Rossum82a5c661998-07-07 20:45:43 +00001747static char ntohl_doc[] =
1748"ntohl(integer) -> integer\n\
1749\n\
1750Convert a 32-bit integer from network to host byte order.";
1751
1752
Guido van Rossum006bf911996-06-12 04:04:55 +00001753static PyObject *
1754BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1755{
1756 int x1, x2;
1757
1758 if (!PyArg_Parse(args, "i", &x1)) {
1759 return NULL;
1760 }
1761 x2 = (int)htons((short)x1);
1762 return PyInt_FromLong(x2);
1763}
1764
Guido van Rossum82a5c661998-07-07 20:45:43 +00001765static char htons_doc[] =
1766"htons(integer) -> integer\n\
1767\n\
1768Convert a 16-bit integer from host to network byte order.";
1769
1770
Guido van Rossum006bf911996-06-12 04:04:55 +00001771static PyObject *
1772BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1773{
1774 int x1, x2;
1775
1776 if (!PyArg_Parse(args, "i", &x1)) {
1777 return NULL;
1778 }
1779 x2 = htonl(x1);
1780 return PyInt_FromLong(x2);
1781}
1782
Guido van Rossum82a5c661998-07-07 20:45:43 +00001783static char htonl_doc[] =
1784"htonl(integer) -> integer\n\
1785\n\
1786Convert a 32-bit integer from host to network byte order.";
1787
1788
Guido van Rossum30a685f1991-06-27 15:51:29 +00001789/* List of functions exported by this module. */
1790
Guido van Rossum73624e91994-10-10 17:59:00 +00001791static PyMethodDef PySocket_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001792 {"gethostbyname", PySocket_gethostbyname, 0, gethostbyname_doc},
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001793 {"gethostbyname_ex", PySocket_gethostbyname_ex, 0, ghbn_ex_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00001794 {"gethostbyaddr", PySocket_gethostbyaddr, 0, gethostbyaddr_doc},
1795 {"gethostname", PySocket_gethostname, 0, gethostname_doc},
1796 {"getservbyname", PySocket_getservbyname, 0, getservbyname_doc},
1797 {"getprotobyname", PySocket_getprotobyname, 0,getprotobyname_doc},
1798 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001799#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001800 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001801#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001802 {"ntohs", PySocket_ntohs, 0, ntohs_doc},
1803 {"ntohl", PySocket_ntohl, 0, ntohl_doc},
1804 {"htons", PySocket_htons, 0, htons_doc},
1805 {"htonl", PySocket_htonl, 0, htonl_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001806 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001807};
1808
Guido van Rossum30a685f1991-06-27 15:51:29 +00001809
1810/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00001811 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001812 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00001813 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001814static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001815BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001816{
Guido van Rossum73624e91994-10-10 17:59:00 +00001817 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00001818 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001819 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00001820
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001821 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001822}
1823
Guido van Rossum30a685f1991-06-27 15:51:29 +00001824
Guido van Rossum8d665e61996-06-26 18:22:49 +00001825#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001826
1827/* Additional initialization and cleanup for NT/Windows */
1828
1829static void
1830NTcleanup()
1831{
1832 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001833}
1834
1835static int
1836NTinit()
1837{
1838 WSADATA WSAData;
1839 int ret;
1840 char buf[100];
1841 ret = WSAStartup(0x0101, &WSAData);
1842 switch (ret) {
1843 case 0: /* no error */
1844 atexit(NTcleanup);
1845 return 1;
1846 case WSASYSNOTREADY:
1847 PyErr_SetString(PyExc_ImportError,
1848 "WSAStartup failed: network not ready");
1849 break;
1850 case WSAVERNOTSUPPORTED:
1851 case WSAEINVAL:
1852 PyErr_SetString(PyExc_ImportError,
1853 "WSAStartup failed: requested version not supported");
1854 break;
1855 default:
1856 sprintf(buf, "WSAStartup failed: error code %d", ret);
1857 PyErr_SetString(PyExc_ImportError, buf);
1858 break;
1859 }
1860 return 0;
1861}
1862
Guido van Rossum8d665e61996-06-26 18:22:49 +00001863#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00001864
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001865#if defined(PYOS_OS2)
1866
1867/* Additional initialization and cleanup for OS/2 */
1868
1869static void
1870OS2cleanup()
1871{
1872 /* No cleanup is necessary for OS/2 Sockets */
1873}
1874
1875static int
1876OS2init()
1877{
1878 char reason[64];
1879 int rc = sock_init();
1880
1881 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00001882 atexit(OS2cleanup);
1883 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001884 }
1885
1886 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
1887 PyErr_SetString(PyExc_ImportError, reason);
1888
Guido van Rossum32c575d1997-12-02 20:37:32 +00001889 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001890}
1891
1892#endif /* PYOS_OS2 */
1893
Guido van Rossumbe32c891996-06-20 16:25:29 +00001894
Guido van Rossum30a685f1991-06-27 15:51:29 +00001895/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001896 * This is called when the first 'import socket' is done,
1897 * via a table in config.c, if config.c is compiled with USE_SOCKET
1898 * defined.
1899 *
1900 * For MS_WINDOWS (which means any Windows variant), this module
1901 * is actually called "_socket", and there's a wrapper "socket.py"
1902 * which implements some missing functionality (such as makefile(),
1903 * dup() and fromfd()). The import of "_socket" may fail with an
1904 * ImportError exception if initialization of WINSOCK fails. When
1905 * WINSOCK is initialized succesfully, a call to WSACleanup() is
1906 * scheduled to be made at exit time.
1907 *
1908 * For OS/2, this module is also called "_socket" and uses a wrapper
1909 * "socket.py" which implements that functionality that is missing
1910 * when PC operating systems don't put socket descriptors in the
1911 * operating system's filesystem layer.
1912 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001913
Guido van Rossum82a5c661998-07-07 20:45:43 +00001914static char module_doc[] =
1915"This module provides socket operations and some related functions.\n\
1916On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
1917On other systems, it only supports IP.\n\
1918\n\
1919Functions:\n\
1920\n\
1921socket() -- create a new socket object\n\
1922fromfd() -- create a socket object from an open file descriptor (*)\n\
1923gethostname() -- return the current hostname\n\
1924gethostbyname() -- map a hostname to its IP number\n\
1925gethostbyaddr() -- map an IP number or hostname to DNS info\n\
1926getservbyname() -- map a service name and a protocol name to a port number\n\
1927getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
1928ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
1929htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
1930\n\
1931(*) not available on all platforms!)\n\
1932\n\
1933Special objects:\n\
1934\n\
1935SocketType -- type object for socket objects\n\
1936error -- exception raised for I/O errors\n\
1937\n\
1938Integer constants:\n\
1939\n\
1940AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
1941SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
1942\n\
1943Many other constants may be defined; these may be used in calls to\n\
1944the setsockopt() and getsockopt() methods.\n\
1945";
1946
1947static char sockettype_doc[] =
1948"A socket represents one endpoint of a network connection.\n\
1949\n\
1950Methods:\n\
1951\n\
1952accept() -- accept a connection, returning new socket and client address\n\
1953bind() -- bind the socket to a local address\n\
1954close() -- close the socket\n\
1955connect() -- connect the socket to a remote address\n\
1956connect_ex() -- connect, return an error code instead of an exception \n\
1957dup() -- return a new socket object identical to the current one (*)\n\
1958fileno() -- return underlying file descriptor\n\
1959getpeername() -- return remote address (*)\n\
1960getsockname() -- return local address\n\
1961getsockopt() -- get socket options\n\
1962listen() -- start listening for incoming connections\n\
1963makefile() -- return a file object corresponding tot the socket (*)\n\
1964recv() -- receive data\n\
1965recvfrom() -- receive data and sender's address\n\
1966send() -- send data\n\
1967sendto() -- send data to a given address\n\
1968setblocking() -- set or clear the blocking I/O flag\n\
1969setsockopt() -- set socket options\n\
1970shutdown() -- shut down traffic in one or both directions\n\
1971\n\
1972(*) not available on all platforms!)";
1973
Guido van Rossum3886bb61998-12-04 18:50:17 +00001974DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00001975#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001976init_socket()
1977#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001978initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00001979#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001980{
Guido van Rossum73624e91994-10-10 17:59:00 +00001981 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001982#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001983 if (!NTinit())
1984 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001985 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001986#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00001987#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001988 if (!OS2init())
1989 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001990 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00001991#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00001992#if defined(__BEOS__)
1993 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
1994#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001995 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001996#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00001997#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001998#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001999 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002000 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2001 if (PySocket_Error == NULL)
2002 return;
2003 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002004 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002005 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002006 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002007 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002008 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002009 return;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002010 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002011#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002012 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002013#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002014 insint(d, "SOCK_STREAM", SOCK_STREAM);
2015 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002016#ifndef __BEOS__
2017/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002018 insint(d, "SOCK_RAW", SOCK_RAW);
2019 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2020 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002021#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002022
2023#ifdef SO_DEBUG
2024 insint(d, "SO_DEBUG", SO_DEBUG);
2025#endif
2026#ifdef SO_ACCEPTCONN
2027 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2028#endif
2029#ifdef SO_REUSEADDR
2030 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2031#endif
2032#ifdef SO_KEEPALIVE
2033 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2034#endif
2035#ifdef SO_DONTROUTE
2036 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2037#endif
2038#ifdef SO_BROADCAST
2039 insint(d, "SO_BROADCAST", SO_BROADCAST);
2040#endif
2041#ifdef SO_USELOOPBACK
2042 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2043#endif
2044#ifdef SO_LINGER
2045 insint(d, "SO_LINGER", SO_LINGER);
2046#endif
2047#ifdef SO_OOBINLINE
2048 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2049#endif
2050#ifdef SO_REUSEPORT
2051 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2052#endif
2053
2054#ifdef SO_SNDBUF
2055 insint(d, "SO_SNDBUF", SO_SNDBUF);
2056#endif
2057#ifdef SO_RCVBUF
2058 insint(d, "SO_RCVBUF", SO_RCVBUF);
2059#endif
2060#ifdef SO_SNDLOWAT
2061 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2062#endif
2063#ifdef SO_RCVLOWAT
2064 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2065#endif
2066#ifdef SO_SNDTIMEO
2067 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2068#endif
2069#ifdef SO_RCVTIMEO
2070 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2071#endif
2072#ifdef SO_ERROR
2073 insint(d, "SO_ERROR", SO_ERROR);
2074#endif
2075#ifdef SO_TYPE
2076 insint(d, "SO_TYPE", SO_TYPE);
2077#endif
2078
2079 /* Maximum number of connections for "listen" */
2080#ifdef SOMAXCONN
2081 insint(d, "SOMAXCONN", SOMAXCONN);
2082#else
2083 insint(d, "SOMAXCONN", 5); /* Common value */
2084#endif
2085
2086 /* Flags for send, recv */
2087#ifdef MSG_OOB
2088 insint(d, "MSG_OOB", MSG_OOB);
2089#endif
2090#ifdef MSG_PEEK
2091 insint(d, "MSG_PEEK", MSG_PEEK);
2092#endif
2093#ifdef MSG_DONTROUTE
2094 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2095#endif
2096#ifdef MSG_EOR
2097 insint(d, "MSG_EOR", MSG_EOR);
2098#endif
2099#ifdef MSG_TRUNC
2100 insint(d, "MSG_TRUNC", MSG_TRUNC);
2101#endif
2102#ifdef MSG_CTRUNC
2103 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2104#endif
2105#ifdef MSG_WAITALL
2106 insint(d, "MSG_WAITALL", MSG_WAITALL);
2107#endif
2108#ifdef MSG_BTAG
2109 insint(d, "MSG_BTAG", MSG_BTAG);
2110#endif
2111#ifdef MSG_ETAG
2112 insint(d, "MSG_ETAG", MSG_ETAG);
2113#endif
2114
2115 /* Protocol level and numbers, usable for [gs]etsockopt */
Guido van Rossum578de301998-05-28 20:18:18 +00002116/* Sigh -- some systems (e.g. Linux) use enums for these. */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002117#ifdef SOL_SOCKET
2118 insint(d, "SOL_SOCKET", SOL_SOCKET);
2119#endif
2120#ifdef IPPROTO_IP
2121 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002122#else
2123 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002124#endif
2125#ifdef IPPROTO_ICMP
2126 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002127#else
2128 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002129#endif
2130#ifdef IPPROTO_IGMP
2131 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2132#endif
2133#ifdef IPPROTO_GGP
2134 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2135#endif
2136#ifdef IPPROTO_TCP
2137 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002138#else
2139 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002140#endif
2141#ifdef IPPROTO_EGP
2142 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2143#endif
2144#ifdef IPPROTO_PUP
2145 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2146#endif
2147#ifdef IPPROTO_UDP
2148 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002149#else
2150 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002151#endif
2152#ifdef IPPROTO_IDP
2153 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2154#endif
2155#ifdef IPPROTO_HELLO
2156 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2157#endif
2158#ifdef IPPROTO_ND
2159 insint(d, "IPPROTO_ND", IPPROTO_ND);
2160#endif
2161#ifdef IPPROTO_TP
2162 insint(d, "IPPROTO_TP", IPPROTO_TP);
2163#endif
2164#ifdef IPPROTO_XTP
2165 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2166#endif
2167#ifdef IPPROTO_EON
2168 insint(d, "IPPROTO_EON", IPPROTO_EON);
2169#endif
2170#ifdef IPPROTO_BIP
2171 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2172#endif
2173/**/
2174#ifdef IPPROTO_RAW
2175 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002176#else
2177 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002178#endif
2179#ifdef IPPROTO_MAX
2180 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2181#endif
2182
2183 /* Some port configuration */
2184#ifdef IPPORT_RESERVED
2185 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2186#else
2187 insint(d, "IPPORT_RESERVED", 1024);
2188#endif
2189#ifdef IPPORT_USERRESERVED
2190 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2191#else
2192 insint(d, "IPPORT_USERRESERVED", 5000);
2193#endif
2194
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002195 /* Some reserved IP v.4 addresses */
2196#ifdef INADDR_ANY
2197 insint(d, "INADDR_ANY", INADDR_ANY);
2198#else
2199 insint(d, "INADDR_ANY", 0x00000000);
2200#endif
2201#ifdef INADDR_BROADCAST
2202 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2203#else
2204 insint(d, "INADDR_BROADCAST", 0xffffffff);
2205#endif
2206#ifdef INADDR_LOOPBACK
2207 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2208#else
2209 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2210#endif
2211#ifdef INADDR_UNSPEC_GROUP
2212 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2213#else
2214 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2215#endif
2216#ifdef INADDR_ALLHOSTS_GROUP
2217 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2218#else
2219 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2220#endif
2221#ifdef INADDR_MAX_LOCAL_GROUP
2222 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2223#else
2224 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2225#endif
2226#ifdef INADDR_NONE
2227 insint(d, "INADDR_NONE", INADDR_NONE);
2228#else
2229 insint(d, "INADDR_NONE", 0xffffffff);
2230#endif
2231
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002232 /* IP [gs]etsockopt options */
2233#ifdef IP_OPTIONS
2234 insint(d, "IP_OPTIONS", IP_OPTIONS);
2235#endif
2236#ifdef IP_HDRINCL
2237 insint(d, "IP_HDRINCL", IP_HDRINCL);
2238#endif
2239#ifdef IP_TOS
2240 insint(d, "IP_TOS", IP_TOS);
2241#endif
2242#ifdef IP_TTL
2243 insint(d, "IP_TTL", IP_TTL);
2244#endif
2245#ifdef IP_RECVOPTS
2246 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2247#endif
2248#ifdef IP_RECVRETOPTS
2249 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2250#endif
2251#ifdef IP_RECVDSTADDR
2252 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2253#endif
2254#ifdef IP_RETOPTS
2255 insint(d, "IP_RETOPTS", IP_RETOPTS);
2256#endif
2257#ifdef IP_MULTICAST_IF
2258 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2259#endif
2260#ifdef IP_MULTICAST_TTL
2261 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2262#endif
2263#ifdef IP_MULTICAST_LOOP
2264 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2265#endif
2266#ifdef IP_ADD_MEMBERSHIP
2267 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2268#endif
2269#ifdef IP_DROP_MEMBERSHIP
2270 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2271#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002272
2273 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002274#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002275 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002276#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002277}