blob: 4f63434bebf2238f4cb20b3f9e15844ac4e7f449 [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 Rossum1b6e4631999-11-04 18:22:29 +0000168#ifndef macintosh
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000169#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000170#endif
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000171#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000172
Guido van Rossume4485b01994-09-07 14:32:49 +0000173#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000174#else
175#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000176#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000177#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000178#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000179#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000180#else
181#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000182#endif
183
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000184#ifndef O_NDELAY
185#define O_NDELAY O_NONBLOCK /* For QNX only? */
186#endif
187
Jack Jansen508537b1996-02-14 15:57:45 +0000188#ifdef USE_GUSI
189/* fdopen() isn't declared in stdio.h (sigh) */
190#include <GUSI.h>
191#endif
192
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000193
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000194/* Here we have some hacks to choose between K&R or ANSI style function
195 definitions. For NT to build this as an extension module (ie, DLL)
196 it must be compiled by the C++ compiler, as it takes the address of
197 a static data item exported from the main Python DLL.
198*/
Guido van Rossumbcc20741998-08-04 22:53:56 +0000199#if defined(MS_WINDOWS) || defined(__BEOS__)
200/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000201/* seem to be a few differences in the API */
202#define close closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000203#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000204#define FORCE_ANSI_FUNC_DEFS
205#endif
206
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000207#if defined(PYOS_OS2)
208#define close soclose
209#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
210#define FORCE_ANSI_FUNC_DEFS
211#endif
212
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000213#ifdef FORCE_ANSI_FUNC_DEFS
214#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
215fnname( arg1type arg1name )
216
217#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
218fnname( arg1type arg1name, arg2type arg2name )
219
220#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
221fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
222
223#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
224fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
225
226#else /* !FORCE_ANSI_FN_DEFS */
227#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
228fnname( arg1name ) \
229 arg1type arg1name;
230
231#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
232fnname( arg1name, arg2name ) \
233 arg1type arg1name; \
234 arg2type arg2name;
235
236#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
237fnname( arg1name, arg2name, arg3name ) \
238 arg1type arg1name; \
239 arg2type arg2name; \
240 arg3type arg3name;
241
242#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
243fnname( arg1name, arg2name, arg3name, arg4name ) \
244 arg1type arg1name; \
245 arg2type arg2name; \
246 arg3type arg3name; \
247 arg4type arg4name;
248
249#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000250
251/* Global variable holding the exception type for errors detected
252 by this module (but not argument type or memory errors, etc.). */
253
Guido van Rossum73624e91994-10-10 17:59:00 +0000254static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000255
256
257/* Convenience function to raise an error according to errno
258 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000259
Guido van Rossum73624e91994-10-10 17:59:00 +0000260static PyObject *
261PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000262{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000263#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000264 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000265 PyObject *v;
266 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000267 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000268 PyErr_SetObject(PySocket_Error, v);
269 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000270 }
271 return NULL;
272 }
273 else
274#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000275
276#if defined(PYOS_OS2)
277 if (sock_errno() != NO_ERROR) {
278 APIRET rc;
279 ULONG msglen;
280 char outbuf[100];
281 int myerrorcode = sock_errno();
282
283 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
284 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
285 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
286 if (rc == NO_ERROR) {
287 PyObject *v;
288
289 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
290 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
291 char *lastc = &outbuf[ strlen(outbuf)-1 ];
292 while (lastc > outbuf && isspace(*lastc))
293 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
294 }
295 v = Py_BuildValue("(is)", myerrorcode, outbuf);
296 if (v != NULL) {
297 PyErr_SetObject(PySocket_Error, v);
298 Py_DECREF(v);
299 }
300 return NULL;
301 }
302 }
303#endif
304
Guido van Rossum73624e91994-10-10 17:59:00 +0000305 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000306}
307
Guido van Rossum30a685f1991-06-27 15:51:29 +0000308
309/* The object holding a socket. It holds some extra information,
310 like the address family, which is used to decode socket address
311 arguments properly. */
312
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000313typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000314 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000315 int sock_fd; /* Socket file descriptor */
316 int sock_family; /* Address family, e.g., AF_INET */
317 int sock_type; /* Socket type, e.g., SOCK_STREAM */
318 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000319 union sock_addr {
320 struct sockaddr_in in;
321#ifdef AF_UNIX
322 struct sockaddr_un un;
323#endif
324 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000325} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000326
Guido van Rossum30a685f1991-06-27 15:51:29 +0000327
328/* A forward reference to the Socktype type object.
329 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000330 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000331 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000332
Guido van Rossum73624e91994-10-10 17:59:00 +0000333staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000334
Guido van Rossum30a685f1991-06-27 15:51:29 +0000335
336/* Create a new socket object.
337 This just creates the object and initializes it.
338 If the creation fails, return NULL and set an exception (implicit
339 in NEWOBJ()). */
340
Guido van Rossum73624e91994-10-10 17:59:00 +0000341static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000342BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000343{
Guido van Rossum73624e91994-10-10 17:59:00 +0000344 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000345 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000346 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000347 if (s != NULL) {
348 s->sock_fd = fd;
349 s->sock_family = family;
350 s->sock_type = type;
351 s->sock_proto = proto;
352 }
353 return s;
354}
355
Guido van Rossum30a685f1991-06-27 15:51:29 +0000356
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000357/* Lock to allow python interpreter to continue, but only allow one
358 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000359#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000360PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000361#endif
362
363
Guido van Rossum30a685f1991-06-27 15:51:29 +0000364/* Convert a string specifying a host name or one of a few symbolic
365 names to a numeric IP address. This usually calls gethostbyname()
366 to do the work; the names "" and "<broadcast>" are special.
367 Return the length (should always be 4 bytes), or negative if
368 an error occurred; then an exception is raised. */
369
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000370static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000371BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000372{
373 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000374 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000375 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000376 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000377#ifdef HAVE_GETHOSTBYNAME_R
378 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000379#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
380 struct hostent_data data;
381#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000382 char buf[1001];
383 int buf_len = (sizeof buf) - 1;
384 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000385#endif
386#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000387 int result;
388#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000389#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000390
Guido van Rossuma376cc51996-12-05 23:43:35 +0000391 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000392 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000393 addr_ret->sin_addr.s_addr = INADDR_ANY;
394 return 4;
395 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000396 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000397 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
398 return 4;
399 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000400 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
401 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
402 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
403 addr_ret->sin_addr.s_addr = htonl(
404 ((long) d1 << 24) | ((long) d2 << 16) |
405 ((long) d3 << 8) | ((long) d4 << 0));
406 return 4;
407 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000408 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000409#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000410#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000411 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000412#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000413 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000414#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000415 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000416 result = gethostbyname_r(name, &hp_allocated, &data);
417 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000418#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000419#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000420#ifdef USE_GETHOSTBYNAME_LOCK
421 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000422#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000423 hp = gethostbyname(name);
424#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000425 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000426
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000427 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000428#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000429 /* Let's get real error message to return */
430 extern int h_errno;
431 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
432#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000433 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000434#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000435#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000436 PyThread_release_lock(gethostbyname_lock);
437#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000438 return -1;
439 }
440 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000441 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000442#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000443 PyThread_release_lock(gethostbyname_lock);
444#endif
445 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000446}
447
Guido van Rossum30a685f1991-06-27 15:51:29 +0000448
Guido van Rossum30a685f1991-06-27 15:51:29 +0000449/* Create a string object representing an IP address.
450 This is always a string of the form 'dd.dd.dd.dd' (with variable
451 size numbers). */
452
Guido van Rossum73624e91994-10-10 17:59:00 +0000453static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000454BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000455{
456 long x = ntohl(addr->sin_addr.s_addr);
457 char buf[100];
458 sprintf(buf, "%d.%d.%d.%d",
459 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
460 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000461 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000462}
463
464
465/* Create an object representing the given socket address,
466 suitable for passing it back to bind(), connect() etc.
467 The family field of the sockaddr structure is inspected
468 to determine what kind of address it really is. */
469
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000470/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000471static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000472BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000473{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000474 if (addrlen == 0) {
475 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000476 Py_INCREF(Py_None);
477 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000478 }
479
Guido van Rossumbcc20741998-08-04 22:53:56 +0000480#ifdef __BEOS__
481 /* XXX: BeOS version of accept() doesn't set family coreectly */
482 addr->sa_family = AF_INET;
483#endif
484
Guido van Rossum30a685f1991-06-27 15:51:29 +0000485 switch (addr->sa_family) {
486
487 case AF_INET:
488 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000489 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000490 PyObject *addrobj = makeipaddr(a);
491 PyObject *ret = NULL;
492 if (addrobj) {
493 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
494 Py_DECREF(addrobj);
495 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000496 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000497 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000498
Guido van Rossumb6775db1994-08-01 11:34:53 +0000499#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000500 case AF_UNIX:
501 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000502 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000503 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000504 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000505#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000506
507 /* More cases here... */
508
509 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000510 /* If we don't know the address family, don't raise an
511 exception -- return it as a tuple. */
512 return Py_BuildValue("is#",
513 addr->sa_family,
514 addr->sa_data,
515 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000516
Guido van Rossum30a685f1991-06-27 15:51:29 +0000517 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000518}
519
Guido van Rossum30a685f1991-06-27 15:51:29 +0000520
521/* Parse a socket address argument according to the socket object's
522 address family. Return 1 if the address was in the proper format,
523 0 of not. The address is returned through addr_ret, its length
524 through len_ret. */
525
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000526static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000527BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000528getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000529{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000530 switch (s->sock_family) {
531
Guido van Rossumb6775db1994-08-01 11:34:53 +0000532#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000533 case AF_UNIX:
534 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000535 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000536 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000537 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000538 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000539 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000540 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000541 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000542 PyErr_SetString(PySocket_Error,
543 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000544 return 0;
545 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000546 addr->sun_family = AF_UNIX;
547 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000548 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000549 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000550 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000551 return 1;
552 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000553#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000554
Guido van Rossum30a685f1991-06-27 15:51:29 +0000555 case AF_INET:
556 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000557 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000558 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000559 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000560 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000561 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000562 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000563 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000564 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000565 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000566 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000567 *addr_ret = (struct sockaddr *) addr;
568 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000569 return 1;
570 }
571
Guido van Rossum30a685f1991-06-27 15:51:29 +0000572 /* More cases here... */
573
574 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000575 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000576 return 0;
577
578 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000579}
580
Guido van Rossum30a685f1991-06-27 15:51:29 +0000581
Guido van Rossum710e1df1992-06-12 10:39:36 +0000582/* Get the address length according to the socket object's address family.
583 Return 1 if the family is known, 0 otherwise. The length is returned
584 through len_ret. */
585
586static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000587BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000588{
589 switch (s->sock_family) {
590
Guido van Rossumb6775db1994-08-01 11:34:53 +0000591#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000592 case AF_UNIX:
593 {
594 *len_ret = sizeof (struct sockaddr_un);
595 return 1;
596 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000597#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000598
599 case AF_INET:
600 {
601 *len_ret = sizeof (struct sockaddr_in);
602 return 1;
603 }
604
605 /* More cases here... */
606
607 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000608 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000609 return 0;
610
611 }
612}
613
614
Guido van Rossum30a685f1991-06-27 15:51:29 +0000615/* s.accept() method */
616
Guido van Rossum73624e91994-10-10 17:59:00 +0000617static PyObject *
618BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000619{
620 char addrbuf[256];
621 int addrlen, newfd;
Barry Warsaw752300b1997-01-03 17:18:10 +0000622 PyObject *sock = NULL;
623 PyObject *addr = NULL;
624 PyObject *res = NULL;
625
Guido van Rossum73624e91994-10-10 17:59:00 +0000626 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000627 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000628 if (!getsockaddrlen(s, &addrlen))
629 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000630 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000631 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000632 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000633 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000634 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000635
Guido van Rossum30a685f1991-06-27 15:51:29 +0000636 /* Create the new object with unspecified family,
637 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000638 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000639 s->sock_family,
640 s->sock_type,
641 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000642 if (sock == NULL) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000643 close(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000644 goto finally;
645 }
646 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
647 goto finally;
648
649 if (!(res = Py_BuildValue("OO", sock, addr)))
650 goto finally;
651
652 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000653 Py_XDECREF(sock);
654 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000655 return res;
656}
657
Guido van Rossum82a5c661998-07-07 20:45:43 +0000658static char accept_doc[] =
659"accept() -> (socket object, address info)\n\
660\n\
661Wait for an incoming connection. Return a new socket representing the\n\
662connection, and the address of the client. For IP sockets, the address\n\
663info is a pair (hostaddr, port).";
664
Guido van Rossum30a685f1991-06-27 15:51:29 +0000665
Guido van Rossume4485b01994-09-07 14:32:49 +0000666/* s.setblocking(1 | 0) method */
667
Guido van Rossum73624e91994-10-10 17:59:00 +0000668static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000669BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000670{
671 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000672#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000673 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000674#endif
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000675 if (!PyArg_Parse(args, "i", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000676 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000677 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000678#ifdef __BEOS__
679 block = !block;
680 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
681 (void *)(&block), sizeof( int ) );
682#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000683#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000684#ifdef PYOS_OS2
685 block = !block;
686 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
687#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000688 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
689 if (block)
690 delay_flag &= (~O_NDELAY);
691 else
692 delay_flag |= O_NDELAY;
693 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000694#endif /* !PYOS_OS2 */
695#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000696 block = !block;
697 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000698#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000699#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000700 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000701
Guido van Rossum73624e91994-10-10 17:59:00 +0000702 Py_INCREF(Py_None);
703 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000704}
Guido van Rossume4485b01994-09-07 14:32:49 +0000705
Guido van Rossum82a5c661998-07-07 20:45:43 +0000706static char setblocking_doc[] =
707"setblocking(flag)\n\
708\n\
709Set the socket to blocking (flag is true) or non-blocking (false).\n\
710This uses the FIONBIO ioctl with the O_NDELAY flag.";
711
Guido van Rossume4485b01994-09-07 14:32:49 +0000712
Guido van Rossumaee08791992-09-08 09:05:33 +0000713/* s.setsockopt() method.
714 With an integer third argument, sets an integer option.
715 With a string third argument, sets an option from a buffer;
716 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000717
Guido van Rossum73624e91994-10-10 17:59:00 +0000718static PyObject *
719BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000720{
721 int level;
722 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000723 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000724 char *buf;
725 int buflen;
726 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000727
Guido van Rossum73624e91994-10-10 17:59:00 +0000728 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000729 buf = (char *) &flag;
730 buflen = sizeof flag;
731 }
732 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000733 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +0000734 if (!PyArg_Parse(args, "(iis#)", &level, &optname,
735 &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000736 return NULL;
737 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000738 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000739 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000740 return PySocket_Err();
741 Py_INCREF(Py_None);
742 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000743}
744
Guido van Rossum82a5c661998-07-07 20:45:43 +0000745static char setsockopt_doc[] =
746"setsockopt(level, option, value)\n\
747\n\
748Set a socket option. See the Unix manual for level and option.\n\
749The value argument can either be an integer or a string.";
750
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000751
Guido van Rossumaee08791992-09-08 09:05:33 +0000752/* s.getsockopt() method.
753 With two arguments, retrieves an integer option.
754 With a third integer argument, retrieves a string buffer of that size;
755 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000756
Guido van Rossum73624e91994-10-10 17:59:00 +0000757static PyObject *
758BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000759{
760 int level;
761 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000762 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000763 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000764 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000765
Guido van Rossumbcc20741998-08-04 22:53:56 +0000766#ifdef __BEOS__
767/* We have incomplete socket support. */
768 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
769 return NULL;
770#else
771
Guido van Rossumbe32c891996-06-20 16:25:29 +0000772 if (!PyArg_ParseTuple(args, "ii|i", &level, &optname, &buflen))
773 return NULL;
774
775 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000776 int flag = 0;
777 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000778 res = getsockopt(s->sock_fd, level, optname,
779 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000780 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000781 return PySocket_Err();
782 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000783 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000784 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000785 PyErr_SetString(PySocket_Error,
786 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000787 return NULL;
788 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000789 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000790 if (buf == NULL)
791 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000792 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000793 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000794 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000795 Py_DECREF(buf);
796 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000797 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000798 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000799 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000800#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000801}
802
Guido van Rossum82a5c661998-07-07 20:45:43 +0000803static char getsockopt_doc[] =
804"getsockopt(level, option[, buffersize]) -> value\n\
805\n\
806Get a socket option. See the Unix manual for level and option.\n\
807If a nonzero buffersize argument is given, the return value is a\n\
808string of that length; otherwise it is an integer.";
809
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000810
Guido van Rossum30a685f1991-06-27 15:51:29 +0000811/* s.bind(sockaddr) method */
812
Guido van Rossum73624e91994-10-10 17:59:00 +0000813static PyObject *
814BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000815{
816 struct sockaddr *addr;
817 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000818 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000819 if (!getsockaddrarg(s, args, &addr, &addrlen))
820 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000821 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000822 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000823 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000824 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000825 return PySocket_Err();
826 Py_INCREF(Py_None);
827 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000828}
829
Guido van Rossum82a5c661998-07-07 20:45:43 +0000830static char bind_doc[] =
831"bind(address)\n\
832\n\
833Bind the socket to a local address. For IP sockets, the address is a\n\
834pair (host, port); the host must refer to the local host.";
835
Guido van Rossum30a685f1991-06-27 15:51:29 +0000836
837/* s.close() method.
838 Set the file descriptor to -1 so operations tried subsequently
839 will surely fail. */
840
Guido van Rossum73624e91994-10-10 17:59:00 +0000841static PyObject *
842BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000843{
Guido van Rossum73624e91994-10-10 17:59:00 +0000844 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000845 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000846 if (s->sock_fd != -1) {
847 Py_BEGIN_ALLOW_THREADS
848 (void) close(s->sock_fd);
849 Py_END_ALLOW_THREADS
850 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000851 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000852 Py_INCREF(Py_None);
853 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000854}
855
Guido van Rossum82a5c661998-07-07 20:45:43 +0000856static char close_doc[] =
857"close()\n\
858\n\
859Close the socket. It cannot be used after this call.";
860
Guido van Rossum30a685f1991-06-27 15:51:29 +0000861
862/* s.connect(sockaddr) method */
863
Guido van Rossum73624e91994-10-10 17:59:00 +0000864static PyObject *
865BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000866{
867 struct sockaddr *addr;
868 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000869 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000870 if (!getsockaddrarg(s, args, &addr, &addrlen))
871 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000872 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000873 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000874 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000875 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000876 return PySocket_Err();
877 Py_INCREF(Py_None);
878 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000879}
880
Guido van Rossum82a5c661998-07-07 20:45:43 +0000881static char connect_doc[] =
882"connect(address)\n\
883\n\
884Connect the socket to a remote address. For IP sockets, the address\n\
885is a pair (host, port).";
886
Guido van Rossum30a685f1991-06-27 15:51:29 +0000887
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000888/* s.connect_ex(sockaddr) method */
889
890static PyObject *
891BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
892{
893 struct sockaddr *addr;
894 int addrlen;
895 int res;
896 if (!getsockaddrarg(s, args, &addr, &addrlen))
897 return NULL;
898 Py_BEGIN_ALLOW_THREADS
899 res = connect(s->sock_fd, addr, addrlen);
900 Py_END_ALLOW_THREADS
901 if (res != 0)
902 res = errno;
903 return PyInt_FromLong((long) res);
904}
905
Guido van Rossum82a5c661998-07-07 20:45:43 +0000906static char connect_ex_doc[] =
907"connect_ex(address)\n\
908\n\
909This is like connect(address), but returns an error code (the errno value)\n\
910instead of raising an exception when an error occurs.";
911
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000912
Guido van Rossumed233a51992-06-23 09:07:03 +0000913/* s.fileno() method */
914
Guido van Rossum73624e91994-10-10 17:59:00 +0000915static PyObject *
916BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000917{
Guido van Rossum73624e91994-10-10 17:59:00 +0000918 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000919 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000920 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000921}
922
Guido van Rossum82a5c661998-07-07 20:45:43 +0000923static char fileno_doc[] =
924"fileno() -> integer\n\
925\n\
926Return the integer file descriptor of the socket.";
927
Guido van Rossumed233a51992-06-23 09:07:03 +0000928
Guido van Rossumbe32c891996-06-20 16:25:29 +0000929#ifndef NO_DUP
930/* s.dup() method */
931
932static PyObject *
933BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
934{
935 int newfd;
936 PyObject *sock;
937 if (!PyArg_NoArgs(args))
938 return NULL;
939 newfd = dup(s->sock_fd);
940 if (newfd < 0)
941 return PySocket_Err();
942 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000943 s->sock_family,
944 s->sock_type,
945 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000946 if (sock == NULL)
947 close(newfd);
948 return sock;
949}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000950
951static char dup_doc[] =
952"dup() -> socket object\n\
953\n\
954Return a new socket object connected to the same system resource.";
955
Guido van Rossumbe32c891996-06-20 16:25:29 +0000956#endif
957
958
Guido van Rossumc89705d1992-11-26 08:54:07 +0000959/* s.getsockname() method */
960
Guido van Rossum73624e91994-10-10 17:59:00 +0000961static PyObject *
962BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000963{
964 char addrbuf[256];
965 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000966 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000967 return NULL;
968 if (!getsockaddrlen(s, &addrlen))
969 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000970 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000971 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000972 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000973 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000974 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000975 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000976 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
977}
978
Guido van Rossum82a5c661998-07-07 20:45:43 +0000979static char getsockname_doc[] =
980"getsockname() -> address info\n\
981\n\
982Return the address of the local endpoint. For IP sockets, the address\n\
983info is a pair (hostaddr, port).";
984
Guido van Rossumc89705d1992-11-26 08:54:07 +0000985
Guido van Rossumb6775db1994-08-01 11:34:53 +0000986#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000987/* s.getpeername() method */
988
Guido van Rossum73624e91994-10-10 17:59:00 +0000989static PyObject *
990BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000991{
992 char addrbuf[256];
993 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000994 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000995 return NULL;
996 if (!getsockaddrlen(s, &addrlen))
997 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000998 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000999 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001000 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001001 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001002 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001003 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1004}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001005
1006static char getpeername_doc[] =
1007"getpeername() -> address info\n\
1008\n\
1009Return the address of the remote endpoint. For IP sockets, the address\n\
1010info is a pair (hostaddr, port).";
1011
Guido van Rossumb6775db1994-08-01 11:34:53 +00001012#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001013
1014
Guido van Rossum30a685f1991-06-27 15:51:29 +00001015/* s.listen(n) method */
1016
Guido van Rossum73624e91994-10-10 17:59:00 +00001017static PyObject *
1018BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001019{
1020 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001021 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +00001022 if (!PyArg_Parse(args, "i", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001023 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001024 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001025 if (backlog < 1)
1026 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001027 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001028 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001029 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001030 return PySocket_Err();
1031 Py_INCREF(Py_None);
1032 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001033}
1034
Guido van Rossum82a5c661998-07-07 20:45:43 +00001035static char listen_doc[] =
1036"listen(backlog)\n\
1037\n\
1038Enable a server to accept connections. The backlog argument must be at\n\
1039least 1; it specifies the number of unaccepted connection that the system\n\
1040will allow before refusing new connections.";
1041
1042
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001043#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001044/* s.makefile(mode) method.
1045 Create a new open file object referring to a dupped version of
1046 the socket's file descriptor. (The dup() call is necessary so
1047 that the open file and socket objects may be closed independent
1048 of each other.)
1049 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1050
Guido van Rossum73624e91994-10-10 17:59:00 +00001051static PyObject *
1052BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001053{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001054 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +00001055 char *mode = "r";
1056 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001057 int fd;
1058 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001059 PyObject *f;
1060
1061 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001062 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001063#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001064 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1065 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001066#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001067 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001068#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001069 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001070 if (fd >= 0)
1071 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001072 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001073 }
1074 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1075 if (f != NULL)
1076 PyFile_SetBufSize(f, bufsize);
1077 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001078}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001079
1080static char makefile_doc[] =
1081"makefile([mode[, buffersize]]) -> file object\n\
1082\n\
1083Return a regular file object corresponding to the socket.\n\
1084The mode and buffersize arguments are as for the built-in open() function.";
1085
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001086#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001087
Guido van Rossum82a5c661998-07-07 20:45:43 +00001088
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001089/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001090
Guido van Rossum73624e91994-10-10 17:59:00 +00001091static PyObject *
1092BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001093{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001094 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001095 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001096 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1097 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001098 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001099 if (buf == NULL)
1100 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001101 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001102 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001103 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001104 if (n < 0) {
1105 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001106 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001107 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001108 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001109 return NULL;
1110 return buf;
1111}
1112
Guido van Rossum82a5c661998-07-07 20:45:43 +00001113static char recv_doc[] =
1114"recv(buffersize[, flags]) -> data\n\
1115\n\
1116Receive up to buffersize bytes from the socket. For the optional flags\n\
1117argument, see the Unix manual. When no data is available, block until\n\
1118at least one byte is available or until the remote end is closed. When\n\
1119the remote end is closed and all data is read, return the empty string.";
1120
Guido van Rossum30a685f1991-06-27 15:51:29 +00001121
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001122/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001123
Guido van Rossum73624e91994-10-10 17:59:00 +00001124static PyObject *
1125BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001126{
1127 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001128 PyObject *buf = NULL;
1129 PyObject *addr = NULL;
1130 PyObject *ret = NULL;
1131
Guido van Rossumbe32c891996-06-20 16:25:29 +00001132 int addrlen, len, n, flags = 0;
1133 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1134 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001135 if (!getsockaddrlen(s, &addrlen))
1136 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001137 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001138 if (buf == NULL)
1139 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001140 Py_BEGIN_ALLOW_THREADS
1141 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001142#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001143#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001144 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001145#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001146 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001147#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001148#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001149 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001150#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001151 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001152 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001153 if (n < 0) {
1154 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001155 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001156 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001157 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001158 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001159
1160 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1161 goto finally;
1162
Guido van Rossum73624e91994-10-10 17:59:00 +00001163 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001164 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001165 Py_XDECREF(addr);
1166 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001167 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001168}
1169
Guido van Rossum82a5c661998-07-07 20:45:43 +00001170static char recvfrom_doc[] =
1171"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1172\n\
1173Like recv(buffersize, flags) but also return the sender's address info.";
1174
Guido van Rossum30a685f1991-06-27 15:51:29 +00001175
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001176/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001177
Guido van Rossum73624e91994-10-10 17:59:00 +00001178static PyObject *
1179BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001180{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001181 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001182 int len, n, flags = 0;
1183 if (!PyArg_ParseTuple(args, "s#|i", &buf, &len, &flags))
1184 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001185 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001186 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001187 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001188 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001189 return PySocket_Err();
1190 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001191}
1192
Guido van Rossum82a5c661998-07-07 20:45:43 +00001193static char send_doc[] =
1194"send(data[, flags])\n\
1195\n\
1196Send a data string to the socket. For the optional flags\n\
1197argument, see the Unix manual.";
1198
Guido van Rossum30a685f1991-06-27 15:51:29 +00001199
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001200/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001201
Guido van Rossum73624e91994-10-10 17:59:00 +00001202static PyObject *
1203BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001204{
Guido van Rossum73624e91994-10-10 17:59:00 +00001205 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001206 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001207 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001208 int addrlen, len, n, flags;
1209 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001210 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
1211 PyErr_Clear();
1212 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001213 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001214 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001215 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001216 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001217 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001218 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001219 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001220 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001221 return PySocket_Err();
1222 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001223}
1224
Guido van Rossum82a5c661998-07-07 20:45:43 +00001225static char sendto_doc[] =
1226"sendto(data[, flags], address)\n\
1227\n\
1228Like send(data, flags) but allows specifying the destination address.\n\
1229For IP sockets, the address is a pair (hostaddr, port).";
1230
Guido van Rossum30a685f1991-06-27 15:51:29 +00001231
1232/* s.shutdown(how) method */
1233
Guido van Rossum73624e91994-10-10 17:59:00 +00001234static PyObject *
1235BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001236{
1237 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001238 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +00001239 if (!PyArg_Parse(args, "i", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001240 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001241 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001242 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001243 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001244 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001245 return PySocket_Err();
1246 Py_INCREF(Py_None);
1247 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001248}
1249
Guido van Rossum82a5c661998-07-07 20:45:43 +00001250static char shutdown_doc[] =
1251"shutdown(flag)\n\
1252\n\
1253Shut down the reading side of the socket (flag == 0), the writing side\n\
1254of the socket (flag == 1), or both ends (flag == 2).";
1255
Guido van Rossum30a685f1991-06-27 15:51:29 +00001256
1257/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001258
Guido van Rossum73624e91994-10-10 17:59:00 +00001259static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001260 {"accept", (PyCFunction)PySocketSock_accept, 0,
1261 accept_doc},
1262 {"bind", (PyCFunction)PySocketSock_bind, 0,
1263 bind_doc},
1264 {"close", (PyCFunction)PySocketSock_close, 0,
1265 close_doc},
1266 {"connect", (PyCFunction)PySocketSock_connect, 0,
1267 connect_doc},
1268 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 0,
1269 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001270#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001271 {"dup", (PyCFunction)PySocketSock_dup, 0,
1272 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001273#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001274 {"fileno", (PyCFunction)PySocketSock_fileno, 0,
1275 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001276#ifdef HAVE_GETPEERNAME
Guido van Rossum82a5c661998-07-07 20:45:43 +00001277 {"getpeername", (PyCFunction)PySocketSock_getpeername, 0,
1278 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001279#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001280 {"getsockname", (PyCFunction)PySocketSock_getsockname, 0,
1281 getsockname_doc},
1282 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1283 getsockopt_doc},
1284 {"listen", (PyCFunction)PySocketSock_listen, 0,
1285 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001286#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001287 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1288 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001289#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001290 {"recv", (PyCFunction)PySocketSock_recv, 1,
1291 recv_doc},
1292 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1293 recvfrom_doc},
1294 {"send", (PyCFunction)PySocketSock_send, 1,
1295 send_doc},
1296 {"sendto", (PyCFunction)PySocketSock_sendto, 0,
1297 sendto_doc},
1298 {"setblocking", (PyCFunction)PySocketSock_setblocking, 0,
1299 setblocking_doc},
1300 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 0,
1301 setsockopt_doc},
1302 {"shutdown", (PyCFunction)PySocketSock_shutdown, 0,
1303 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001304 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001305};
1306
Guido van Rossum30a685f1991-06-27 15:51:29 +00001307
Guido van Rossum73624e91994-10-10 17:59:00 +00001308/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001309 First close the file description. */
1310
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001311static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001312BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001313{
1314 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001315 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001316}
1317
Guido van Rossum30a685f1991-06-27 15:51:29 +00001318
1319/* Return a socket object's named attribute. */
1320
Guido van Rossum73624e91994-10-10 17:59:00 +00001321static PyObject *
1322BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001323{
Guido van Rossum73624e91994-10-10 17:59:00 +00001324 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001325}
1326
Guido van Rossum30a685f1991-06-27 15:51:29 +00001327
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001328static PyObject *
1329BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1330{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001331 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001332 sprintf(buf,
1333 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1334 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001335 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001336}
1337
1338
Guido van Rossumb6775db1994-08-01 11:34:53 +00001339/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001340
Guido van Rossum73624e91994-10-10 17:59:00 +00001341static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001342 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001343 0,
1344 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001345 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001346 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001347 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001348 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001349 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001350 0, /*tp_setattr*/
1351 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001352 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001353 0, /*tp_as_number*/
1354 0, /*tp_as_sequence*/
1355 0, /*tp_as_mapping*/
1356};
1357
Guido van Rossum30a685f1991-06-27 15:51:29 +00001358
Guido van Rossum81194471991-07-27 21:42:02 +00001359/* Python interface to gethostname(). */
1360
1361/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001362static PyObject *
1363BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001364{
1365 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001366 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001367 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +00001368 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001369 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001370 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001371 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001372 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001373 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001374 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001375 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001376}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001377
Guido van Rossum82a5c661998-07-07 20:45:43 +00001378static char gethostname_doc[] =
1379"gethostname() -> string\n\
1380\n\
1381Return the current host name.";
1382
Guido van Rossumff4949e1992-08-05 19:58:53 +00001383
Guido van Rossum30a685f1991-06-27 15:51:29 +00001384/* Python interface to gethostbyname(name). */
1385
1386/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001387static PyObject *
1388BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001389{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001390 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001391 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001392 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001393 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001394 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001395 return NULL;
1396 return makeipaddr(&addrbuf);
1397}
1398
Guido van Rossum82a5c661998-07-07 20:45:43 +00001399static char gethostbyname_doc[] =
1400"gethostbyname(host) -> address\n\
1401\n\
1402Return the IP address (a string of the form '255.255.255.255') for a host.";
1403
1404
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001405/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1406
1407static PyObject *
1408gethost_common(h, addr)
1409 struct hostent *h;
1410 struct sockaddr_in *addr;
1411{
1412 char **pch;
1413 PyObject *rtn_tuple = (PyObject *)NULL;
1414 PyObject *name_list = (PyObject *)NULL;
1415 PyObject *addr_list = (PyObject *)NULL;
1416 PyObject *tmp;
1417 if (h == NULL) {
1418#ifdef HAVE_HSTRERROR
1419 /* Let's get real error message to return */
1420 extern int h_errno;
1421 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1422#else
1423 PyErr_SetString(PySocket_Error, "host not found");
1424#endif
1425 return NULL;
1426 }
1427 if ((name_list = PyList_New(0)) == NULL)
1428 goto err;
1429 if ((addr_list = PyList_New(0)) == NULL)
1430 goto err;
1431 for (pch = h->h_aliases; *pch != NULL; pch++) {
1432 int status;
1433 tmp = PyString_FromString(*pch);
1434 if (tmp == NULL)
1435 goto err;
1436 status = PyList_Append(name_list, tmp);
1437 Py_DECREF(tmp);
1438 if (status)
1439 goto err;
1440 }
1441 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1442 int status;
1443 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1444 tmp = makeipaddr(addr);
1445 if (tmp == NULL)
1446 goto err;
1447 status = PyList_Append(addr_list, tmp);
1448 Py_DECREF(tmp);
1449 if (status)
1450 goto err;
1451 }
1452 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1453 err:
1454 Py_XDECREF(name_list);
1455 Py_XDECREF(addr_list);
1456 return rtn_tuple;
1457}
1458
1459
1460/* Python interface to gethostbyname_ex(name). */
1461
1462/*ARGSUSED*/
1463static PyObject *
1464BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1465{
1466 char *name;
1467 struct hostent *h;
1468 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001469 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001470#ifdef HAVE_GETHOSTBYNAME_R
1471 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001472#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1473 struct hostent_data data;
1474#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001475 char buf[16384];
1476 int buf_len = (sizeof buf) - 1;
1477 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001478#endif
1479#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001480 int result;
1481#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001482#endif /* HAVE_GETHOSTBYNAME_R */
1483 if (!PyArg_Parse(args, "s", &name))
1484 return NULL;
1485 if (setipaddr(name, &addr) < 0)
1486 return NULL;
1487 Py_BEGIN_ALLOW_THREADS
1488#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001489#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001490 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001491#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001492 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001493#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001494 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001495 result = gethostbyname_r(name, &hp_allocated, &data);
1496 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001497#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001498#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001499#ifdef USE_GETHOSTBYNAME_LOCK
1500 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001501#endif
1502 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001503#endif /* HAVE_GETHOSTBYNAME_R */
1504 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001505 ret = gethost_common(h, &addr);
1506#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001507 PyThread_release_lock(gethostbyname_lock);
1508#endif
1509 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001510}
1511
1512static char ghbn_ex_doc[] =
1513"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1514\n\
1515Return the true host name, a list of aliases, and a list of IP addresses,\n\
1516for a host. The host argument is a string giving a host name or IP number.";
1517
1518
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001519/* Python interface to gethostbyaddr(IP). */
1520
1521/*ARGSUSED*/
1522static PyObject *
1523BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1524{
1525 struct sockaddr_in addr;
1526 char *ip_num;
1527 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001528 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001529#ifdef HAVE_GETHOSTBYNAME_R
1530 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001531#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1532 struct hostent_data data;
1533#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001534 char buf[16384];
1535 int buf_len = (sizeof buf) - 1;
1536 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001537#endif
1538#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001539 int result;
1540#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001541#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001542
1543 if (!PyArg_Parse(args, "s", &ip_num))
1544 return NULL;
1545 if (setipaddr(ip_num, &addr) < 0)
1546 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001547 Py_BEGIN_ALLOW_THREADS
1548#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001549#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001550 result = gethostbyaddr_r((char *)&addr.sin_addr,
1551 sizeof(addr.sin_addr),
1552 AF_INET, &hp_allocated, buf, buf_len,
1553 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001554#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001555 h = gethostbyaddr_r((char *)&addr.sin_addr,
1556 sizeof(addr.sin_addr),
1557 AF_INET,
1558 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001559#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001560 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001561 result = gethostbyaddr_r((char *)&addr.sin_addr,
1562 sizeof(addr.sin_addr),
1563 AF_INET, &hp_allocated, &data);
1564 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001565#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001566#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001567#ifdef USE_GETHOSTBYNAME_LOCK
1568 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001569#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001570 h = gethostbyaddr((char *)&addr.sin_addr,
1571 sizeof(addr.sin_addr),
1572 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001573#endif /* HAVE_GETHOSTBYNAME_R */
1574 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001575 ret = gethost_common(h, &addr);
1576#ifdef USE_GETHOSTBYNAME_LOCK
1577 PyThread_release_lock(gethostbyname_lock);
1578#endif
1579 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001580}
1581
Guido van Rossum82a5c661998-07-07 20:45:43 +00001582static char gethostbyaddr_doc[] =
1583"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1584\n\
1585Return the true host name, a list of aliases, and a list of IP addresses,\n\
1586for a host. The host argument is a string giving a host name or IP number.";
1587
Guido van Rossum30a685f1991-06-27 15:51:29 +00001588
1589/* Python interface to getservbyname(name).
1590 This only returns the port number, since the other info is already
1591 known or not useful (like the list of aliases). */
1592
1593/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001594static PyObject *
1595BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001596{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001597 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001598 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001599 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001600 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001601 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001602 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001603 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001604 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001605 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001606 return NULL;
1607 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001608 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001609}
1610
Guido van Rossum82a5c661998-07-07 20:45:43 +00001611static char getservbyname_doc[] =
1612"getservbyname(servicename, protocolname) -> integer\n\
1613\n\
1614Return a port number from a service name and protocol name.\n\
1615The protocol name should be 'tcp' or 'udp'.";
1616
Guido van Rossum30a685f1991-06-27 15:51:29 +00001617
Guido van Rossum3901d851996-12-19 16:35:04 +00001618/* Python interface to getprotobyname(name).
1619 This only returns the protocol number, since the other info is
1620 already known or not useful (like the list of aliases). */
1621
1622/*ARGSUSED*/
1623static PyObject *
1624BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1625{
1626 char *name;
1627 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001628#ifdef __BEOS__
1629/* Not available in BeOS yet. - [cjh] */
1630 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1631 return NULL;
1632#else
Guido van Rossum3901d851996-12-19 16:35:04 +00001633 if (!PyArg_Parse(args, "s", &name))
1634 return NULL;
1635 Py_BEGIN_ALLOW_THREADS
1636 sp = getprotobyname(name);
1637 Py_END_ALLOW_THREADS
1638 if (sp == NULL) {
1639 PyErr_SetString(PySocket_Error, "protocol not found");
1640 return NULL;
1641 }
1642 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001643#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001644}
1645
Guido van Rossum82a5c661998-07-07 20:45:43 +00001646static char getprotobyname_doc[] =
1647"getprotobyname(name) -> integer\n\
1648\n\
1649Return the protocol number for the named protocol. (Rarely used.)";
1650
Guido van Rossum3901d851996-12-19 16:35:04 +00001651
Guido van Rossum30a685f1991-06-27 15:51:29 +00001652/* Python interface to socket(family, type, proto).
1653 The third (protocol) argument is optional.
1654 Return a new socket object. */
1655
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001656/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001657static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001658BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001659{
Guido van Rossum73624e91994-10-10 17:59:00 +00001660 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001661#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001662 SOCKET fd;
1663#else
1664 int fd;
1665#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001666 int family, type, proto = 0;
1667 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1668 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001669 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001670 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001671 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001672#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001673 if (fd == INVALID_SOCKET)
1674#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001675 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001676#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001677 return PySocket_Err();
1678 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001679 /* If the object can't be created, don't forget to close the
1680 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001681 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001682 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001683 /* From now on, ignore SIGPIPE and let the error checking
1684 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001685#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001686 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001687#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001688 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001689}
1690
Guido van Rossum82a5c661998-07-07 20:45:43 +00001691static char socket_doc[] =
1692"socket(family, type[, proto]) -> socket object\n\
1693\n\
1694Open a socket of the given type. The family argument specifies the\n\
1695address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1696The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1697or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1698specifying the default protocol.";
1699
1700
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001701#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001702/* Create a socket object from a numeric file description.
1703 Useful e.g. if stdin is a socket.
1704 Additional arguments as for socket(). */
1705
1706/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001707static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001708BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001709{
Guido van Rossum73624e91994-10-10 17:59:00 +00001710 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001711 int fd, family, type, proto = 0;
1712 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1713 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001714 /* Dup the fd so it and the socket can be closed independently */
1715 fd = dup(fd);
1716 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001717 return PySocket_Err();
1718 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001719 /* From now on, ignore SIGPIPE and let the error checking
1720 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001721#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001722 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001723#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001724 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001725}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001726
1727static char fromfd_doc[] =
1728"fromfd(fd, family, type[, proto]) -> socket object\n\
1729\n\
1730Create a socket object from the given file descriptor.\n\
1731The remaining arguments are the same as for socket().";
1732
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001733#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001734
Guido van Rossum82a5c661998-07-07 20:45:43 +00001735
Guido van Rossum006bf911996-06-12 04:04:55 +00001736static PyObject *
1737BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1738{
1739 int x1, x2;
1740
1741 if (!PyArg_Parse(args, "i", &x1)) {
1742 return NULL;
1743 }
1744 x2 = (int)ntohs((short)x1);
1745 return PyInt_FromLong(x2);
1746}
1747
Guido van Rossum82a5c661998-07-07 20:45:43 +00001748static char ntohs_doc[] =
1749"ntohs(integer) -> integer\n\
1750\n\
1751Convert a 16-bit integer from network to host byte order.";
1752
1753
Guido van Rossum006bf911996-06-12 04:04:55 +00001754static PyObject *
1755BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1756{
1757 int x1, x2;
1758
1759 if (!PyArg_Parse(args, "i", &x1)) {
1760 return NULL;
1761 }
1762 x2 = ntohl(x1);
1763 return PyInt_FromLong(x2);
1764}
1765
Guido van Rossum82a5c661998-07-07 20:45:43 +00001766static char ntohl_doc[] =
1767"ntohl(integer) -> integer\n\
1768\n\
1769Convert a 32-bit integer from network to host byte order.";
1770
1771
Guido van Rossum006bf911996-06-12 04:04:55 +00001772static PyObject *
1773BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1774{
1775 int x1, x2;
1776
1777 if (!PyArg_Parse(args, "i", &x1)) {
1778 return NULL;
1779 }
1780 x2 = (int)htons((short)x1);
1781 return PyInt_FromLong(x2);
1782}
1783
Guido van Rossum82a5c661998-07-07 20:45:43 +00001784static char htons_doc[] =
1785"htons(integer) -> integer\n\
1786\n\
1787Convert a 16-bit integer from host to network byte order.";
1788
1789
Guido van Rossum006bf911996-06-12 04:04:55 +00001790static PyObject *
1791BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1792{
1793 int x1, x2;
1794
1795 if (!PyArg_Parse(args, "i", &x1)) {
1796 return NULL;
1797 }
1798 x2 = htonl(x1);
1799 return PyInt_FromLong(x2);
1800}
1801
Guido van Rossum82a5c661998-07-07 20:45:43 +00001802static char htonl_doc[] =
1803"htonl(integer) -> integer\n\
1804\n\
1805Convert a 32-bit integer from host to network byte order.";
1806
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001807/*
1808 * socket.inet_aton() and socket.inet_ntoa() functions
1809 *
1810 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
1811 *
1812 */
1813
1814static char inet_aton_doc[] =
1815"inet_aton(string) -> packed 32-bit IP representation\n\
1816\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001817Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001818binary format used in low-level network functions.";
1819
1820static PyObject*
1821BUILD_FUNC_DEF_2(PySocket_inet_aton, PyObject *, self, PyObject *, args)
1822{
Guido van Rossuma2e48551999-09-09 15:42:59 +00001823#ifndef INADDR_NONE
1824#define INADDR_NONE (-1)
1825#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001826
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001827 /* Have to use inet_addr() instead */
1828 char *ip_addr;
1829 long packed_addr;
1830
1831 if (!PyArg_Parse(args, "s", &ip_addr)) {
1832 return NULL;
1833 }
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001834#ifdef macintosh
1835 packed_addr = (long)inet_addr(ip_addr).s_addr;
1836#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001837 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001838#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001839
1840 if (packed_addr == INADDR_NONE) { /* invalid address */
1841 PyErr_SetString(PySocket_Error,
1842 "illegal IP address string passed to inet_aton");
1843 return NULL;
1844 }
1845
1846 return PyString_FromStringAndSize((char *) &packed_addr,
1847 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001848}
1849
1850static char inet_ntoa_doc[] =
1851"inet_aton(packed_ip) -> ip_address_string\n\
1852\n\
1853Convert an IP address from 32-bit packed binary format to string format";
1854
1855static PyObject*
1856BUILD_FUNC_DEF_2(PySocket_inet_ntoa, PyObject *, self, PyObject *, args)
1857{
1858 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001859 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001860 struct in_addr packed_addr;
1861
1862 if (!PyArg_Parse(args, "s#", &packed_str, &addr_len)) {
1863 return NULL;
1864 }
1865
1866 if (addr_len != sizeof(packed_addr)) {
1867 PyErr_SetString(PySocket_Error,
1868 "packed IP wrong length for inet_ntoa");
1869 return NULL;
1870 }
1871
1872 memcpy(&packed_addr, packed_str, addr_len);
1873
1874 return PyString_FromString(inet_ntoa(packed_addr));
1875}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001876
Guido van Rossum30a685f1991-06-27 15:51:29 +00001877/* List of functions exported by this module. */
1878
Guido van Rossum73624e91994-10-10 17:59:00 +00001879static PyMethodDef PySocket_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001880 {"gethostbyname", PySocket_gethostbyname, 0, gethostbyname_doc},
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001881 {"gethostbyname_ex", PySocket_gethostbyname_ex, 0, ghbn_ex_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00001882 {"gethostbyaddr", PySocket_gethostbyaddr, 0, gethostbyaddr_doc},
1883 {"gethostname", PySocket_gethostname, 0, gethostname_doc},
1884 {"getservbyname", PySocket_getservbyname, 0, getservbyname_doc},
1885 {"getprotobyname", PySocket_getprotobyname, 0,getprotobyname_doc},
1886 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001887#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001888 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001889#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001890 {"ntohs", PySocket_ntohs, 0, ntohs_doc},
1891 {"ntohl", PySocket_ntohl, 0, ntohl_doc},
1892 {"htons", PySocket_htons, 0, htons_doc},
1893 {"htonl", PySocket_htonl, 0, htonl_doc},
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001894 {"inet_aton", PySocket_inet_aton, 0, inet_aton_doc},
1895 {"inet_ntoa", PySocket_inet_ntoa, 0, inet_ntoa_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001896 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001897};
1898
Guido van Rossum30a685f1991-06-27 15:51:29 +00001899
1900/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00001901 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001902 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00001903 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001904static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001905BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001906{
Guido van Rossum73624e91994-10-10 17:59:00 +00001907 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00001908 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001909 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00001910
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001911 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001912}
1913
Guido van Rossum30a685f1991-06-27 15:51:29 +00001914
Guido van Rossum8d665e61996-06-26 18:22:49 +00001915#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001916
1917/* Additional initialization and cleanup for NT/Windows */
1918
1919static void
1920NTcleanup()
1921{
1922 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001923}
1924
1925static int
1926NTinit()
1927{
1928 WSADATA WSAData;
1929 int ret;
1930 char buf[100];
1931 ret = WSAStartup(0x0101, &WSAData);
1932 switch (ret) {
1933 case 0: /* no error */
1934 atexit(NTcleanup);
1935 return 1;
1936 case WSASYSNOTREADY:
1937 PyErr_SetString(PyExc_ImportError,
1938 "WSAStartup failed: network not ready");
1939 break;
1940 case WSAVERNOTSUPPORTED:
1941 case WSAEINVAL:
1942 PyErr_SetString(PyExc_ImportError,
1943 "WSAStartup failed: requested version not supported");
1944 break;
1945 default:
1946 sprintf(buf, "WSAStartup failed: error code %d", ret);
1947 PyErr_SetString(PyExc_ImportError, buf);
1948 break;
1949 }
1950 return 0;
1951}
1952
Guido van Rossum8d665e61996-06-26 18:22:49 +00001953#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00001954
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001955#if defined(PYOS_OS2)
1956
1957/* Additional initialization and cleanup for OS/2 */
1958
1959static void
1960OS2cleanup()
1961{
1962 /* No cleanup is necessary for OS/2 Sockets */
1963}
1964
1965static int
1966OS2init()
1967{
1968 char reason[64];
1969 int rc = sock_init();
1970
1971 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00001972 atexit(OS2cleanup);
1973 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001974 }
1975
1976 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
1977 PyErr_SetString(PyExc_ImportError, reason);
1978
Guido van Rossum32c575d1997-12-02 20:37:32 +00001979 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001980}
1981
1982#endif /* PYOS_OS2 */
1983
Guido van Rossumbe32c891996-06-20 16:25:29 +00001984
Guido van Rossum30a685f1991-06-27 15:51:29 +00001985/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001986 * This is called when the first 'import socket' is done,
1987 * via a table in config.c, if config.c is compiled with USE_SOCKET
1988 * defined.
1989 *
1990 * For MS_WINDOWS (which means any Windows variant), this module
1991 * is actually called "_socket", and there's a wrapper "socket.py"
1992 * which implements some missing functionality (such as makefile(),
1993 * dup() and fromfd()). The import of "_socket" may fail with an
1994 * ImportError exception if initialization of WINSOCK fails. When
1995 * WINSOCK is initialized succesfully, a call to WSACleanup() is
1996 * scheduled to be made at exit time.
1997 *
1998 * For OS/2, this module is also called "_socket" and uses a wrapper
1999 * "socket.py" which implements that functionality that is missing
2000 * when PC operating systems don't put socket descriptors in the
2001 * operating system's filesystem layer.
2002 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002003
Guido van Rossum82a5c661998-07-07 20:45:43 +00002004static char module_doc[] =
2005"This module provides socket operations and some related functions.\n\
2006On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
2007On other systems, it only supports IP.\n\
2008\n\
2009Functions:\n\
2010\n\
2011socket() -- create a new socket object\n\
2012fromfd() -- create a socket object from an open file descriptor (*)\n\
2013gethostname() -- return the current hostname\n\
2014gethostbyname() -- map a hostname to its IP number\n\
2015gethostbyaddr() -- map an IP number or hostname to DNS info\n\
2016getservbyname() -- map a service name and a protocol name to a port number\n\
2017getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
2018ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
2019htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002020inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format\n\
2021inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002022\n\
2023(*) not available on all platforms!)\n\
2024\n\
2025Special objects:\n\
2026\n\
2027SocketType -- type object for socket objects\n\
2028error -- exception raised for I/O errors\n\
2029\n\
2030Integer constants:\n\
2031\n\
2032AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
2033SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
2034\n\
2035Many other constants may be defined; these may be used in calls to\n\
2036the setsockopt() and getsockopt() methods.\n\
2037";
2038
2039static char sockettype_doc[] =
2040"A socket represents one endpoint of a network connection.\n\
2041\n\
2042Methods:\n\
2043\n\
2044accept() -- accept a connection, returning new socket and client address\n\
2045bind() -- bind the socket to a local address\n\
2046close() -- close the socket\n\
2047connect() -- connect the socket to a remote address\n\
2048connect_ex() -- connect, return an error code instead of an exception \n\
2049dup() -- return a new socket object identical to the current one (*)\n\
2050fileno() -- return underlying file descriptor\n\
2051getpeername() -- return remote address (*)\n\
2052getsockname() -- return local address\n\
2053getsockopt() -- get socket options\n\
2054listen() -- start listening for incoming connections\n\
2055makefile() -- return a file object corresponding tot the socket (*)\n\
2056recv() -- receive data\n\
2057recvfrom() -- receive data and sender's address\n\
2058send() -- send data\n\
2059sendto() -- send data to a given address\n\
2060setblocking() -- set or clear the blocking I/O flag\n\
2061setsockopt() -- set socket options\n\
2062shutdown() -- shut down traffic in one or both directions\n\
2063\n\
2064(*) not available on all platforms!)";
2065
Guido van Rossum3886bb61998-12-04 18:50:17 +00002066DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00002067#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002068init_socket()
2069#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002070initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00002071#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002072{
Guido van Rossum73624e91994-10-10 17:59:00 +00002073 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00002074#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002075 if (!NTinit())
2076 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002077 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002078#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002079#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002080 if (!OS2init())
2081 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002082 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002083#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00002084#if defined(__BEOS__)
2085 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
2086#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002087 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002088#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00002089#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00002090#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002091 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002092 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2093 if (PySocket_Error == NULL)
2094 return;
2095 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002096 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002097 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002098 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002099 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002100 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002101 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002102
2103 /* Address families (we only support AF_INET and AF_UNIX) */
2104#ifdef AF_UNSPEC
2105 insint(d, "AF_UNSPEC", AF_UNSPEC);
2106#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002107 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002108#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002109 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002110#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002111#ifdef AF_AX25
2112 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2113#endif
2114#ifdef AF_IPX
2115 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2116#endif
2117#ifdef AF_APPLETALK
2118 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2119#endif
2120#ifdef AF_NETROM
2121 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2122#endif
2123#ifdef AF_BRIDGE
2124 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2125#endif
2126#ifdef AF_AAL5
2127 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2128#endif
2129#ifdef AF_X25
2130 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2131#endif
2132#ifdef AF_INET6
2133 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2134#endif
2135#ifdef AF_ROSE
2136 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2137#endif
2138
2139 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002140 insint(d, "SOCK_STREAM", SOCK_STREAM);
2141 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002142#ifndef __BEOS__
2143/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002144 insint(d, "SOCK_RAW", SOCK_RAW);
2145 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2146 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002147#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002148
2149#ifdef SO_DEBUG
2150 insint(d, "SO_DEBUG", SO_DEBUG);
2151#endif
2152#ifdef SO_ACCEPTCONN
2153 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2154#endif
2155#ifdef SO_REUSEADDR
2156 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2157#endif
2158#ifdef SO_KEEPALIVE
2159 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2160#endif
2161#ifdef SO_DONTROUTE
2162 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2163#endif
2164#ifdef SO_BROADCAST
2165 insint(d, "SO_BROADCAST", SO_BROADCAST);
2166#endif
2167#ifdef SO_USELOOPBACK
2168 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2169#endif
2170#ifdef SO_LINGER
2171 insint(d, "SO_LINGER", SO_LINGER);
2172#endif
2173#ifdef SO_OOBINLINE
2174 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2175#endif
2176#ifdef SO_REUSEPORT
2177 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2178#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002179#ifdef SO_SNDBUF
2180 insint(d, "SO_SNDBUF", SO_SNDBUF);
2181#endif
2182#ifdef SO_RCVBUF
2183 insint(d, "SO_RCVBUF", SO_RCVBUF);
2184#endif
2185#ifdef SO_SNDLOWAT
2186 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2187#endif
2188#ifdef SO_RCVLOWAT
2189 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2190#endif
2191#ifdef SO_SNDTIMEO
2192 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2193#endif
2194#ifdef SO_RCVTIMEO
2195 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2196#endif
2197#ifdef SO_ERROR
2198 insint(d, "SO_ERROR", SO_ERROR);
2199#endif
2200#ifdef SO_TYPE
2201 insint(d, "SO_TYPE", SO_TYPE);
2202#endif
2203
2204 /* Maximum number of connections for "listen" */
2205#ifdef SOMAXCONN
2206 insint(d, "SOMAXCONN", SOMAXCONN);
2207#else
2208 insint(d, "SOMAXCONN", 5); /* Common value */
2209#endif
2210
2211 /* Flags for send, recv */
2212#ifdef MSG_OOB
2213 insint(d, "MSG_OOB", MSG_OOB);
2214#endif
2215#ifdef MSG_PEEK
2216 insint(d, "MSG_PEEK", MSG_PEEK);
2217#endif
2218#ifdef MSG_DONTROUTE
2219 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2220#endif
2221#ifdef MSG_EOR
2222 insint(d, "MSG_EOR", MSG_EOR);
2223#endif
2224#ifdef MSG_TRUNC
2225 insint(d, "MSG_TRUNC", MSG_TRUNC);
2226#endif
2227#ifdef MSG_CTRUNC
2228 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2229#endif
2230#ifdef MSG_WAITALL
2231 insint(d, "MSG_WAITALL", MSG_WAITALL);
2232#endif
2233#ifdef MSG_BTAG
2234 insint(d, "MSG_BTAG", MSG_BTAG);
2235#endif
2236#ifdef MSG_ETAG
2237 insint(d, "MSG_ETAG", MSG_ETAG);
2238#endif
2239
2240 /* Protocol level and numbers, usable for [gs]etsockopt */
2241#ifdef SOL_SOCKET
2242 insint(d, "SOL_SOCKET", SOL_SOCKET);
2243#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002244#ifdef SOL_IP
2245 insint(d, "SOL_IP", SOL_IP);
2246#else
2247 insint(d, "SOL_IP", 0);
2248#endif
2249#ifdef SOL_IPX
2250 insint(d, "SOL_IPX", SOL_IPX);
2251#endif
2252#ifdef SOL_AX25
2253 insint(d, "SOL_AX25", SOL_AX25);
2254#endif
2255#ifdef SOL_ATALK
2256 insint(d, "SOL_ATALK", SOL_ATALK);
2257#endif
2258#ifdef SOL_NETROM
2259 insint(d, "SOL_NETROM", SOL_NETROM);
2260#endif
2261#ifdef SOL_ROSE
2262 insint(d, "SOL_ROSE", SOL_ROSE);
2263#endif
2264#ifdef SOL_TCP
2265 insint(d, "SOL_TCP", SOL_TCP);
2266#else
2267 insint(d, "SOL_TCP", 6);
2268#endif
2269#ifdef SOL_UDP
2270 insint(d, "SOL_UDP", SOL_UDP);
2271#else
2272 insint(d, "SOL_UDP", 17);
2273#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002274#ifdef IPPROTO_IP
2275 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002276#else
2277 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002278#endif
2279#ifdef IPPROTO_ICMP
2280 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002281#else
2282 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002283#endif
2284#ifdef IPPROTO_IGMP
2285 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2286#endif
2287#ifdef IPPROTO_GGP
2288 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2289#endif
2290#ifdef IPPROTO_TCP
2291 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002292#else
2293 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002294#endif
2295#ifdef IPPROTO_EGP
2296 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2297#endif
2298#ifdef IPPROTO_PUP
2299 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2300#endif
2301#ifdef IPPROTO_UDP
2302 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002303#else
2304 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002305#endif
2306#ifdef IPPROTO_IDP
2307 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2308#endif
2309#ifdef IPPROTO_HELLO
2310 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2311#endif
2312#ifdef IPPROTO_ND
2313 insint(d, "IPPROTO_ND", IPPROTO_ND);
2314#endif
2315#ifdef IPPROTO_TP
2316 insint(d, "IPPROTO_TP", IPPROTO_TP);
2317#endif
2318#ifdef IPPROTO_XTP
2319 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2320#endif
2321#ifdef IPPROTO_EON
2322 insint(d, "IPPROTO_EON", IPPROTO_EON);
2323#endif
2324#ifdef IPPROTO_BIP
2325 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2326#endif
2327/**/
2328#ifdef IPPROTO_RAW
2329 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002330#else
2331 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002332#endif
2333#ifdef IPPROTO_MAX
2334 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2335#endif
2336
2337 /* Some port configuration */
2338#ifdef IPPORT_RESERVED
2339 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2340#else
2341 insint(d, "IPPORT_RESERVED", 1024);
2342#endif
2343#ifdef IPPORT_USERRESERVED
2344 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2345#else
2346 insint(d, "IPPORT_USERRESERVED", 5000);
2347#endif
2348
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002349 /* Some reserved IP v.4 addresses */
2350#ifdef INADDR_ANY
2351 insint(d, "INADDR_ANY", INADDR_ANY);
2352#else
2353 insint(d, "INADDR_ANY", 0x00000000);
2354#endif
2355#ifdef INADDR_BROADCAST
2356 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2357#else
2358 insint(d, "INADDR_BROADCAST", 0xffffffff);
2359#endif
2360#ifdef INADDR_LOOPBACK
2361 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2362#else
2363 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2364#endif
2365#ifdef INADDR_UNSPEC_GROUP
2366 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2367#else
2368 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2369#endif
2370#ifdef INADDR_ALLHOSTS_GROUP
2371 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2372#else
2373 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2374#endif
2375#ifdef INADDR_MAX_LOCAL_GROUP
2376 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2377#else
2378 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2379#endif
2380#ifdef INADDR_NONE
2381 insint(d, "INADDR_NONE", INADDR_NONE);
2382#else
2383 insint(d, "INADDR_NONE", 0xffffffff);
2384#endif
2385
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002386 /* IP [gs]etsockopt options */
2387#ifdef IP_OPTIONS
2388 insint(d, "IP_OPTIONS", IP_OPTIONS);
2389#endif
2390#ifdef IP_HDRINCL
2391 insint(d, "IP_HDRINCL", IP_HDRINCL);
2392#endif
2393#ifdef IP_TOS
2394 insint(d, "IP_TOS", IP_TOS);
2395#endif
2396#ifdef IP_TTL
2397 insint(d, "IP_TTL", IP_TTL);
2398#endif
2399#ifdef IP_RECVOPTS
2400 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2401#endif
2402#ifdef IP_RECVRETOPTS
2403 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2404#endif
2405#ifdef IP_RECVDSTADDR
2406 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2407#endif
2408#ifdef IP_RETOPTS
2409 insint(d, "IP_RETOPTS", IP_RETOPTS);
2410#endif
2411#ifdef IP_MULTICAST_IF
2412 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2413#endif
2414#ifdef IP_MULTICAST_TTL
2415 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2416#endif
2417#ifdef IP_MULTICAST_LOOP
2418 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2419#endif
2420#ifdef IP_ADD_MEMBERSHIP
2421 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2422#endif
2423#ifdef IP_DROP_MEMBERSHIP
2424 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2425#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002426#ifdef IP_DEFAULT_MULTICAST_TTL
2427 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2428#endif
2429#ifdef IP_DEFAULT_MULTICAST_LOOP
2430 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2431#endif
2432#ifdef IP_MAX_MEMBERSHIPS
2433 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2434#endif
2435
2436 /* TCP options */
2437#ifdef TCP_NODELAY
2438 insint(d, "TCP_NODELAY", TCP_NODELAY);
2439#endif
2440#ifdef TCP_MAXSEG
2441 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2442#endif
2443
2444 /* IPX options */
2445#ifdef IPX_TYPE
2446 insint(d, "IPX_TYPE", IPX_TYPE);
2447#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002448
2449 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002450#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002451 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002452#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002453}