blob: 9dfc5d02fe41863fa252fc62d69f5cefcf1fb711 [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 Rossum5c9eb211999-08-20 18:21:51 +000057- socket.inet_aton(IP address) -> 32-bit packed IP representation
58- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum6574b3e1991-06-25 21:36:08 +000059- an Internet socket address is a pair (hostname, port)
60 where hostname can be anything recognized by gethostbyname()
61 (including the dd.dd.dd.dd notation) and port is in host byte order
62- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000063- a UNIX domain socket address is a string specifying the pathname
Guido van Rossum6574b3e1991-06-25 21:36:08 +000064
Guido van Rossum30a685f1991-06-27 15:51:29 +000065Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000066
Guido van Rossum81194471991-07-27 21:42:02 +000067- s.accept() --> new socket object, sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000068- s.bind(sockaddr) --> None
69- s.close() --> None
70- s.connect(sockaddr) --> None
Guido van Rossumfc4255d1997-11-19 18:57:13 +000071- s.connect_ex(sockaddr) --> 0 or errno (handy for e.g. async connect)
Guido van Rossum27e177d1995-03-16 15:43:47 +000072- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000073- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000074- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000075- s.getsockname() --> sockaddr
76- s.getsockopt(level, optname[, buflen]) --> int or string
77- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000078- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000079- s.recv(buflen [,flags]) --> string
80- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000081- s.send(string [,flags]) --> nbytes
82- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000083- s.setblocking(0 | 1) --> None
84- s.setsockopt(level, optname, value) --> None
85- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000086- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000087
Guido van Rossum6574b3e1991-06-25 21:36:08 +000088*/
89
Guido van Rossum73624e91994-10-10 17:59:00 +000090#include "Python.h"
Guido van Rossum3baaa131999-03-22 21:44:51 +000091
Guido van Rossum9376b741999-09-15 22:01:40 +000092/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
93 script doesn't get this right, so we hardcode some platform checks below.
94 On the other hand, not all Linux versions agree, so there the settings
95 computed by the configure script are needed! */
96
97#ifndef linux
Guido van Rossume7de2061999-03-24 17:24:33 +000098#undef HAVE_GETHOSTBYNAME_R_3_ARG
99#undef HAVE_GETHOSTBYNAME_R_5_ARG
100#undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000101#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000102
Guido van Rossum7a122991999-04-13 04:07:32 +0000103#ifndef WITH_THREAD
104#undef HAVE_GETHOSTBYNAME_R
105#endif
106
Guido van Rossume7de2061999-03-24 17:24:33 +0000107#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000108#if defined(_AIX) || defined(__osf__)
Guido van Rossume7de2061999-03-24 17:24:33 +0000109#define HAVE_GETHOSTBYNAME_R_3_ARG
110#elif defined(__sun__) || defined(__sgi)
111#define HAVE_GETHOSTBYNAME_R_5_ARG
112#elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000113/* Rely on the configure script */
Guido van Rossume7de2061999-03-24 17:24:33 +0000114#else
115#undef HAVE_GETHOSTBYNAME_R
116#endif
117#endif
118
Guido van Rossum3baaa131999-03-22 21:44:51 +0000119#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
120#define USE_GETHOSTBYNAME_LOCK
121#endif
122
123#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum49b56061998-10-01 20:42:43 +0000124#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000125#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000126
Guido van Rossuma376cc51996-12-05 23:43:35 +0000127#ifdef HAVE_UNISTD_H
128#include <unistd.h>
129#endif
130
Guido van Rossumbcc20741998-08-04 22:53:56 +0000131#if !defined(MS_WINDOWS) && !defined(PYOS_OS2) && !defined(__BEOS__)
Guido van Rossumfb4130d1996-12-10 15:17:08 +0000132extern int gethostname(); /* For Solaris, at least */
133#endif
134
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000135#if defined(PYCC_VACPP)
136#include <types.h>
137#include <io.h>
138#include <sys/ioctl.h>
139#include <utils.h>
140#include <ctype.h>
141#endif
142
143#if defined(PYOS_OS2)
144#define INCL_DOS
145#define INCL_DOSERRORS
146#define INCL_NOPMAPI
147#include <os2.h>
148#endif
149
Guido van Rossumbcc20741998-08-04 22:53:56 +0000150#if defined(__BEOS__)
151/* It's in the libs, but not the headers... - [cjh] */
152int shutdown( int, int );
153#endif
154
Guido van Rossumb6775db1994-08-01 11:34:53 +0000155#include <sys/types.h>
156#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +0000157
Guido van Rossum81194471991-07-27 21:42:02 +0000158#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000159#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000160#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000161#include <sys/socket.h>
162#include <netinet/in.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000163
Guido van Rossum9376b741999-09-15 22:01:40 +0000164/* Headers needed for inet_ntoa() and inet_addr() */
165#ifdef __BEOS__
166#include <net/netdb.h>
167#else
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000168#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000169#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000170
Guido van Rossume4485b01994-09-07 14:32:49 +0000171#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000172#else
173#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000174#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000175#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000176#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000177#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000178#else
179#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000180#endif
181
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000182#ifndef O_NDELAY
183#define O_NDELAY O_NONBLOCK /* For QNX only? */
184#endif
185
Jack Jansen508537b1996-02-14 15:57:45 +0000186#ifdef USE_GUSI
187/* fdopen() isn't declared in stdio.h (sigh) */
188#include <GUSI.h>
189#endif
190
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000191
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000192/* Here we have some hacks to choose between K&R or ANSI style function
193 definitions. For NT to build this as an extension module (ie, DLL)
194 it must be compiled by the C++ compiler, as it takes the address of
195 a static data item exported from the main Python DLL.
196*/
Guido van Rossumbcc20741998-08-04 22:53:56 +0000197#if defined(MS_WINDOWS) || defined(__BEOS__)
198/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000199/* seem to be a few differences in the API */
200#define close closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000201#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000202#define FORCE_ANSI_FUNC_DEFS
203#endif
204
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000205#if defined(PYOS_OS2)
206#define close soclose
207#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
208#define FORCE_ANSI_FUNC_DEFS
209#endif
210
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000211#ifdef FORCE_ANSI_FUNC_DEFS
212#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
213fnname( arg1type arg1name )
214
215#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
216fnname( arg1type arg1name, arg2type arg2name )
217
218#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
219fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
220
221#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
222fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
223
224#else /* !FORCE_ANSI_FN_DEFS */
225#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
226fnname( arg1name ) \
227 arg1type arg1name;
228
229#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
230fnname( arg1name, arg2name ) \
231 arg1type arg1name; \
232 arg2type arg2name;
233
234#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
235fnname( arg1name, arg2name, arg3name ) \
236 arg1type arg1name; \
237 arg2type arg2name; \
238 arg3type arg3name;
239
240#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
241fnname( arg1name, arg2name, arg3name, arg4name ) \
242 arg1type arg1name; \
243 arg2type arg2name; \
244 arg3type arg3name; \
245 arg4type arg4name;
246
247#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000248
249/* Global variable holding the exception type for errors detected
250 by this module (but not argument type or memory errors, etc.). */
251
Guido van Rossum73624e91994-10-10 17:59:00 +0000252static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000253
254
255/* Convenience function to raise an error according to errno
256 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000257
Guido van Rossum73624e91994-10-10 17:59:00 +0000258static PyObject *
259PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000260{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000261#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000262 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000263 PyObject *v;
264 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000265 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000266 PyErr_SetObject(PySocket_Error, v);
267 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000268 }
269 return NULL;
270 }
271 else
272#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000273
274#if defined(PYOS_OS2)
275 if (sock_errno() != NO_ERROR) {
276 APIRET rc;
277 ULONG msglen;
278 char outbuf[100];
279 int myerrorcode = sock_errno();
280
281 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
282 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
283 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
284 if (rc == NO_ERROR) {
285 PyObject *v;
286
287 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
288 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
289 char *lastc = &outbuf[ strlen(outbuf)-1 ];
290 while (lastc > outbuf && isspace(*lastc))
291 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
292 }
293 v = Py_BuildValue("(is)", myerrorcode, outbuf);
294 if (v != NULL) {
295 PyErr_SetObject(PySocket_Error, v);
296 Py_DECREF(v);
297 }
298 return NULL;
299 }
300 }
301#endif
302
Guido van Rossum73624e91994-10-10 17:59:00 +0000303 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000304}
305
Guido van Rossum30a685f1991-06-27 15:51:29 +0000306
307/* The object holding a socket. It holds some extra information,
308 like the address family, which is used to decode socket address
309 arguments properly. */
310
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000311typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000312 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000313 int sock_fd; /* Socket file descriptor */
314 int sock_family; /* Address family, e.g., AF_INET */
315 int sock_type; /* Socket type, e.g., SOCK_STREAM */
316 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000317 union sock_addr {
318 struct sockaddr_in in;
319#ifdef AF_UNIX
320 struct sockaddr_un un;
321#endif
322 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000323} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000324
Guido van Rossum30a685f1991-06-27 15:51:29 +0000325
326/* A forward reference to the Socktype type object.
327 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000328 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000329 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000330
Guido van Rossum73624e91994-10-10 17:59:00 +0000331staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000332
Guido van Rossum30a685f1991-06-27 15:51:29 +0000333
334/* Create a new socket object.
335 This just creates the object and initializes it.
336 If the creation fails, return NULL and set an exception (implicit
337 in NEWOBJ()). */
338
Guido van Rossum73624e91994-10-10 17:59:00 +0000339static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000340BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000341{
Guido van Rossum73624e91994-10-10 17:59:00 +0000342 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000343 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000344 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000345 if (s != NULL) {
346 s->sock_fd = fd;
347 s->sock_family = family;
348 s->sock_type = type;
349 s->sock_proto = proto;
350 }
351 return s;
352}
353
Guido van Rossum30a685f1991-06-27 15:51:29 +0000354
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000355/* Lock to allow python interpreter to continue, but only allow one
356 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000357#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000358PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000359#endif
360
361
Guido van Rossum30a685f1991-06-27 15:51:29 +0000362/* Convert a string specifying a host name or one of a few symbolic
363 names to a numeric IP address. This usually calls gethostbyname()
364 to do the work; the names "" and "<broadcast>" are special.
365 Return the length (should always be 4 bytes), or negative if
366 an error occurred; then an exception is raised. */
367
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000368static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000369BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000370{
371 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000372 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000373 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000374 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000375#ifdef HAVE_GETHOSTBYNAME_R
376 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000377#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
378 struct hostent_data data;
379#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000380 char buf[1001];
381 int buf_len = (sizeof buf) - 1;
382 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000383#endif
384#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000385 int result;
386#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000387#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000388
Guido van Rossuma376cc51996-12-05 23:43:35 +0000389 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000390 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000391 addr_ret->sin_addr.s_addr = INADDR_ANY;
392 return 4;
393 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000394 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000395 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
396 return 4;
397 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000398 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
399 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
400 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
401 addr_ret->sin_addr.s_addr = htonl(
402 ((long) d1 << 24) | ((long) d2 << 16) |
403 ((long) d3 << 8) | ((long) d4 << 0));
404 return 4;
405 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000406 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000407#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000408#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000409 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000410#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000411 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000412#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000413 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000414 result = gethostbyname_r(name, &hp_allocated, &data);
415 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000416#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000417#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000418#ifdef USE_GETHOSTBYNAME_LOCK
419 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000420#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000421 hp = gethostbyname(name);
422#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000423 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000424
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000425 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000426#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000427 /* Let's get real error message to return */
428 extern int h_errno;
429 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
430#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000431 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000432#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000433#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000434 PyThread_release_lock(gethostbyname_lock);
435#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000436 return -1;
437 }
438 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000439 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000440#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000441 PyThread_release_lock(gethostbyname_lock);
442#endif
443 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000444}
445
Guido van Rossum30a685f1991-06-27 15:51:29 +0000446
Guido van Rossum30a685f1991-06-27 15:51:29 +0000447/* Create a string object representing an IP address.
448 This is always a string of the form 'dd.dd.dd.dd' (with variable
449 size numbers). */
450
Guido van Rossum73624e91994-10-10 17:59:00 +0000451static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000452BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000453{
454 long x = ntohl(addr->sin_addr.s_addr);
455 char buf[100];
456 sprintf(buf, "%d.%d.%d.%d",
457 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
458 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000459 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000460}
461
462
463/* Create an object representing the given socket address,
464 suitable for passing it back to bind(), connect() etc.
465 The family field of the sockaddr structure is inspected
466 to determine what kind of address it really is. */
467
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000468/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000469static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000470BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000471{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000472 if (addrlen == 0) {
473 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000474 Py_INCREF(Py_None);
475 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000476 }
477
Guido van Rossumbcc20741998-08-04 22:53:56 +0000478#ifdef __BEOS__
479 /* XXX: BeOS version of accept() doesn't set family coreectly */
480 addr->sa_family = AF_INET;
481#endif
482
Guido van Rossum30a685f1991-06-27 15:51:29 +0000483 switch (addr->sa_family) {
484
485 case AF_INET:
486 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000487 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000488 PyObject *addrobj = makeipaddr(a);
489 PyObject *ret = NULL;
490 if (addrobj) {
491 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
492 Py_DECREF(addrobj);
493 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000494 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000495 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000496
Guido van Rossumb6775db1994-08-01 11:34:53 +0000497#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000498 case AF_UNIX:
499 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000500 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000501 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000502 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000503#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000504
505 /* More cases here... */
506
507 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000508 /* If we don't know the address family, don't raise an
509 exception -- return it as a tuple. */
510 return Py_BuildValue("is#",
511 addr->sa_family,
512 addr->sa_data,
513 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000514
Guido van Rossum30a685f1991-06-27 15:51:29 +0000515 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000516}
517
Guido van Rossum30a685f1991-06-27 15:51:29 +0000518
519/* Parse a socket address argument according to the socket object's
520 address family. Return 1 if the address was in the proper format,
521 0 of not. The address is returned through addr_ret, its length
522 through len_ret. */
523
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000524static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000525BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000526getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000527{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000528 switch (s->sock_family) {
529
Guido van Rossumb6775db1994-08-01 11:34:53 +0000530#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000531 case AF_UNIX:
532 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000533 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000534 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000535 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000536 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000537 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000538 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000539 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000540 PyErr_SetString(PySocket_Error,
541 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000542 return 0;
543 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000544 addr->sun_family = AF_UNIX;
545 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000546 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000547 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000548 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000549 return 1;
550 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000551#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000552
Guido van Rossum30a685f1991-06-27 15:51:29 +0000553 case AF_INET:
554 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000555 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000556 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000557 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000558 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000559 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000560 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000561 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000562 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000563 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000564 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000565 *addr_ret = (struct sockaddr *) addr;
566 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000567 return 1;
568 }
569
Guido van Rossum30a685f1991-06-27 15:51:29 +0000570 /* More cases here... */
571
572 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000573 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000574 return 0;
575
576 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000577}
578
Guido van Rossum30a685f1991-06-27 15:51:29 +0000579
Guido van Rossum710e1df1992-06-12 10:39:36 +0000580/* Get the address length according to the socket object's address family.
581 Return 1 if the family is known, 0 otherwise. The length is returned
582 through len_ret. */
583
584static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000585BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000586{
587 switch (s->sock_family) {
588
Guido van Rossumb6775db1994-08-01 11:34:53 +0000589#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000590 case AF_UNIX:
591 {
592 *len_ret = sizeof (struct sockaddr_un);
593 return 1;
594 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000595#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000596
597 case AF_INET:
598 {
599 *len_ret = sizeof (struct sockaddr_in);
600 return 1;
601 }
602
603 /* More cases here... */
604
605 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000606 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000607 return 0;
608
609 }
610}
611
612
Guido van Rossum30a685f1991-06-27 15:51:29 +0000613/* s.accept() method */
614
Guido van Rossum73624e91994-10-10 17:59:00 +0000615static PyObject *
616BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000617{
618 char addrbuf[256];
619 int addrlen, newfd;
Barry Warsaw752300b1997-01-03 17:18:10 +0000620 PyObject *sock = NULL;
621 PyObject *addr = NULL;
622 PyObject *res = NULL;
623
Guido van Rossum73624e91994-10-10 17:59:00 +0000624 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000625 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000626 if (!getsockaddrlen(s, &addrlen))
627 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000628 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000629 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000630 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000631 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000632 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000633
Guido van Rossum30a685f1991-06-27 15:51:29 +0000634 /* Create the new object with unspecified family,
635 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000636 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000637 s->sock_family,
638 s->sock_type,
639 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000640 if (sock == NULL) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000641 close(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000642 goto finally;
643 }
644 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
645 goto finally;
646
647 if (!(res = Py_BuildValue("OO", sock, addr)))
648 goto finally;
649
650 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000651 Py_XDECREF(sock);
652 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000653 return res;
654}
655
Guido van Rossum82a5c661998-07-07 20:45:43 +0000656static char accept_doc[] =
657"accept() -> (socket object, address info)\n\
658\n\
659Wait for an incoming connection. Return a new socket representing the\n\
660connection, and the address of the client. For IP sockets, the address\n\
661info is a pair (hostaddr, port).";
662
Guido van Rossum30a685f1991-06-27 15:51:29 +0000663
Guido van Rossume4485b01994-09-07 14:32:49 +0000664/* s.setblocking(1 | 0) method */
665
Guido van Rossum73624e91994-10-10 17:59:00 +0000666static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000667BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000668{
669 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000670#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000671 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000672#endif
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000673 if (!PyArg_Parse(args, "i", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000674 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000675 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000676#ifdef __BEOS__
677 block = !block;
678 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
679 (void *)(&block), sizeof( int ) );
680#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000681#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000682#ifdef PYOS_OS2
683 block = !block;
684 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
685#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000686 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
687 if (block)
688 delay_flag &= (~O_NDELAY);
689 else
690 delay_flag |= O_NDELAY;
691 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000692#endif /* !PYOS_OS2 */
693#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000694 block = !block;
695 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000696#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000697#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000698 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000699
Guido van Rossum73624e91994-10-10 17:59:00 +0000700 Py_INCREF(Py_None);
701 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000702}
Guido van Rossume4485b01994-09-07 14:32:49 +0000703
Guido van Rossum82a5c661998-07-07 20:45:43 +0000704static char setblocking_doc[] =
705"setblocking(flag)\n\
706\n\
707Set the socket to blocking (flag is true) or non-blocking (false).\n\
708This uses the FIONBIO ioctl with the O_NDELAY flag.";
709
Guido van Rossume4485b01994-09-07 14:32:49 +0000710
Guido van Rossumaee08791992-09-08 09:05:33 +0000711/* s.setsockopt() method.
712 With an integer third argument, sets an integer option.
713 With a string third argument, sets an option from a buffer;
714 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000715
Guido van Rossum73624e91994-10-10 17:59:00 +0000716static PyObject *
717BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000718{
719 int level;
720 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000721 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000722 char *buf;
723 int buflen;
724 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000725
Guido van Rossum73624e91994-10-10 17:59:00 +0000726 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000727 buf = (char *) &flag;
728 buflen = sizeof flag;
729 }
730 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000731 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +0000732 if (!PyArg_Parse(args, "(iis#)", &level, &optname,
733 &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000734 return NULL;
735 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000736 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000737 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000738 return PySocket_Err();
739 Py_INCREF(Py_None);
740 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000741}
742
Guido van Rossum82a5c661998-07-07 20:45:43 +0000743static char setsockopt_doc[] =
744"setsockopt(level, option, value)\n\
745\n\
746Set a socket option. See the Unix manual for level and option.\n\
747The value argument can either be an integer or a string.";
748
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000749
Guido van Rossumaee08791992-09-08 09:05:33 +0000750/* s.getsockopt() method.
751 With two arguments, retrieves an integer option.
752 With a third integer argument, retrieves a string buffer of that size;
753 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000754
Guido van Rossum73624e91994-10-10 17:59:00 +0000755static PyObject *
756BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000757{
758 int level;
759 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000760 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000761 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000762 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000763
Guido van Rossumbcc20741998-08-04 22:53:56 +0000764#ifdef __BEOS__
765/* We have incomplete socket support. */
766 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
767 return NULL;
768#else
769
Guido van Rossumbe32c891996-06-20 16:25:29 +0000770 if (!PyArg_ParseTuple(args, "ii|i", &level, &optname, &buflen))
771 return NULL;
772
773 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000774 int flag = 0;
775 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000776 res = getsockopt(s->sock_fd, level, optname,
777 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000778 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000779 return PySocket_Err();
780 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000781 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000782 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000783 PyErr_SetString(PySocket_Error,
784 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000785 return NULL;
786 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000787 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000788 if (buf == NULL)
789 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000790 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000791 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000792 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000793 Py_DECREF(buf);
794 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000795 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000796 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000797 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000798#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000799}
800
Guido van Rossum82a5c661998-07-07 20:45:43 +0000801static char getsockopt_doc[] =
802"getsockopt(level, option[, buffersize]) -> value\n\
803\n\
804Get a socket option. See the Unix manual for level and option.\n\
805If a nonzero buffersize argument is given, the return value is a\n\
806string of that length; otherwise it is an integer.";
807
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000808
Guido van Rossum30a685f1991-06-27 15:51:29 +0000809/* s.bind(sockaddr) method */
810
Guido van Rossum73624e91994-10-10 17:59:00 +0000811static PyObject *
812BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000813{
814 struct sockaddr *addr;
815 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000816 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000817 if (!getsockaddrarg(s, args, &addr, &addrlen))
818 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000819 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000820 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000821 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000822 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000823 return PySocket_Err();
824 Py_INCREF(Py_None);
825 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000826}
827
Guido van Rossum82a5c661998-07-07 20:45:43 +0000828static char bind_doc[] =
829"bind(address)\n\
830\n\
831Bind the socket to a local address. For IP sockets, the address is a\n\
832pair (host, port); the host must refer to the local host.";
833
Guido van Rossum30a685f1991-06-27 15:51:29 +0000834
835/* s.close() method.
836 Set the file descriptor to -1 so operations tried subsequently
837 will surely fail. */
838
Guido van Rossum73624e91994-10-10 17:59:00 +0000839static PyObject *
840BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000841{
Guido van Rossum73624e91994-10-10 17:59:00 +0000842 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000843 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000844 if (s->sock_fd != -1) {
845 Py_BEGIN_ALLOW_THREADS
846 (void) close(s->sock_fd);
847 Py_END_ALLOW_THREADS
848 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000849 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000850 Py_INCREF(Py_None);
851 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000852}
853
Guido van Rossum82a5c661998-07-07 20:45:43 +0000854static char close_doc[] =
855"close()\n\
856\n\
857Close the socket. It cannot be used after this call.";
858
Guido van Rossum30a685f1991-06-27 15:51:29 +0000859
860/* s.connect(sockaddr) method */
861
Guido van Rossum73624e91994-10-10 17:59:00 +0000862static PyObject *
863BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000864{
865 struct sockaddr *addr;
866 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000867 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000868 if (!getsockaddrarg(s, args, &addr, &addrlen))
869 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000870 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000871 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000872 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000873 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000874 return PySocket_Err();
875 Py_INCREF(Py_None);
876 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000877}
878
Guido van Rossum82a5c661998-07-07 20:45:43 +0000879static char connect_doc[] =
880"connect(address)\n\
881\n\
882Connect the socket to a remote address. For IP sockets, the address\n\
883is a pair (host, port).";
884
Guido van Rossum30a685f1991-06-27 15:51:29 +0000885
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000886/* s.connect_ex(sockaddr) method */
887
888static PyObject *
889BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
890{
891 struct sockaddr *addr;
892 int addrlen;
893 int res;
894 if (!getsockaddrarg(s, args, &addr, &addrlen))
895 return NULL;
896 Py_BEGIN_ALLOW_THREADS
897 res = connect(s->sock_fd, addr, addrlen);
898 Py_END_ALLOW_THREADS
899 if (res != 0)
900 res = errno;
901 return PyInt_FromLong((long) res);
902}
903
Guido van Rossum82a5c661998-07-07 20:45:43 +0000904static char connect_ex_doc[] =
905"connect_ex(address)\n\
906\n\
907This is like connect(address), but returns an error code (the errno value)\n\
908instead of raising an exception when an error occurs.";
909
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000910
Guido van Rossumed233a51992-06-23 09:07:03 +0000911/* s.fileno() method */
912
Guido van Rossum73624e91994-10-10 17:59:00 +0000913static PyObject *
914BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000915{
Guido van Rossum73624e91994-10-10 17:59:00 +0000916 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000917 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000918 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000919}
920
Guido van Rossum82a5c661998-07-07 20:45:43 +0000921static char fileno_doc[] =
922"fileno() -> integer\n\
923\n\
924Return the integer file descriptor of the socket.";
925
Guido van Rossumed233a51992-06-23 09:07:03 +0000926
Guido van Rossumbe32c891996-06-20 16:25:29 +0000927#ifndef NO_DUP
928/* s.dup() method */
929
930static PyObject *
931BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
932{
933 int newfd;
934 PyObject *sock;
935 if (!PyArg_NoArgs(args))
936 return NULL;
937 newfd = dup(s->sock_fd);
938 if (newfd < 0)
939 return PySocket_Err();
940 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000941 s->sock_family,
942 s->sock_type,
943 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000944 if (sock == NULL)
945 close(newfd);
946 return sock;
947}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000948
949static char dup_doc[] =
950"dup() -> socket object\n\
951\n\
952Return a new socket object connected to the same system resource.";
953
Guido van Rossumbe32c891996-06-20 16:25:29 +0000954#endif
955
956
Guido van Rossumc89705d1992-11-26 08:54:07 +0000957/* s.getsockname() method */
958
Guido van Rossum73624e91994-10-10 17:59:00 +0000959static PyObject *
960BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000961{
962 char addrbuf[256];
963 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000964 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000965 return NULL;
966 if (!getsockaddrlen(s, &addrlen))
967 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000968 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000969 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000970 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000971 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000972 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000973 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000974 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
975}
976
Guido van Rossum82a5c661998-07-07 20:45:43 +0000977static char getsockname_doc[] =
978"getsockname() -> address info\n\
979\n\
980Return the address of the local endpoint. For IP sockets, the address\n\
981info is a pair (hostaddr, port).";
982
Guido van Rossumc89705d1992-11-26 08:54:07 +0000983
Guido van Rossumb6775db1994-08-01 11:34:53 +0000984#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000985/* s.getpeername() method */
986
Guido van Rossum73624e91994-10-10 17:59:00 +0000987static PyObject *
988BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000989{
990 char addrbuf[256];
991 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000992 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000993 return NULL;
994 if (!getsockaddrlen(s, &addrlen))
995 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000996 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000997 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000998 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000999 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001000 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001001 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1002}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001003
1004static char getpeername_doc[] =
1005"getpeername() -> address info\n\
1006\n\
1007Return the address of the remote endpoint. For IP sockets, the address\n\
1008info is a pair (hostaddr, port).";
1009
Guido van Rossumb6775db1994-08-01 11:34:53 +00001010#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001011
1012
Guido van Rossum30a685f1991-06-27 15:51:29 +00001013/* s.listen(n) method */
1014
Guido van Rossum73624e91994-10-10 17:59:00 +00001015static PyObject *
1016BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001017{
1018 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001019 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +00001020 if (!PyArg_Parse(args, "i", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001021 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001022 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001023 if (backlog < 1)
1024 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001025 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001026 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001027 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001028 return PySocket_Err();
1029 Py_INCREF(Py_None);
1030 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001031}
1032
Guido van Rossum82a5c661998-07-07 20:45:43 +00001033static char listen_doc[] =
1034"listen(backlog)\n\
1035\n\
1036Enable a server to accept connections. The backlog argument must be at\n\
1037least 1; it specifies the number of unaccepted connection that the system\n\
1038will allow before refusing new connections.";
1039
1040
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001041#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001042/* s.makefile(mode) method.
1043 Create a new open file object referring to a dupped version of
1044 the socket's file descriptor. (The dup() call is necessary so
1045 that the open file and socket objects may be closed independent
1046 of each other.)
1047 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1048
Guido van Rossum73624e91994-10-10 17:59:00 +00001049static PyObject *
1050BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001051{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001052 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +00001053 char *mode = "r";
1054 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001055 int fd;
1056 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001057 PyObject *f;
1058
1059 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001060 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001061#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001062 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1063 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001064#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001065 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001066#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001067 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001068 if (fd >= 0)
1069 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001070 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001071 }
1072 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1073 if (f != NULL)
1074 PyFile_SetBufSize(f, bufsize);
1075 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001076}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001077
1078static char makefile_doc[] =
1079"makefile([mode[, buffersize]]) -> file object\n\
1080\n\
1081Return a regular file object corresponding to the socket.\n\
1082The mode and buffersize arguments are as for the built-in open() function.";
1083
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001084#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001085
Guido van Rossum82a5c661998-07-07 20:45:43 +00001086
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001087/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001088
Guido van Rossum73624e91994-10-10 17:59:00 +00001089static PyObject *
1090BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001091{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001092 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001093 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001094 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1095 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001096 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001097 if (buf == NULL)
1098 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001099 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001100 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001101 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001102 if (n < 0) {
1103 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001104 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001105 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001106 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001107 return NULL;
1108 return buf;
1109}
1110
Guido van Rossum82a5c661998-07-07 20:45:43 +00001111static char recv_doc[] =
1112"recv(buffersize[, flags]) -> data\n\
1113\n\
1114Receive up to buffersize bytes from the socket. For the optional flags\n\
1115argument, see the Unix manual. When no data is available, block until\n\
1116at least one byte is available or until the remote end is closed. When\n\
1117the remote end is closed and all data is read, return the empty string.";
1118
Guido van Rossum30a685f1991-06-27 15:51:29 +00001119
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001120/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001121
Guido van Rossum73624e91994-10-10 17:59:00 +00001122static PyObject *
1123BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001124{
1125 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001126 PyObject *buf = NULL;
1127 PyObject *addr = NULL;
1128 PyObject *ret = NULL;
1129
Guido van Rossumbe32c891996-06-20 16:25:29 +00001130 int addrlen, len, n, flags = 0;
1131 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1132 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001133 if (!getsockaddrlen(s, &addrlen))
1134 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001135 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001136 if (buf == NULL)
1137 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001138 Py_BEGIN_ALLOW_THREADS
1139 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001140#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001141#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001142 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001143#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001144 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001145#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001146#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001147 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001148#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001149 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001150 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001151 if (n < 0) {
1152 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001153 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001154 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001155 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001156 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001157
1158 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1159 goto finally;
1160
Guido van Rossum73624e91994-10-10 17:59:00 +00001161 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001162 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001163 Py_XDECREF(addr);
1164 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001165 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001166}
1167
Guido van Rossum82a5c661998-07-07 20:45:43 +00001168static char recvfrom_doc[] =
1169"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1170\n\
1171Like recv(buffersize, flags) but also return the sender's address info.";
1172
Guido van Rossum30a685f1991-06-27 15:51:29 +00001173
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001174/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001175
Guido van Rossum73624e91994-10-10 17:59:00 +00001176static PyObject *
1177BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001178{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001179 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001180 int len, n, flags = 0;
1181 if (!PyArg_ParseTuple(args, "s#|i", &buf, &len, &flags))
1182 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001183 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001184 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001185 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001186 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001187 return PySocket_Err();
1188 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001189}
1190
Guido van Rossum82a5c661998-07-07 20:45:43 +00001191static char send_doc[] =
1192"send(data[, flags])\n\
1193\n\
1194Send a data string to the socket. For the optional flags\n\
1195argument, see the Unix manual.";
1196
Guido van Rossum30a685f1991-06-27 15:51:29 +00001197
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001198/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001199
Guido van Rossum73624e91994-10-10 17:59:00 +00001200static PyObject *
1201BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001202{
Guido van Rossum73624e91994-10-10 17:59:00 +00001203 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001204 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001205 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001206 int addrlen, len, n, flags;
1207 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001208 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
1209 PyErr_Clear();
1210 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001211 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001212 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001213 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001214 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001215 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001216 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001217 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001218 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001219 return PySocket_Err();
1220 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001221}
1222
Guido van Rossum82a5c661998-07-07 20:45:43 +00001223static char sendto_doc[] =
1224"sendto(data[, flags], address)\n\
1225\n\
1226Like send(data, flags) but allows specifying the destination address.\n\
1227For IP sockets, the address is a pair (hostaddr, port).";
1228
Guido van Rossum30a685f1991-06-27 15:51:29 +00001229
1230/* s.shutdown(how) method */
1231
Guido van Rossum73624e91994-10-10 17:59:00 +00001232static PyObject *
1233BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001234{
1235 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001236 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +00001237 if (!PyArg_Parse(args, "i", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001238 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001239 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001240 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001241 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001242 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001243 return PySocket_Err();
1244 Py_INCREF(Py_None);
1245 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001246}
1247
Guido van Rossum82a5c661998-07-07 20:45:43 +00001248static char shutdown_doc[] =
1249"shutdown(flag)\n\
1250\n\
1251Shut down the reading side of the socket (flag == 0), the writing side\n\
1252of the socket (flag == 1), or both ends (flag == 2).";
1253
Guido van Rossum30a685f1991-06-27 15:51:29 +00001254
1255/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001256
Guido van Rossum73624e91994-10-10 17:59:00 +00001257static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001258 {"accept", (PyCFunction)PySocketSock_accept, 0,
1259 accept_doc},
1260 {"bind", (PyCFunction)PySocketSock_bind, 0,
1261 bind_doc},
1262 {"close", (PyCFunction)PySocketSock_close, 0,
1263 close_doc},
1264 {"connect", (PyCFunction)PySocketSock_connect, 0,
1265 connect_doc},
1266 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 0,
1267 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001268#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001269 {"dup", (PyCFunction)PySocketSock_dup, 0,
1270 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001271#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001272 {"fileno", (PyCFunction)PySocketSock_fileno, 0,
1273 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001274#ifdef HAVE_GETPEERNAME
Guido van Rossum82a5c661998-07-07 20:45:43 +00001275 {"getpeername", (PyCFunction)PySocketSock_getpeername, 0,
1276 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001277#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001278 {"getsockname", (PyCFunction)PySocketSock_getsockname, 0,
1279 getsockname_doc},
1280 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1281 getsockopt_doc},
1282 {"listen", (PyCFunction)PySocketSock_listen, 0,
1283 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001284#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001285 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1286 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001287#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001288 {"recv", (PyCFunction)PySocketSock_recv, 1,
1289 recv_doc},
1290 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1291 recvfrom_doc},
1292 {"send", (PyCFunction)PySocketSock_send, 1,
1293 send_doc},
1294 {"sendto", (PyCFunction)PySocketSock_sendto, 0,
1295 sendto_doc},
1296 {"setblocking", (PyCFunction)PySocketSock_setblocking, 0,
1297 setblocking_doc},
1298 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 0,
1299 setsockopt_doc},
1300 {"shutdown", (PyCFunction)PySocketSock_shutdown, 0,
1301 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001302 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001303};
1304
Guido van Rossum30a685f1991-06-27 15:51:29 +00001305
Guido van Rossum73624e91994-10-10 17:59:00 +00001306/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001307 First close the file description. */
1308
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001309static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001310BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001311{
1312 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001313 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001314}
1315
Guido van Rossum30a685f1991-06-27 15:51:29 +00001316
1317/* Return a socket object's named attribute. */
1318
Guido van Rossum73624e91994-10-10 17:59:00 +00001319static PyObject *
1320BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001321{
Guido van Rossum73624e91994-10-10 17:59:00 +00001322 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001323}
1324
Guido van Rossum30a685f1991-06-27 15:51:29 +00001325
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001326static PyObject *
1327BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1328{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001329 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001330 sprintf(buf,
1331 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1332 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001333 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001334}
1335
1336
Guido van Rossumb6775db1994-08-01 11:34:53 +00001337/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001338
Guido van Rossum73624e91994-10-10 17:59:00 +00001339static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001340 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001341 0,
1342 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001343 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001344 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001345 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001346 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001347 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001348 0, /*tp_setattr*/
1349 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001350 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001351 0, /*tp_as_number*/
1352 0, /*tp_as_sequence*/
1353 0, /*tp_as_mapping*/
1354};
1355
Guido van Rossum30a685f1991-06-27 15:51:29 +00001356
Guido van Rossum81194471991-07-27 21:42:02 +00001357/* Python interface to gethostname(). */
1358
1359/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001360static PyObject *
1361BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001362{
1363 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001364 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001365 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +00001366 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001367 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001368 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001369 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001370 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001371 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001372 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001373 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001374}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001375
Guido van Rossum82a5c661998-07-07 20:45:43 +00001376static char gethostname_doc[] =
1377"gethostname() -> string\n\
1378\n\
1379Return the current host name.";
1380
Guido van Rossumff4949e1992-08-05 19:58:53 +00001381
Guido van Rossum30a685f1991-06-27 15:51:29 +00001382/* Python interface to gethostbyname(name). */
1383
1384/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001385static PyObject *
1386BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001387{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001388 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001389 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001390 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001391 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001392 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001393 return NULL;
1394 return makeipaddr(&addrbuf);
1395}
1396
Guido van Rossum82a5c661998-07-07 20:45:43 +00001397static char gethostbyname_doc[] =
1398"gethostbyname(host) -> address\n\
1399\n\
1400Return the IP address (a string of the form '255.255.255.255') for a host.";
1401
1402
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001403/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1404
1405static PyObject *
1406gethost_common(h, addr)
1407 struct hostent *h;
1408 struct sockaddr_in *addr;
1409{
1410 char **pch;
1411 PyObject *rtn_tuple = (PyObject *)NULL;
1412 PyObject *name_list = (PyObject *)NULL;
1413 PyObject *addr_list = (PyObject *)NULL;
1414 PyObject *tmp;
1415 if (h == NULL) {
1416#ifdef HAVE_HSTRERROR
1417 /* Let's get real error message to return */
1418 extern int h_errno;
1419 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1420#else
1421 PyErr_SetString(PySocket_Error, "host not found");
1422#endif
1423 return NULL;
1424 }
1425 if ((name_list = PyList_New(0)) == NULL)
1426 goto err;
1427 if ((addr_list = PyList_New(0)) == NULL)
1428 goto err;
1429 for (pch = h->h_aliases; *pch != NULL; pch++) {
1430 int status;
1431 tmp = PyString_FromString(*pch);
1432 if (tmp == NULL)
1433 goto err;
1434 status = PyList_Append(name_list, tmp);
1435 Py_DECREF(tmp);
1436 if (status)
1437 goto err;
1438 }
1439 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1440 int status;
1441 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1442 tmp = makeipaddr(addr);
1443 if (tmp == NULL)
1444 goto err;
1445 status = PyList_Append(addr_list, tmp);
1446 Py_DECREF(tmp);
1447 if (status)
1448 goto err;
1449 }
1450 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1451 err:
1452 Py_XDECREF(name_list);
1453 Py_XDECREF(addr_list);
1454 return rtn_tuple;
1455}
1456
1457
1458/* Python interface to gethostbyname_ex(name). */
1459
1460/*ARGSUSED*/
1461static PyObject *
1462BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1463{
1464 char *name;
1465 struct hostent *h;
1466 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001467 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001468#ifdef HAVE_GETHOSTBYNAME_R
1469 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001470#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1471 struct hostent_data data;
1472#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001473 char buf[16384];
1474 int buf_len = (sizeof buf) - 1;
1475 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001476#endif
1477#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001478 int result;
1479#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001480#endif /* HAVE_GETHOSTBYNAME_R */
1481 if (!PyArg_Parse(args, "s", &name))
1482 return NULL;
1483 if (setipaddr(name, &addr) < 0)
1484 return NULL;
1485 Py_BEGIN_ALLOW_THREADS
1486#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001487#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001488 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001489#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001490 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001491#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001492 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001493 result = gethostbyname_r(name, &hp_allocated, &data);
1494 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001495#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001496#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001497#ifdef USE_GETHOSTBYNAME_LOCK
1498 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001499#endif
1500 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001501#endif /* HAVE_GETHOSTBYNAME_R */
1502 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001503 ret = gethost_common(h, &addr);
1504#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001505 PyThread_release_lock(gethostbyname_lock);
1506#endif
1507 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001508}
1509
1510static char ghbn_ex_doc[] =
1511"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1512\n\
1513Return the true host name, a list of aliases, and a list of IP addresses,\n\
1514for a host. The host argument is a string giving a host name or IP number.";
1515
1516
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001517/* Python interface to gethostbyaddr(IP). */
1518
1519/*ARGSUSED*/
1520static PyObject *
1521BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1522{
1523 struct sockaddr_in addr;
1524 char *ip_num;
1525 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001526 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001527#ifdef HAVE_GETHOSTBYNAME_R
1528 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001529#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1530 struct hostent_data data;
1531#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001532 char buf[16384];
1533 int buf_len = (sizeof buf) - 1;
1534 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001535#endif
1536#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001537 int result;
1538#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001539#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001540
1541 if (!PyArg_Parse(args, "s", &ip_num))
1542 return NULL;
1543 if (setipaddr(ip_num, &addr) < 0)
1544 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001545 Py_BEGIN_ALLOW_THREADS
1546#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001547#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001548 result = gethostbyaddr_r((char *)&addr.sin_addr,
1549 sizeof(addr.sin_addr),
1550 AF_INET, &hp_allocated, buf, buf_len,
1551 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001552#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001553 h = gethostbyaddr_r((char *)&addr.sin_addr,
1554 sizeof(addr.sin_addr),
1555 AF_INET,
1556 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001557#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001558 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001559 result = gethostbyaddr_r((char *)&addr.sin_addr,
1560 sizeof(addr.sin_addr),
1561 AF_INET, &hp_allocated, &data);
1562 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001563#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001564#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001565#ifdef USE_GETHOSTBYNAME_LOCK
1566 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001567#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001568 h = gethostbyaddr((char *)&addr.sin_addr,
1569 sizeof(addr.sin_addr),
1570 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001571#endif /* HAVE_GETHOSTBYNAME_R */
1572 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001573 ret = gethost_common(h, &addr);
1574#ifdef USE_GETHOSTBYNAME_LOCK
1575 PyThread_release_lock(gethostbyname_lock);
1576#endif
1577 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001578}
1579
Guido van Rossum82a5c661998-07-07 20:45:43 +00001580static char gethostbyaddr_doc[] =
1581"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1582\n\
1583Return the true host name, a list of aliases, and a list of IP addresses,\n\
1584for a host. The host argument is a string giving a host name or IP number.";
1585
Guido van Rossum30a685f1991-06-27 15:51:29 +00001586
1587/* Python interface to getservbyname(name).
1588 This only returns the port number, since the other info is already
1589 known or not useful (like the list of aliases). */
1590
1591/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001592static PyObject *
1593BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001594{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001595 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001596 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001597 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001598 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001599 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001600 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001601 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001602 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001603 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001604 return NULL;
1605 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001606 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001607}
1608
Guido van Rossum82a5c661998-07-07 20:45:43 +00001609static char getservbyname_doc[] =
1610"getservbyname(servicename, protocolname) -> integer\n\
1611\n\
1612Return a port number from a service name and protocol name.\n\
1613The protocol name should be 'tcp' or 'udp'.";
1614
Guido van Rossum30a685f1991-06-27 15:51:29 +00001615
Guido van Rossum3901d851996-12-19 16:35:04 +00001616/* Python interface to getprotobyname(name).
1617 This only returns the protocol number, since the other info is
1618 already known or not useful (like the list of aliases). */
1619
1620/*ARGSUSED*/
1621static PyObject *
1622BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1623{
1624 char *name;
1625 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001626#ifdef __BEOS__
1627/* Not available in BeOS yet. - [cjh] */
1628 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1629 return NULL;
1630#else
Guido van Rossum3901d851996-12-19 16:35:04 +00001631 if (!PyArg_Parse(args, "s", &name))
1632 return NULL;
1633 Py_BEGIN_ALLOW_THREADS
1634 sp = getprotobyname(name);
1635 Py_END_ALLOW_THREADS
1636 if (sp == NULL) {
1637 PyErr_SetString(PySocket_Error, "protocol not found");
1638 return NULL;
1639 }
1640 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001641#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001642}
1643
Guido van Rossum82a5c661998-07-07 20:45:43 +00001644static char getprotobyname_doc[] =
1645"getprotobyname(name) -> integer\n\
1646\n\
1647Return the protocol number for the named protocol. (Rarely used.)";
1648
Guido van Rossum3901d851996-12-19 16:35:04 +00001649
Guido van Rossum30a685f1991-06-27 15:51:29 +00001650/* Python interface to socket(family, type, proto).
1651 The third (protocol) argument is optional.
1652 Return a new socket object. */
1653
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001654/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001655static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001656BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001657{
Guido van Rossum73624e91994-10-10 17:59:00 +00001658 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001659#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001660 SOCKET fd;
1661#else
1662 int fd;
1663#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001664 int family, type, proto = 0;
1665 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1666 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001667 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001668 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001669 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001670#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001671 if (fd == INVALID_SOCKET)
1672#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001673 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001674#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001675 return PySocket_Err();
1676 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001677 /* If the object can't be created, don't forget to close the
1678 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001679 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001680 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001681 /* From now on, ignore SIGPIPE and let the error checking
1682 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001683#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001684 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001685#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001686 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001687}
1688
Guido van Rossum82a5c661998-07-07 20:45:43 +00001689static char socket_doc[] =
1690"socket(family, type[, proto]) -> socket object\n\
1691\n\
1692Open a socket of the given type. The family argument specifies the\n\
1693address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1694The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1695or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1696specifying the default protocol.";
1697
1698
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001699#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001700/* Create a socket object from a numeric file description.
1701 Useful e.g. if stdin is a socket.
1702 Additional arguments as for socket(). */
1703
1704/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001705static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001706BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001707{
Guido van Rossum73624e91994-10-10 17:59:00 +00001708 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001709 int fd, family, type, proto = 0;
1710 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1711 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001712 /* Dup the fd so it and the socket can be closed independently */
1713 fd = dup(fd);
1714 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001715 return PySocket_Err();
1716 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001717 /* From now on, ignore SIGPIPE and let the error checking
1718 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001719#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001720 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001721#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001722 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001723}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001724
1725static char fromfd_doc[] =
1726"fromfd(fd, family, type[, proto]) -> socket object\n\
1727\n\
1728Create a socket object from the given file descriptor.\n\
1729The remaining arguments are the same as for socket().";
1730
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001731#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001732
Guido van Rossum82a5c661998-07-07 20:45:43 +00001733
Guido van Rossum006bf911996-06-12 04:04:55 +00001734static PyObject *
1735BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1736{
1737 int x1, x2;
1738
1739 if (!PyArg_Parse(args, "i", &x1)) {
1740 return NULL;
1741 }
1742 x2 = (int)ntohs((short)x1);
1743 return PyInt_FromLong(x2);
1744}
1745
Guido van Rossum82a5c661998-07-07 20:45:43 +00001746static char ntohs_doc[] =
1747"ntohs(integer) -> integer\n\
1748\n\
1749Convert a 16-bit integer from network to host byte order.";
1750
1751
Guido van Rossum006bf911996-06-12 04:04:55 +00001752static PyObject *
1753BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1754{
1755 int x1, x2;
1756
1757 if (!PyArg_Parse(args, "i", &x1)) {
1758 return NULL;
1759 }
1760 x2 = ntohl(x1);
1761 return PyInt_FromLong(x2);
1762}
1763
Guido van Rossum82a5c661998-07-07 20:45:43 +00001764static char ntohl_doc[] =
1765"ntohl(integer) -> integer\n\
1766\n\
1767Convert a 32-bit integer from network to host byte order.";
1768
1769
Guido van Rossum006bf911996-06-12 04:04:55 +00001770static PyObject *
1771BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1772{
1773 int x1, x2;
1774
1775 if (!PyArg_Parse(args, "i", &x1)) {
1776 return NULL;
1777 }
1778 x2 = (int)htons((short)x1);
1779 return PyInt_FromLong(x2);
1780}
1781
Guido van Rossum82a5c661998-07-07 20:45:43 +00001782static char htons_doc[] =
1783"htons(integer) -> integer\n\
1784\n\
1785Convert a 16-bit integer from host to network byte order.";
1786
1787
Guido van Rossum006bf911996-06-12 04:04:55 +00001788static PyObject *
1789BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1790{
1791 int x1, x2;
1792
1793 if (!PyArg_Parse(args, "i", &x1)) {
1794 return NULL;
1795 }
1796 x2 = htonl(x1);
1797 return PyInt_FromLong(x2);
1798}
1799
Guido van Rossum82a5c661998-07-07 20:45:43 +00001800static char htonl_doc[] =
1801"htonl(integer) -> integer\n\
1802\n\
1803Convert a 32-bit integer from host to network byte order.";
1804
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001805/*
1806 * socket.inet_aton() and socket.inet_ntoa() functions
1807 *
1808 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
1809 *
1810 */
1811
1812static char inet_aton_doc[] =
1813"inet_aton(string) -> packed 32-bit IP representation\n\
1814\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001815Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001816binary format used in low-level network functions.";
1817
1818static PyObject*
1819BUILD_FUNC_DEF_2(PySocket_inet_aton, PyObject *, self, PyObject *, args)
1820{
Guido van Rossuma2e48551999-09-09 15:42:59 +00001821#ifndef INADDR_NONE
1822#define INADDR_NONE (-1)
1823#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001824
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001825 /* Have to use inet_addr() instead */
1826 char *ip_addr;
1827 long packed_addr;
1828
1829 if (!PyArg_Parse(args, "s", &ip_addr)) {
1830 return NULL;
1831 }
1832
1833 packed_addr = inet_addr(ip_addr);
1834
1835 if (packed_addr == INADDR_NONE) { /* invalid address */
1836 PyErr_SetString(PySocket_Error,
1837 "illegal IP address string passed to inet_aton");
1838 return NULL;
1839 }
1840
1841 return PyString_FromStringAndSize((char *) &packed_addr,
1842 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001843}
1844
1845static char inet_ntoa_doc[] =
1846"inet_aton(packed_ip) -> ip_address_string\n\
1847\n\
1848Convert an IP address from 32-bit packed binary format to string format";
1849
1850static PyObject*
1851BUILD_FUNC_DEF_2(PySocket_inet_ntoa, PyObject *, self, PyObject *, args)
1852{
1853 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001854 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001855 struct in_addr packed_addr;
1856
1857 if (!PyArg_Parse(args, "s#", &packed_str, &addr_len)) {
1858 return NULL;
1859 }
1860
1861 if (addr_len != sizeof(packed_addr)) {
1862 PyErr_SetString(PySocket_Error,
1863 "packed IP wrong length for inet_ntoa");
1864 return NULL;
1865 }
1866
1867 memcpy(&packed_addr, packed_str, addr_len);
1868
1869 return PyString_FromString(inet_ntoa(packed_addr));
1870}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001871
Guido van Rossum30a685f1991-06-27 15:51:29 +00001872/* List of functions exported by this module. */
1873
Guido van Rossum73624e91994-10-10 17:59:00 +00001874static PyMethodDef PySocket_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001875 {"gethostbyname", PySocket_gethostbyname, 0, gethostbyname_doc},
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001876 {"gethostbyname_ex", PySocket_gethostbyname_ex, 0, ghbn_ex_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00001877 {"gethostbyaddr", PySocket_gethostbyaddr, 0, gethostbyaddr_doc},
1878 {"gethostname", PySocket_gethostname, 0, gethostname_doc},
1879 {"getservbyname", PySocket_getservbyname, 0, getservbyname_doc},
1880 {"getprotobyname", PySocket_getprotobyname, 0,getprotobyname_doc},
1881 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001882#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001883 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001884#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001885 {"ntohs", PySocket_ntohs, 0, ntohs_doc},
1886 {"ntohl", PySocket_ntohl, 0, ntohl_doc},
1887 {"htons", PySocket_htons, 0, htons_doc},
1888 {"htonl", PySocket_htonl, 0, htonl_doc},
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001889 {"inet_aton", PySocket_inet_aton, 0, inet_aton_doc},
1890 {"inet_ntoa", PySocket_inet_ntoa, 0, inet_ntoa_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001891 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001892};
1893
Guido van Rossum30a685f1991-06-27 15:51:29 +00001894
1895/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00001896 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001897 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00001898 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001899static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001900BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001901{
Guido van Rossum73624e91994-10-10 17:59:00 +00001902 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00001903 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001904 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00001905
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001906 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001907}
1908
Guido van Rossum30a685f1991-06-27 15:51:29 +00001909
Guido van Rossum8d665e61996-06-26 18:22:49 +00001910#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001911
1912/* Additional initialization and cleanup for NT/Windows */
1913
1914static void
1915NTcleanup()
1916{
1917 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001918}
1919
1920static int
1921NTinit()
1922{
1923 WSADATA WSAData;
1924 int ret;
1925 char buf[100];
1926 ret = WSAStartup(0x0101, &WSAData);
1927 switch (ret) {
1928 case 0: /* no error */
1929 atexit(NTcleanup);
1930 return 1;
1931 case WSASYSNOTREADY:
1932 PyErr_SetString(PyExc_ImportError,
1933 "WSAStartup failed: network not ready");
1934 break;
1935 case WSAVERNOTSUPPORTED:
1936 case WSAEINVAL:
1937 PyErr_SetString(PyExc_ImportError,
1938 "WSAStartup failed: requested version not supported");
1939 break;
1940 default:
1941 sprintf(buf, "WSAStartup failed: error code %d", ret);
1942 PyErr_SetString(PyExc_ImportError, buf);
1943 break;
1944 }
1945 return 0;
1946}
1947
Guido van Rossum8d665e61996-06-26 18:22:49 +00001948#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00001949
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001950#if defined(PYOS_OS2)
1951
1952/* Additional initialization and cleanup for OS/2 */
1953
1954static void
1955OS2cleanup()
1956{
1957 /* No cleanup is necessary for OS/2 Sockets */
1958}
1959
1960static int
1961OS2init()
1962{
1963 char reason[64];
1964 int rc = sock_init();
1965
1966 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00001967 atexit(OS2cleanup);
1968 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001969 }
1970
1971 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
1972 PyErr_SetString(PyExc_ImportError, reason);
1973
Guido van Rossum32c575d1997-12-02 20:37:32 +00001974 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001975}
1976
1977#endif /* PYOS_OS2 */
1978
Guido van Rossumbe32c891996-06-20 16:25:29 +00001979
Guido van Rossum30a685f1991-06-27 15:51:29 +00001980/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001981 * This is called when the first 'import socket' is done,
1982 * via a table in config.c, if config.c is compiled with USE_SOCKET
1983 * defined.
1984 *
1985 * For MS_WINDOWS (which means any Windows variant), this module
1986 * is actually called "_socket", and there's a wrapper "socket.py"
1987 * which implements some missing functionality (such as makefile(),
1988 * dup() and fromfd()). The import of "_socket" may fail with an
1989 * ImportError exception if initialization of WINSOCK fails. When
1990 * WINSOCK is initialized succesfully, a call to WSACleanup() is
1991 * scheduled to be made at exit time.
1992 *
1993 * For OS/2, this module is also called "_socket" and uses a wrapper
1994 * "socket.py" which implements that functionality that is missing
1995 * when PC operating systems don't put socket descriptors in the
1996 * operating system's filesystem layer.
1997 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001998
Guido van Rossum82a5c661998-07-07 20:45:43 +00001999static char module_doc[] =
2000"This module provides socket operations and some related functions.\n\
2001On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
2002On other systems, it only supports IP.\n\
2003\n\
2004Functions:\n\
2005\n\
2006socket() -- create a new socket object\n\
2007fromfd() -- create a socket object from an open file descriptor (*)\n\
2008gethostname() -- return the current hostname\n\
2009gethostbyname() -- map a hostname to its IP number\n\
2010gethostbyaddr() -- map an IP number or hostname to DNS info\n\
2011getservbyname() -- map a service name and a protocol name to a port number\n\
2012getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
2013ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
2014htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002015inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format\n\
2016inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002017\n\
2018(*) not available on all platforms!)\n\
2019\n\
2020Special objects:\n\
2021\n\
2022SocketType -- type object for socket objects\n\
2023error -- exception raised for I/O errors\n\
2024\n\
2025Integer constants:\n\
2026\n\
2027AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
2028SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
2029\n\
2030Many other constants may be defined; these may be used in calls to\n\
2031the setsockopt() and getsockopt() methods.\n\
2032";
2033
2034static char sockettype_doc[] =
2035"A socket represents one endpoint of a network connection.\n\
2036\n\
2037Methods:\n\
2038\n\
2039accept() -- accept a connection, returning new socket and client address\n\
2040bind() -- bind the socket to a local address\n\
2041close() -- close the socket\n\
2042connect() -- connect the socket to a remote address\n\
2043connect_ex() -- connect, return an error code instead of an exception \n\
2044dup() -- return a new socket object identical to the current one (*)\n\
2045fileno() -- return underlying file descriptor\n\
2046getpeername() -- return remote address (*)\n\
2047getsockname() -- return local address\n\
2048getsockopt() -- get socket options\n\
2049listen() -- start listening for incoming connections\n\
2050makefile() -- return a file object corresponding tot the socket (*)\n\
2051recv() -- receive data\n\
2052recvfrom() -- receive data and sender's address\n\
2053send() -- send data\n\
2054sendto() -- send data to a given address\n\
2055setblocking() -- set or clear the blocking I/O flag\n\
2056setsockopt() -- set socket options\n\
2057shutdown() -- shut down traffic in one or both directions\n\
2058\n\
2059(*) not available on all platforms!)";
2060
Guido van Rossum3886bb61998-12-04 18:50:17 +00002061DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00002062#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002063init_socket()
2064#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002065initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00002066#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002067{
Guido van Rossum73624e91994-10-10 17:59:00 +00002068 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00002069#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002070 if (!NTinit())
2071 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002072 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002073#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002074#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002075 if (!OS2init())
2076 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002077 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002078#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00002079#if defined(__BEOS__)
2080 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
2081#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002082 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002083#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00002084#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00002085#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002086 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002087 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2088 if (PySocket_Error == NULL)
2089 return;
2090 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002091 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002092 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002093 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002094 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002095 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002096 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002097
2098 /* Address families (we only support AF_INET and AF_UNIX) */
2099#ifdef AF_UNSPEC
2100 insint(d, "AF_UNSPEC", AF_UNSPEC);
2101#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002102 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002103#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002104 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002105#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002106#ifdef AF_AX25
2107 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2108#endif
2109#ifdef AF_IPX
2110 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2111#endif
2112#ifdef AF_APPLETALK
2113 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2114#endif
2115#ifdef AF_NETROM
2116 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2117#endif
2118#ifdef AF_BRIDGE
2119 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2120#endif
2121#ifdef AF_AAL5
2122 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2123#endif
2124#ifdef AF_X25
2125 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2126#endif
2127#ifdef AF_INET6
2128 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2129#endif
2130#ifdef AF_ROSE
2131 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2132#endif
2133
2134 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002135 insint(d, "SOCK_STREAM", SOCK_STREAM);
2136 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002137#ifndef __BEOS__
2138/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002139 insint(d, "SOCK_RAW", SOCK_RAW);
2140 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2141 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002142#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002143
2144#ifdef SO_DEBUG
2145 insint(d, "SO_DEBUG", SO_DEBUG);
2146#endif
2147#ifdef SO_ACCEPTCONN
2148 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2149#endif
2150#ifdef SO_REUSEADDR
2151 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2152#endif
2153#ifdef SO_KEEPALIVE
2154 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2155#endif
2156#ifdef SO_DONTROUTE
2157 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2158#endif
2159#ifdef SO_BROADCAST
2160 insint(d, "SO_BROADCAST", SO_BROADCAST);
2161#endif
2162#ifdef SO_USELOOPBACK
2163 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2164#endif
2165#ifdef SO_LINGER
2166 insint(d, "SO_LINGER", SO_LINGER);
2167#endif
2168#ifdef SO_OOBINLINE
2169 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2170#endif
2171#ifdef SO_REUSEPORT
2172 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2173#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002174#ifdef SO_SNDBUF
2175 insint(d, "SO_SNDBUF", SO_SNDBUF);
2176#endif
2177#ifdef SO_RCVBUF
2178 insint(d, "SO_RCVBUF", SO_RCVBUF);
2179#endif
2180#ifdef SO_SNDLOWAT
2181 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2182#endif
2183#ifdef SO_RCVLOWAT
2184 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2185#endif
2186#ifdef SO_SNDTIMEO
2187 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2188#endif
2189#ifdef SO_RCVTIMEO
2190 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2191#endif
2192#ifdef SO_ERROR
2193 insint(d, "SO_ERROR", SO_ERROR);
2194#endif
2195#ifdef SO_TYPE
2196 insint(d, "SO_TYPE", SO_TYPE);
2197#endif
2198
2199 /* Maximum number of connections for "listen" */
2200#ifdef SOMAXCONN
2201 insint(d, "SOMAXCONN", SOMAXCONN);
2202#else
2203 insint(d, "SOMAXCONN", 5); /* Common value */
2204#endif
2205
2206 /* Flags for send, recv */
2207#ifdef MSG_OOB
2208 insint(d, "MSG_OOB", MSG_OOB);
2209#endif
2210#ifdef MSG_PEEK
2211 insint(d, "MSG_PEEK", MSG_PEEK);
2212#endif
2213#ifdef MSG_DONTROUTE
2214 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2215#endif
2216#ifdef MSG_EOR
2217 insint(d, "MSG_EOR", MSG_EOR);
2218#endif
2219#ifdef MSG_TRUNC
2220 insint(d, "MSG_TRUNC", MSG_TRUNC);
2221#endif
2222#ifdef MSG_CTRUNC
2223 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2224#endif
2225#ifdef MSG_WAITALL
2226 insint(d, "MSG_WAITALL", MSG_WAITALL);
2227#endif
2228#ifdef MSG_BTAG
2229 insint(d, "MSG_BTAG", MSG_BTAG);
2230#endif
2231#ifdef MSG_ETAG
2232 insint(d, "MSG_ETAG", MSG_ETAG);
2233#endif
2234
2235 /* Protocol level and numbers, usable for [gs]etsockopt */
2236#ifdef SOL_SOCKET
2237 insint(d, "SOL_SOCKET", SOL_SOCKET);
2238#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002239#ifdef SOL_IP
2240 insint(d, "SOL_IP", SOL_IP);
2241#else
2242 insint(d, "SOL_IP", 0);
2243#endif
2244#ifdef SOL_IPX
2245 insint(d, "SOL_IPX", SOL_IPX);
2246#endif
2247#ifdef SOL_AX25
2248 insint(d, "SOL_AX25", SOL_AX25);
2249#endif
2250#ifdef SOL_ATALK
2251 insint(d, "SOL_ATALK", SOL_ATALK);
2252#endif
2253#ifdef SOL_NETROM
2254 insint(d, "SOL_NETROM", SOL_NETROM);
2255#endif
2256#ifdef SOL_ROSE
2257 insint(d, "SOL_ROSE", SOL_ROSE);
2258#endif
2259#ifdef SOL_TCP
2260 insint(d, "SOL_TCP", SOL_TCP);
2261#else
2262 insint(d, "SOL_TCP", 6);
2263#endif
2264#ifdef SOL_UDP
2265 insint(d, "SOL_UDP", SOL_UDP);
2266#else
2267 insint(d, "SOL_UDP", 17);
2268#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002269#ifdef IPPROTO_IP
2270 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002271#else
2272 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002273#endif
2274#ifdef IPPROTO_ICMP
2275 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002276#else
2277 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002278#endif
2279#ifdef IPPROTO_IGMP
2280 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2281#endif
2282#ifdef IPPROTO_GGP
2283 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2284#endif
2285#ifdef IPPROTO_TCP
2286 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002287#else
2288 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002289#endif
2290#ifdef IPPROTO_EGP
2291 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2292#endif
2293#ifdef IPPROTO_PUP
2294 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2295#endif
2296#ifdef IPPROTO_UDP
2297 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002298#else
2299 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002300#endif
2301#ifdef IPPROTO_IDP
2302 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2303#endif
2304#ifdef IPPROTO_HELLO
2305 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2306#endif
2307#ifdef IPPROTO_ND
2308 insint(d, "IPPROTO_ND", IPPROTO_ND);
2309#endif
2310#ifdef IPPROTO_TP
2311 insint(d, "IPPROTO_TP", IPPROTO_TP);
2312#endif
2313#ifdef IPPROTO_XTP
2314 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2315#endif
2316#ifdef IPPROTO_EON
2317 insint(d, "IPPROTO_EON", IPPROTO_EON);
2318#endif
2319#ifdef IPPROTO_BIP
2320 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2321#endif
2322/**/
2323#ifdef IPPROTO_RAW
2324 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002325#else
2326 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002327#endif
2328#ifdef IPPROTO_MAX
2329 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2330#endif
2331
2332 /* Some port configuration */
2333#ifdef IPPORT_RESERVED
2334 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2335#else
2336 insint(d, "IPPORT_RESERVED", 1024);
2337#endif
2338#ifdef IPPORT_USERRESERVED
2339 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2340#else
2341 insint(d, "IPPORT_USERRESERVED", 5000);
2342#endif
2343
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002344 /* Some reserved IP v.4 addresses */
2345#ifdef INADDR_ANY
2346 insint(d, "INADDR_ANY", INADDR_ANY);
2347#else
2348 insint(d, "INADDR_ANY", 0x00000000);
2349#endif
2350#ifdef INADDR_BROADCAST
2351 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2352#else
2353 insint(d, "INADDR_BROADCAST", 0xffffffff);
2354#endif
2355#ifdef INADDR_LOOPBACK
2356 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2357#else
2358 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2359#endif
2360#ifdef INADDR_UNSPEC_GROUP
2361 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2362#else
2363 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2364#endif
2365#ifdef INADDR_ALLHOSTS_GROUP
2366 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2367#else
2368 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2369#endif
2370#ifdef INADDR_MAX_LOCAL_GROUP
2371 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2372#else
2373 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2374#endif
2375#ifdef INADDR_NONE
2376 insint(d, "INADDR_NONE", INADDR_NONE);
2377#else
2378 insint(d, "INADDR_NONE", 0xffffffff);
2379#endif
2380
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002381 /* IP [gs]etsockopt options */
2382#ifdef IP_OPTIONS
2383 insint(d, "IP_OPTIONS", IP_OPTIONS);
2384#endif
2385#ifdef IP_HDRINCL
2386 insint(d, "IP_HDRINCL", IP_HDRINCL);
2387#endif
2388#ifdef IP_TOS
2389 insint(d, "IP_TOS", IP_TOS);
2390#endif
2391#ifdef IP_TTL
2392 insint(d, "IP_TTL", IP_TTL);
2393#endif
2394#ifdef IP_RECVOPTS
2395 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2396#endif
2397#ifdef IP_RECVRETOPTS
2398 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2399#endif
2400#ifdef IP_RECVDSTADDR
2401 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2402#endif
2403#ifdef IP_RETOPTS
2404 insint(d, "IP_RETOPTS", IP_RETOPTS);
2405#endif
2406#ifdef IP_MULTICAST_IF
2407 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2408#endif
2409#ifdef IP_MULTICAST_TTL
2410 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2411#endif
2412#ifdef IP_MULTICAST_LOOP
2413 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2414#endif
2415#ifdef IP_ADD_MEMBERSHIP
2416 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2417#endif
2418#ifdef IP_DROP_MEMBERSHIP
2419 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2420#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002421#ifdef IP_DEFAULT_MULTICAST_TTL
2422 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2423#endif
2424#ifdef IP_DEFAULT_MULTICAST_LOOP
2425 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2426#endif
2427#ifdef IP_MAX_MEMBERSHIPS
2428 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2429#endif
2430
2431 /* TCP options */
2432#ifdef TCP_NODELAY
2433 insint(d, "TCP_NODELAY", TCP_NODELAY);
2434#endif
2435#ifdef TCP_MAXSEG
2436 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2437#endif
2438
2439 /* IPX options */
2440#ifdef IPX_TYPE
2441 insint(d, "IPX_TYPE", IPX_TYPE);
2442#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002443
2444 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002445#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002446 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002447#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002448}