blob: 81088ba8a59dc2fd941f7a5cf09a8486ada965e3 [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 Rossume7de2061999-03-24 17:24:33 +000092#undef HAVE_GETHOSTBYNAME_R_3_ARG
93#undef HAVE_GETHOSTBYNAME_R_5_ARG
94#undef HAVE_GETHOSTBYNAME_R_6_ARG
95
Guido van Rossum7a122991999-04-13 04:07:32 +000096#ifndef WITH_THREAD
97#undef HAVE_GETHOSTBYNAME_R
98#endif
99
Guido van Rossume7de2061999-03-24 17:24:33 +0000100#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000101#if defined(_AIX) || defined(__osf__)
Guido van Rossume7de2061999-03-24 17:24:33 +0000102#define HAVE_GETHOSTBYNAME_R_3_ARG
103#elif defined(__sun__) || defined(__sgi)
104#define HAVE_GETHOSTBYNAME_R_5_ARG
105#elif defined(linux)
106#define HAVE_GETHOSTBYNAME_R_6_ARG
107#else
108#undef HAVE_GETHOSTBYNAME_R
109#endif
110#endif
111
Guido van Rossum3baaa131999-03-22 21:44:51 +0000112#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
113#define USE_GETHOSTBYNAME_LOCK
114#endif
115
116#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum49b56061998-10-01 20:42:43 +0000117#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000118#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000119
Guido van Rossuma376cc51996-12-05 23:43:35 +0000120#ifdef HAVE_UNISTD_H
121#include <unistd.h>
122#endif
123
Guido van Rossumbcc20741998-08-04 22:53:56 +0000124#if !defined(MS_WINDOWS) && !defined(PYOS_OS2) && !defined(__BEOS__)
Guido van Rossumfb4130d1996-12-10 15:17:08 +0000125extern int gethostname(); /* For Solaris, at least */
126#endif
127
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000128#if defined(PYCC_VACPP)
129#include <types.h>
130#include <io.h>
131#include <sys/ioctl.h>
132#include <utils.h>
133#include <ctype.h>
134#endif
135
136#if defined(PYOS_OS2)
137#define INCL_DOS
138#define INCL_DOSERRORS
139#define INCL_NOPMAPI
140#include <os2.h>
141#endif
142
Guido van Rossumbcc20741998-08-04 22:53:56 +0000143#if defined(__BEOS__)
144/* It's in the libs, but not the headers... - [cjh] */
145int shutdown( int, int );
146#endif
147
Guido van Rossumb6775db1994-08-01 11:34:53 +0000148#include <sys/types.h>
149#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +0000150
Guido van Rossum81194471991-07-27 21:42:02 +0000151#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000152#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000153#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000154#include <sys/socket.h>
155#include <netinet/in.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000156
157/* added 20 Aug 1999 to remove warnings from inet_ntoa call <che@debian.org> */
158#include <arpa/inet.h>
159
Guido van Rossume4485b01994-09-07 14:32:49 +0000160#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000161#else
162#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000163#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000164#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000165#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000166#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000167#else
168#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000169#endif
170
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000171#ifndef O_NDELAY
172#define O_NDELAY O_NONBLOCK /* For QNX only? */
173#endif
174
Jack Jansen508537b1996-02-14 15:57:45 +0000175#ifdef USE_GUSI
176/* fdopen() isn't declared in stdio.h (sigh) */
177#include <GUSI.h>
178#endif
179
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000180
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000181/* Here we have some hacks to choose between K&R or ANSI style function
182 definitions. For NT to build this as an extension module (ie, DLL)
183 it must be compiled by the C++ compiler, as it takes the address of
184 a static data item exported from the main Python DLL.
185*/
Guido van Rossumbcc20741998-08-04 22:53:56 +0000186#if defined(MS_WINDOWS) || defined(__BEOS__)
187/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000188/* seem to be a few differences in the API */
189#define close closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000190#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000191#define FORCE_ANSI_FUNC_DEFS
192#endif
193
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000194#if defined(PYOS_OS2)
195#define close soclose
196#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
197#define FORCE_ANSI_FUNC_DEFS
198#endif
199
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000200#ifdef FORCE_ANSI_FUNC_DEFS
201#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
202fnname( arg1type arg1name )
203
204#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
205fnname( arg1type arg1name, arg2type arg2name )
206
207#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
208fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
209
210#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
211fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
212
213#else /* !FORCE_ANSI_FN_DEFS */
214#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
215fnname( arg1name ) \
216 arg1type arg1name;
217
218#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
219fnname( arg1name, arg2name ) \
220 arg1type arg1name; \
221 arg2type arg2name;
222
223#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
224fnname( arg1name, arg2name, arg3name ) \
225 arg1type arg1name; \
226 arg2type arg2name; \
227 arg3type arg3name;
228
229#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
230fnname( arg1name, arg2name, arg3name, arg4name ) \
231 arg1type arg1name; \
232 arg2type arg2name; \
233 arg3type arg3name; \
234 arg4type arg4name;
235
236#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000237
238/* Global variable holding the exception type for errors detected
239 by this module (but not argument type or memory errors, etc.). */
240
Guido van Rossum73624e91994-10-10 17:59:00 +0000241static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000242
243
244/* Convenience function to raise an error according to errno
245 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000246
Guido van Rossum73624e91994-10-10 17:59:00 +0000247static PyObject *
248PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000249{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000250#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000251 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000252 PyObject *v;
253 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000254 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000255 PyErr_SetObject(PySocket_Error, v);
256 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000257 }
258 return NULL;
259 }
260 else
261#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000262
263#if defined(PYOS_OS2)
264 if (sock_errno() != NO_ERROR) {
265 APIRET rc;
266 ULONG msglen;
267 char outbuf[100];
268 int myerrorcode = sock_errno();
269
270 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
271 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
272 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
273 if (rc == NO_ERROR) {
274 PyObject *v;
275
276 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
277 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
278 char *lastc = &outbuf[ strlen(outbuf)-1 ];
279 while (lastc > outbuf && isspace(*lastc))
280 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
281 }
282 v = Py_BuildValue("(is)", myerrorcode, outbuf);
283 if (v != NULL) {
284 PyErr_SetObject(PySocket_Error, v);
285 Py_DECREF(v);
286 }
287 return NULL;
288 }
289 }
290#endif
291
Guido van Rossum73624e91994-10-10 17:59:00 +0000292 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000293}
294
Guido van Rossum30a685f1991-06-27 15:51:29 +0000295
296/* The object holding a socket. It holds some extra information,
297 like the address family, which is used to decode socket address
298 arguments properly. */
299
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000300typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000301 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000302 int sock_fd; /* Socket file descriptor */
303 int sock_family; /* Address family, e.g., AF_INET */
304 int sock_type; /* Socket type, e.g., SOCK_STREAM */
305 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000306 union sock_addr {
307 struct sockaddr_in in;
308#ifdef AF_UNIX
309 struct sockaddr_un un;
310#endif
311 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000312} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000313
Guido van Rossum30a685f1991-06-27 15:51:29 +0000314
315/* A forward reference to the Socktype type object.
316 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000317 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000318 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000319
Guido van Rossum73624e91994-10-10 17:59:00 +0000320staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000321
Guido van Rossum30a685f1991-06-27 15:51:29 +0000322
323/* Create a new socket object.
324 This just creates the object and initializes it.
325 If the creation fails, return NULL and set an exception (implicit
326 in NEWOBJ()). */
327
Guido van Rossum73624e91994-10-10 17:59:00 +0000328static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000329BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000330{
Guido van Rossum73624e91994-10-10 17:59:00 +0000331 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000332 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000333 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000334 if (s != NULL) {
335 s->sock_fd = fd;
336 s->sock_family = family;
337 s->sock_type = type;
338 s->sock_proto = proto;
339 }
340 return s;
341}
342
Guido van Rossum30a685f1991-06-27 15:51:29 +0000343
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000344/* Lock to allow python interpreter to continue, but only allow one
345 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000346#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000347PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000348#endif
349
350
Guido van Rossum30a685f1991-06-27 15:51:29 +0000351/* Convert a string specifying a host name or one of a few symbolic
352 names to a numeric IP address. This usually calls gethostbyname()
353 to do the work; the names "" and "<broadcast>" are special.
354 Return the length (should always be 4 bytes), or negative if
355 an error occurred; then an exception is raised. */
356
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000357static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000358BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000359{
360 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000361 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000362 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000363 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000364#ifdef HAVE_GETHOSTBYNAME_R
365 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000366#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
367 struct hostent_data data;
368#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000369 char buf[1001];
370 int buf_len = (sizeof buf) - 1;
371 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000372#endif
373#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000374 int result;
375#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000376#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000377
Guido van Rossuma376cc51996-12-05 23:43:35 +0000378 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000379 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000380 addr_ret->sin_addr.s_addr = INADDR_ANY;
381 return 4;
382 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000383 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000384 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
385 return 4;
386 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000387 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
388 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
389 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
390 addr_ret->sin_addr.s_addr = htonl(
391 ((long) d1 << 24) | ((long) d2 << 16) |
392 ((long) d3 << 8) | ((long) d4 << 0));
393 return 4;
394 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000395 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000396#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000397#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000398 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000399#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000400 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000401#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000402 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000403 result = gethostbyname_r(name, &hp_allocated, &data);
404 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000405#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000406#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000407#ifdef USE_GETHOSTBYNAME_LOCK
408 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000409#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000410 hp = gethostbyname(name);
411#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000412 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000413
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000414 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000415#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000416 /* Let's get real error message to return */
417 extern int h_errno;
418 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
419#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000420 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000421#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000422#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000423 PyThread_release_lock(gethostbyname_lock);
424#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000425 return -1;
426 }
427 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000428 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000429#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000430 PyThread_release_lock(gethostbyname_lock);
431#endif
432 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000433}
434
Guido van Rossum30a685f1991-06-27 15:51:29 +0000435
Guido van Rossum30a685f1991-06-27 15:51:29 +0000436/* Create a string object representing an IP address.
437 This is always a string of the form 'dd.dd.dd.dd' (with variable
438 size numbers). */
439
Guido van Rossum73624e91994-10-10 17:59:00 +0000440static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000441BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000442{
443 long x = ntohl(addr->sin_addr.s_addr);
444 char buf[100];
445 sprintf(buf, "%d.%d.%d.%d",
446 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
447 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000448 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000449}
450
451
452/* Create an object representing the given socket address,
453 suitable for passing it back to bind(), connect() etc.
454 The family field of the sockaddr structure is inspected
455 to determine what kind of address it really is. */
456
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000457/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000458static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000459BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000460{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000461 if (addrlen == 0) {
462 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000463 Py_INCREF(Py_None);
464 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000465 }
466
Guido van Rossumbcc20741998-08-04 22:53:56 +0000467#ifdef __BEOS__
468 /* XXX: BeOS version of accept() doesn't set family coreectly */
469 addr->sa_family = AF_INET;
470#endif
471
Guido van Rossum30a685f1991-06-27 15:51:29 +0000472 switch (addr->sa_family) {
473
474 case AF_INET:
475 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000476 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000477 PyObject *addrobj = makeipaddr(a);
478 PyObject *ret = NULL;
479 if (addrobj) {
480 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
481 Py_DECREF(addrobj);
482 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000483 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000484 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000485
Guido van Rossumb6775db1994-08-01 11:34:53 +0000486#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000487 case AF_UNIX:
488 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000489 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000490 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000491 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000492#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000493
494 /* More cases here... */
495
496 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000497 /* If we don't know the address family, don't raise an
498 exception -- return it as a tuple. */
499 return Py_BuildValue("is#",
500 addr->sa_family,
501 addr->sa_data,
502 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000503
Guido van Rossum30a685f1991-06-27 15:51:29 +0000504 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000505}
506
Guido van Rossum30a685f1991-06-27 15:51:29 +0000507
508/* Parse a socket address argument according to the socket object's
509 address family. Return 1 if the address was in the proper format,
510 0 of not. The address is returned through addr_ret, its length
511 through len_ret. */
512
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000513static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000514BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000515getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000516{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000517 switch (s->sock_family) {
518
Guido van Rossumb6775db1994-08-01 11:34:53 +0000519#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000520 case AF_UNIX:
521 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000522 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000523 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000524 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000525 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000526 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000527 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000528 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000529 PyErr_SetString(PySocket_Error,
530 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000531 return 0;
532 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000533 addr->sun_family = AF_UNIX;
534 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000535 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000536 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000537 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000538 return 1;
539 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000540#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000541
Guido van Rossum30a685f1991-06-27 15:51:29 +0000542 case AF_INET:
543 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000544 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000545 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000546 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000547 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000548 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000549 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000550 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000551 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000552 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000553 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000554 *addr_ret = (struct sockaddr *) addr;
555 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000556 return 1;
557 }
558
Guido van Rossum30a685f1991-06-27 15:51:29 +0000559 /* More cases here... */
560
561 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000562 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000563 return 0;
564
565 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000566}
567
Guido van Rossum30a685f1991-06-27 15:51:29 +0000568
Guido van Rossum710e1df1992-06-12 10:39:36 +0000569/* Get the address length according to the socket object's address family.
570 Return 1 if the family is known, 0 otherwise. The length is returned
571 through len_ret. */
572
573static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000574BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000575{
576 switch (s->sock_family) {
577
Guido van Rossumb6775db1994-08-01 11:34:53 +0000578#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000579 case AF_UNIX:
580 {
581 *len_ret = sizeof (struct sockaddr_un);
582 return 1;
583 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000584#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000585
586 case AF_INET:
587 {
588 *len_ret = sizeof (struct sockaddr_in);
589 return 1;
590 }
591
592 /* More cases here... */
593
594 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000595 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000596 return 0;
597
598 }
599}
600
601
Guido van Rossum30a685f1991-06-27 15:51:29 +0000602/* s.accept() method */
603
Guido van Rossum73624e91994-10-10 17:59:00 +0000604static PyObject *
605BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000606{
607 char addrbuf[256];
608 int addrlen, newfd;
Barry Warsaw752300b1997-01-03 17:18:10 +0000609 PyObject *sock = NULL;
610 PyObject *addr = NULL;
611 PyObject *res = NULL;
612
Guido van Rossum73624e91994-10-10 17:59:00 +0000613 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000614 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000615 if (!getsockaddrlen(s, &addrlen))
616 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000617 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000618 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000619 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000620 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000621 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000622
Guido van Rossum30a685f1991-06-27 15:51:29 +0000623 /* Create the new object with unspecified family,
624 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000625 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000626 s->sock_family,
627 s->sock_type,
628 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000629 if (sock == NULL) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000630 close(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000631 goto finally;
632 }
633 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
634 goto finally;
635
636 if (!(res = Py_BuildValue("OO", sock, addr)))
637 goto finally;
638
639 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000640 Py_XDECREF(sock);
641 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000642 return res;
643}
644
Guido van Rossum82a5c661998-07-07 20:45:43 +0000645static char accept_doc[] =
646"accept() -> (socket object, address info)\n\
647\n\
648Wait for an incoming connection. Return a new socket representing the\n\
649connection, and the address of the client. For IP sockets, the address\n\
650info is a pair (hostaddr, port).";
651
Guido van Rossum30a685f1991-06-27 15:51:29 +0000652
Guido van Rossume4485b01994-09-07 14:32:49 +0000653/* s.setblocking(1 | 0) method */
654
Guido van Rossum73624e91994-10-10 17:59:00 +0000655static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000656BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000657{
658 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000659#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000660 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000661#endif
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000662 if (!PyArg_Parse(args, "i", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000663 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000664 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000665#ifdef __BEOS__
666 block = !block;
667 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
668 (void *)(&block), sizeof( int ) );
669#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000670#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000671#ifdef PYOS_OS2
672 block = !block;
673 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
674#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000675 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
676 if (block)
677 delay_flag &= (~O_NDELAY);
678 else
679 delay_flag |= O_NDELAY;
680 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000681#endif /* !PYOS_OS2 */
682#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000683 block = !block;
684 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000685#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000686#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000687 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000688
Guido van Rossum73624e91994-10-10 17:59:00 +0000689 Py_INCREF(Py_None);
690 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000691}
Guido van Rossume4485b01994-09-07 14:32:49 +0000692
Guido van Rossum82a5c661998-07-07 20:45:43 +0000693static char setblocking_doc[] =
694"setblocking(flag)\n\
695\n\
696Set the socket to blocking (flag is true) or non-blocking (false).\n\
697This uses the FIONBIO ioctl with the O_NDELAY flag.";
698
Guido van Rossume4485b01994-09-07 14:32:49 +0000699
Guido van Rossumaee08791992-09-08 09:05:33 +0000700/* s.setsockopt() method.
701 With an integer third argument, sets an integer option.
702 With a string third argument, sets an option from a buffer;
703 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000704
Guido van Rossum73624e91994-10-10 17:59:00 +0000705static PyObject *
706BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000707{
708 int level;
709 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000710 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000711 char *buf;
712 int buflen;
713 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000714
Guido van Rossum73624e91994-10-10 17:59:00 +0000715 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000716 buf = (char *) &flag;
717 buflen = sizeof flag;
718 }
719 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000720 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +0000721 if (!PyArg_Parse(args, "(iis#)", &level, &optname,
722 &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000723 return NULL;
724 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000725 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000726 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000727 return PySocket_Err();
728 Py_INCREF(Py_None);
729 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000730}
731
Guido van Rossum82a5c661998-07-07 20:45:43 +0000732static char setsockopt_doc[] =
733"setsockopt(level, option, value)\n\
734\n\
735Set a socket option. See the Unix manual for level and option.\n\
736The value argument can either be an integer or a string.";
737
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000738
Guido van Rossumaee08791992-09-08 09:05:33 +0000739/* s.getsockopt() method.
740 With two arguments, retrieves an integer option.
741 With a third integer argument, retrieves a string buffer of that size;
742 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000743
Guido van Rossum73624e91994-10-10 17:59:00 +0000744static PyObject *
745BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000746{
747 int level;
748 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000749 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000750 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000751 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000752
Guido van Rossumbcc20741998-08-04 22:53:56 +0000753#ifdef __BEOS__
754/* We have incomplete socket support. */
755 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
756 return NULL;
757#else
758
Guido van Rossumbe32c891996-06-20 16:25:29 +0000759 if (!PyArg_ParseTuple(args, "ii|i", &level, &optname, &buflen))
760 return NULL;
761
762 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000763 int flag = 0;
764 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000765 res = getsockopt(s->sock_fd, level, optname,
766 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000767 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000768 return PySocket_Err();
769 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000770 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000771 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000772 PyErr_SetString(PySocket_Error,
773 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000774 return NULL;
775 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000776 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000777 if (buf == NULL)
778 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000779 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000780 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000781 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000782 Py_DECREF(buf);
783 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000784 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000785 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000786 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000787#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000788}
789
Guido van Rossum82a5c661998-07-07 20:45:43 +0000790static char getsockopt_doc[] =
791"getsockopt(level, option[, buffersize]) -> value\n\
792\n\
793Get a socket option. See the Unix manual for level and option.\n\
794If a nonzero buffersize argument is given, the return value is a\n\
795string of that length; otherwise it is an integer.";
796
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000797
Guido van Rossum30a685f1991-06-27 15:51:29 +0000798/* s.bind(sockaddr) method */
799
Guido van Rossum73624e91994-10-10 17:59:00 +0000800static PyObject *
801BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000802{
803 struct sockaddr *addr;
804 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000805 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000806 if (!getsockaddrarg(s, args, &addr, &addrlen))
807 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000808 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000809 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000810 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000811 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000812 return PySocket_Err();
813 Py_INCREF(Py_None);
814 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000815}
816
Guido van Rossum82a5c661998-07-07 20:45:43 +0000817static char bind_doc[] =
818"bind(address)\n\
819\n\
820Bind the socket to a local address. For IP sockets, the address is a\n\
821pair (host, port); the host must refer to the local host.";
822
Guido van Rossum30a685f1991-06-27 15:51:29 +0000823
824/* s.close() method.
825 Set the file descriptor to -1 so operations tried subsequently
826 will surely fail. */
827
Guido van Rossum73624e91994-10-10 17:59:00 +0000828static PyObject *
829BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000830{
Guido van Rossum73624e91994-10-10 17:59:00 +0000831 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000832 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000833 if (s->sock_fd != -1) {
834 Py_BEGIN_ALLOW_THREADS
835 (void) close(s->sock_fd);
836 Py_END_ALLOW_THREADS
837 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000838 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000839 Py_INCREF(Py_None);
840 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000841}
842
Guido van Rossum82a5c661998-07-07 20:45:43 +0000843static char close_doc[] =
844"close()\n\
845\n\
846Close the socket. It cannot be used after this call.";
847
Guido van Rossum30a685f1991-06-27 15:51:29 +0000848
849/* s.connect(sockaddr) method */
850
Guido van Rossum73624e91994-10-10 17:59:00 +0000851static PyObject *
852BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000853{
854 struct sockaddr *addr;
855 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000856 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000857 if (!getsockaddrarg(s, args, &addr, &addrlen))
858 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000859 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000860 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000861 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000862 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000863 return PySocket_Err();
864 Py_INCREF(Py_None);
865 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000866}
867
Guido van Rossum82a5c661998-07-07 20:45:43 +0000868static char connect_doc[] =
869"connect(address)\n\
870\n\
871Connect the socket to a remote address. For IP sockets, the address\n\
872is a pair (host, port).";
873
Guido van Rossum30a685f1991-06-27 15:51:29 +0000874
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000875/* s.connect_ex(sockaddr) method */
876
877static PyObject *
878BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
879{
880 struct sockaddr *addr;
881 int addrlen;
882 int res;
883 if (!getsockaddrarg(s, args, &addr, &addrlen))
884 return NULL;
885 Py_BEGIN_ALLOW_THREADS
886 res = connect(s->sock_fd, addr, addrlen);
887 Py_END_ALLOW_THREADS
888 if (res != 0)
889 res = errno;
890 return PyInt_FromLong((long) res);
891}
892
Guido van Rossum82a5c661998-07-07 20:45:43 +0000893static char connect_ex_doc[] =
894"connect_ex(address)\n\
895\n\
896This is like connect(address), but returns an error code (the errno value)\n\
897instead of raising an exception when an error occurs.";
898
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000899
Guido van Rossumed233a51992-06-23 09:07:03 +0000900/* s.fileno() method */
901
Guido van Rossum73624e91994-10-10 17:59:00 +0000902static PyObject *
903BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000904{
Guido van Rossum73624e91994-10-10 17:59:00 +0000905 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000906 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000907 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000908}
909
Guido van Rossum82a5c661998-07-07 20:45:43 +0000910static char fileno_doc[] =
911"fileno() -> integer\n\
912\n\
913Return the integer file descriptor of the socket.";
914
Guido van Rossumed233a51992-06-23 09:07:03 +0000915
Guido van Rossumbe32c891996-06-20 16:25:29 +0000916#ifndef NO_DUP
917/* s.dup() method */
918
919static PyObject *
920BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
921{
922 int newfd;
923 PyObject *sock;
924 if (!PyArg_NoArgs(args))
925 return NULL;
926 newfd = dup(s->sock_fd);
927 if (newfd < 0)
928 return PySocket_Err();
929 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000930 s->sock_family,
931 s->sock_type,
932 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000933 if (sock == NULL)
934 close(newfd);
935 return sock;
936}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000937
938static char dup_doc[] =
939"dup() -> socket object\n\
940\n\
941Return a new socket object connected to the same system resource.";
942
Guido van Rossumbe32c891996-06-20 16:25:29 +0000943#endif
944
945
Guido van Rossumc89705d1992-11-26 08:54:07 +0000946/* s.getsockname() method */
947
Guido van Rossum73624e91994-10-10 17:59:00 +0000948static PyObject *
949BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000950{
951 char addrbuf[256];
952 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000953 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000954 return NULL;
955 if (!getsockaddrlen(s, &addrlen))
956 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000957 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000958 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000959 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000960 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000961 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000962 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000963 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
964}
965
Guido van Rossum82a5c661998-07-07 20:45:43 +0000966static char getsockname_doc[] =
967"getsockname() -> address info\n\
968\n\
969Return the address of the local endpoint. For IP sockets, the address\n\
970info is a pair (hostaddr, port).";
971
Guido van Rossumc89705d1992-11-26 08:54:07 +0000972
Guido van Rossumb6775db1994-08-01 11:34:53 +0000973#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000974/* s.getpeername() method */
975
Guido van Rossum73624e91994-10-10 17:59:00 +0000976static PyObject *
977BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000978{
979 char addrbuf[256];
980 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000981 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000982 return NULL;
983 if (!getsockaddrlen(s, &addrlen))
984 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000985 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000986 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000987 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000988 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000989 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000990 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
991}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000992
993static char getpeername_doc[] =
994"getpeername() -> address info\n\
995\n\
996Return the address of the remote endpoint. For IP sockets, the address\n\
997info is a pair (hostaddr, port).";
998
Guido van Rossumb6775db1994-08-01 11:34:53 +0000999#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001000
1001
Guido van Rossum30a685f1991-06-27 15:51:29 +00001002/* s.listen(n) method */
1003
Guido van Rossum73624e91994-10-10 17:59:00 +00001004static PyObject *
1005BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001006{
1007 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001008 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +00001009 if (!PyArg_Parse(args, "i", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001010 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001011 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001012 if (backlog < 1)
1013 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001014 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001015 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001016 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001017 return PySocket_Err();
1018 Py_INCREF(Py_None);
1019 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001020}
1021
Guido van Rossum82a5c661998-07-07 20:45:43 +00001022static char listen_doc[] =
1023"listen(backlog)\n\
1024\n\
1025Enable a server to accept connections. The backlog argument must be at\n\
1026least 1; it specifies the number of unaccepted connection that the system\n\
1027will allow before refusing new connections.";
1028
1029
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001030#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001031/* s.makefile(mode) method.
1032 Create a new open file object referring to a dupped version of
1033 the socket's file descriptor. (The dup() call is necessary so
1034 that the open file and socket objects may be closed independent
1035 of each other.)
1036 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1037
Guido van Rossum73624e91994-10-10 17:59:00 +00001038static PyObject *
1039BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001040{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001041 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +00001042 char *mode = "r";
1043 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001044 int fd;
1045 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001046 PyObject *f;
1047
1048 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001049 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001050#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001051 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1052 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001053#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001054 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001055#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001056 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001057 if (fd >= 0)
1058 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001059 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001060 }
1061 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1062 if (f != NULL)
1063 PyFile_SetBufSize(f, bufsize);
1064 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001065}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001066
1067static char makefile_doc[] =
1068"makefile([mode[, buffersize]]) -> file object\n\
1069\n\
1070Return a regular file object corresponding to the socket.\n\
1071The mode and buffersize arguments are as for the built-in open() function.";
1072
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001073#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001074
Guido van Rossum82a5c661998-07-07 20:45:43 +00001075
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001076/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001077
Guido van Rossum73624e91994-10-10 17:59:00 +00001078static PyObject *
1079BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001080{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001081 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001082 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001083 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1084 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001085 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001086 if (buf == NULL)
1087 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001088 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001089 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001090 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001091 if (n < 0) {
1092 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001093 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001094 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001095 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001096 return NULL;
1097 return buf;
1098}
1099
Guido van Rossum82a5c661998-07-07 20:45:43 +00001100static char recv_doc[] =
1101"recv(buffersize[, flags]) -> data\n\
1102\n\
1103Receive up to buffersize bytes from the socket. For the optional flags\n\
1104argument, see the Unix manual. When no data is available, block until\n\
1105at least one byte is available or until the remote end is closed. When\n\
1106the remote end is closed and all data is read, return the empty string.";
1107
Guido van Rossum30a685f1991-06-27 15:51:29 +00001108
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001109/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001110
Guido van Rossum73624e91994-10-10 17:59:00 +00001111static PyObject *
1112BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001113{
1114 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001115 PyObject *buf = NULL;
1116 PyObject *addr = NULL;
1117 PyObject *ret = NULL;
1118
Guido van Rossumbe32c891996-06-20 16:25:29 +00001119 int addrlen, len, n, flags = 0;
1120 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1121 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001122 if (!getsockaddrlen(s, &addrlen))
1123 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001124 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001125 if (buf == NULL)
1126 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001127 Py_BEGIN_ALLOW_THREADS
1128 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001129#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001130#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001131 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001132#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001133 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001134#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001135#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001136 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001137#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001138 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001139 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001140 if (n < 0) {
1141 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001142 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001143 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001144 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001145 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001146
1147 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1148 goto finally;
1149
Guido van Rossum73624e91994-10-10 17:59:00 +00001150 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001151 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001152 Py_XDECREF(addr);
1153 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001154 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001155}
1156
Guido van Rossum82a5c661998-07-07 20:45:43 +00001157static char recvfrom_doc[] =
1158"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1159\n\
1160Like recv(buffersize, flags) but also return the sender's address info.";
1161
Guido van Rossum30a685f1991-06-27 15:51:29 +00001162
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001163/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001164
Guido van Rossum73624e91994-10-10 17:59:00 +00001165static PyObject *
1166BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001167{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001168 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001169 int len, n, flags = 0;
1170 if (!PyArg_ParseTuple(args, "s#|i", &buf, &len, &flags))
1171 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001172 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001173 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001174 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001175 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001176 return PySocket_Err();
1177 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001178}
1179
Guido van Rossum82a5c661998-07-07 20:45:43 +00001180static char send_doc[] =
1181"send(data[, flags])\n\
1182\n\
1183Send a data string to the socket. For the optional flags\n\
1184argument, see the Unix manual.";
1185
Guido van Rossum30a685f1991-06-27 15:51:29 +00001186
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001187/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001188
Guido van Rossum73624e91994-10-10 17:59:00 +00001189static PyObject *
1190BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001191{
Guido van Rossum73624e91994-10-10 17:59:00 +00001192 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001193 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001194 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001195 int addrlen, len, n, flags;
1196 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001197 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
1198 PyErr_Clear();
1199 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001200 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001201 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001202 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001203 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001204 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001205 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001206 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001207 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001208 return PySocket_Err();
1209 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001210}
1211
Guido van Rossum82a5c661998-07-07 20:45:43 +00001212static char sendto_doc[] =
1213"sendto(data[, flags], address)\n\
1214\n\
1215Like send(data, flags) but allows specifying the destination address.\n\
1216For IP sockets, the address is a pair (hostaddr, port).";
1217
Guido van Rossum30a685f1991-06-27 15:51:29 +00001218
1219/* s.shutdown(how) method */
1220
Guido van Rossum73624e91994-10-10 17:59:00 +00001221static PyObject *
1222BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001223{
1224 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001225 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +00001226 if (!PyArg_Parse(args, "i", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001227 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001228 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001229 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001230 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001231 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001232 return PySocket_Err();
1233 Py_INCREF(Py_None);
1234 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001235}
1236
Guido van Rossum82a5c661998-07-07 20:45:43 +00001237static char shutdown_doc[] =
1238"shutdown(flag)\n\
1239\n\
1240Shut down the reading side of the socket (flag == 0), the writing side\n\
1241of the socket (flag == 1), or both ends (flag == 2).";
1242
Guido van Rossum30a685f1991-06-27 15:51:29 +00001243
1244/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001245
Guido van Rossum73624e91994-10-10 17:59:00 +00001246static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001247 {"accept", (PyCFunction)PySocketSock_accept, 0,
1248 accept_doc},
1249 {"bind", (PyCFunction)PySocketSock_bind, 0,
1250 bind_doc},
1251 {"close", (PyCFunction)PySocketSock_close, 0,
1252 close_doc},
1253 {"connect", (PyCFunction)PySocketSock_connect, 0,
1254 connect_doc},
1255 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 0,
1256 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001257#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001258 {"dup", (PyCFunction)PySocketSock_dup, 0,
1259 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001260#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001261 {"fileno", (PyCFunction)PySocketSock_fileno, 0,
1262 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001263#ifdef HAVE_GETPEERNAME
Guido van Rossum82a5c661998-07-07 20:45:43 +00001264 {"getpeername", (PyCFunction)PySocketSock_getpeername, 0,
1265 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001266#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001267 {"getsockname", (PyCFunction)PySocketSock_getsockname, 0,
1268 getsockname_doc},
1269 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1270 getsockopt_doc},
1271 {"listen", (PyCFunction)PySocketSock_listen, 0,
1272 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001273#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001274 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1275 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001276#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001277 {"recv", (PyCFunction)PySocketSock_recv, 1,
1278 recv_doc},
1279 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1280 recvfrom_doc},
1281 {"send", (PyCFunction)PySocketSock_send, 1,
1282 send_doc},
1283 {"sendto", (PyCFunction)PySocketSock_sendto, 0,
1284 sendto_doc},
1285 {"setblocking", (PyCFunction)PySocketSock_setblocking, 0,
1286 setblocking_doc},
1287 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 0,
1288 setsockopt_doc},
1289 {"shutdown", (PyCFunction)PySocketSock_shutdown, 0,
1290 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001291 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001292};
1293
Guido van Rossum30a685f1991-06-27 15:51:29 +00001294
Guido van Rossum73624e91994-10-10 17:59:00 +00001295/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001296 First close the file description. */
1297
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001298static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001299BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001300{
1301 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001302 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001303}
1304
Guido van Rossum30a685f1991-06-27 15:51:29 +00001305
1306/* Return a socket object's named attribute. */
1307
Guido van Rossum73624e91994-10-10 17:59:00 +00001308static PyObject *
1309BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001310{
Guido van Rossum73624e91994-10-10 17:59:00 +00001311 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001312}
1313
Guido van Rossum30a685f1991-06-27 15:51:29 +00001314
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001315static PyObject *
1316BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1317{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001318 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001319 sprintf(buf,
1320 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1321 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001322 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001323}
1324
1325
Guido van Rossumb6775db1994-08-01 11:34:53 +00001326/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001327
Guido van Rossum73624e91994-10-10 17:59:00 +00001328static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001329 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001330 0,
1331 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001332 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001333 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001334 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001335 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001336 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001337 0, /*tp_setattr*/
1338 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001339 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001340 0, /*tp_as_number*/
1341 0, /*tp_as_sequence*/
1342 0, /*tp_as_mapping*/
1343};
1344
Guido van Rossum30a685f1991-06-27 15:51:29 +00001345
Guido van Rossum81194471991-07-27 21:42:02 +00001346/* Python interface to gethostname(). */
1347
1348/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001349static PyObject *
1350BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001351{
1352 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001353 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001354 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +00001355 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001356 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001357 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001358 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001359 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001360 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001361 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001362 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001363}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001364
Guido van Rossum82a5c661998-07-07 20:45:43 +00001365static char gethostname_doc[] =
1366"gethostname() -> string\n\
1367\n\
1368Return the current host name.";
1369
Guido van Rossumff4949e1992-08-05 19:58:53 +00001370
Guido van Rossum30a685f1991-06-27 15:51:29 +00001371/* Python interface to gethostbyname(name). */
1372
1373/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001374static PyObject *
1375BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001376{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001377 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001378 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001379 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001380 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001381 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001382 return NULL;
1383 return makeipaddr(&addrbuf);
1384}
1385
Guido van Rossum82a5c661998-07-07 20:45:43 +00001386static char gethostbyname_doc[] =
1387"gethostbyname(host) -> address\n\
1388\n\
1389Return the IP address (a string of the form '255.255.255.255') for a host.";
1390
1391
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001392/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1393
1394static PyObject *
1395gethost_common(h, addr)
1396 struct hostent *h;
1397 struct sockaddr_in *addr;
1398{
1399 char **pch;
1400 PyObject *rtn_tuple = (PyObject *)NULL;
1401 PyObject *name_list = (PyObject *)NULL;
1402 PyObject *addr_list = (PyObject *)NULL;
1403 PyObject *tmp;
1404 if (h == NULL) {
1405#ifdef HAVE_HSTRERROR
1406 /* Let's get real error message to return */
1407 extern int h_errno;
1408 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1409#else
1410 PyErr_SetString(PySocket_Error, "host not found");
1411#endif
1412 return NULL;
1413 }
1414 if ((name_list = PyList_New(0)) == NULL)
1415 goto err;
1416 if ((addr_list = PyList_New(0)) == NULL)
1417 goto err;
1418 for (pch = h->h_aliases; *pch != NULL; pch++) {
1419 int status;
1420 tmp = PyString_FromString(*pch);
1421 if (tmp == NULL)
1422 goto err;
1423 status = PyList_Append(name_list, tmp);
1424 Py_DECREF(tmp);
1425 if (status)
1426 goto err;
1427 }
1428 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1429 int status;
1430 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1431 tmp = makeipaddr(addr);
1432 if (tmp == NULL)
1433 goto err;
1434 status = PyList_Append(addr_list, tmp);
1435 Py_DECREF(tmp);
1436 if (status)
1437 goto err;
1438 }
1439 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1440 err:
1441 Py_XDECREF(name_list);
1442 Py_XDECREF(addr_list);
1443 return rtn_tuple;
1444}
1445
1446
1447/* Python interface to gethostbyname_ex(name). */
1448
1449/*ARGSUSED*/
1450static PyObject *
1451BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1452{
1453 char *name;
1454 struct hostent *h;
1455 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001456 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001457#ifdef HAVE_GETHOSTBYNAME_R
1458 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001459#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1460 struct hostent_data data;
1461#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001462 char buf[16384];
1463 int buf_len = (sizeof buf) - 1;
1464 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001465#endif
1466#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001467 int result;
1468#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001469#endif /* HAVE_GETHOSTBYNAME_R */
1470 if (!PyArg_Parse(args, "s", &name))
1471 return NULL;
1472 if (setipaddr(name, &addr) < 0)
1473 return NULL;
1474 Py_BEGIN_ALLOW_THREADS
1475#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001476#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001477 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001478#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001479 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001480#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001481 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001482 result = gethostbyname_r(name, &hp_allocated, &data);
1483 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001484#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001485#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001486#ifdef USE_GETHOSTBYNAME_LOCK
1487 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001488#endif
1489 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001490#endif /* HAVE_GETHOSTBYNAME_R */
1491 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001492 ret = gethost_common(h, &addr);
1493#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001494 PyThread_release_lock(gethostbyname_lock);
1495#endif
1496 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001497}
1498
1499static char ghbn_ex_doc[] =
1500"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1501\n\
1502Return the true host name, a list of aliases, and a list of IP addresses,\n\
1503for a host. The host argument is a string giving a host name or IP number.";
1504
1505
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001506/* Python interface to gethostbyaddr(IP). */
1507
1508/*ARGSUSED*/
1509static PyObject *
1510BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1511{
1512 struct sockaddr_in addr;
1513 char *ip_num;
1514 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001515 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001516#ifdef HAVE_GETHOSTBYNAME_R
1517 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001518#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1519 struct hostent_data data;
1520#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001521 char buf[16384];
1522 int buf_len = (sizeof buf) - 1;
1523 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001524#endif
1525#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001526 int result;
1527#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001528#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001529
1530 if (!PyArg_Parse(args, "s", &ip_num))
1531 return NULL;
1532 if (setipaddr(ip_num, &addr) < 0)
1533 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001534 Py_BEGIN_ALLOW_THREADS
1535#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001536#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001537 result = gethostbyaddr_r((char *)&addr.sin_addr,
1538 sizeof(addr.sin_addr),
1539 AF_INET, &hp_allocated, buf, buf_len,
1540 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001541#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001542 h = gethostbyaddr_r((char *)&addr.sin_addr,
1543 sizeof(addr.sin_addr),
1544 AF_INET,
1545 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001546#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001547 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001548 result = gethostbyaddr_r((char *)&addr.sin_addr,
1549 sizeof(addr.sin_addr),
1550 AF_INET, &hp_allocated, &data);
1551 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001552#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001553#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001554#ifdef USE_GETHOSTBYNAME_LOCK
1555 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001556#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001557 h = gethostbyaddr((char *)&addr.sin_addr,
1558 sizeof(addr.sin_addr),
1559 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001560#endif /* HAVE_GETHOSTBYNAME_R */
1561 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001562 ret = gethost_common(h, &addr);
1563#ifdef USE_GETHOSTBYNAME_LOCK
1564 PyThread_release_lock(gethostbyname_lock);
1565#endif
1566 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001567}
1568
Guido van Rossum82a5c661998-07-07 20:45:43 +00001569static char gethostbyaddr_doc[] =
1570"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1571\n\
1572Return the true host name, a list of aliases, and a list of IP addresses,\n\
1573for a host. The host argument is a string giving a host name or IP number.";
1574
Guido van Rossum30a685f1991-06-27 15:51:29 +00001575
1576/* Python interface to getservbyname(name).
1577 This only returns the port number, since the other info is already
1578 known or not useful (like the list of aliases). */
1579
1580/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001581static PyObject *
1582BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001583{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001584 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001585 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001586 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001587 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001588 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001589 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001590 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001591 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001592 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001593 return NULL;
1594 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001595 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001596}
1597
Guido van Rossum82a5c661998-07-07 20:45:43 +00001598static char getservbyname_doc[] =
1599"getservbyname(servicename, protocolname) -> integer\n\
1600\n\
1601Return a port number from a service name and protocol name.\n\
1602The protocol name should be 'tcp' or 'udp'.";
1603
Guido van Rossum30a685f1991-06-27 15:51:29 +00001604
Guido van Rossum3901d851996-12-19 16:35:04 +00001605/* Python interface to getprotobyname(name).
1606 This only returns the protocol number, since the other info is
1607 already known or not useful (like the list of aliases). */
1608
1609/*ARGSUSED*/
1610static PyObject *
1611BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1612{
1613 char *name;
1614 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001615#ifdef __BEOS__
1616/* Not available in BeOS yet. - [cjh] */
1617 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1618 return NULL;
1619#else
Guido van Rossum3901d851996-12-19 16:35:04 +00001620 if (!PyArg_Parse(args, "s", &name))
1621 return NULL;
1622 Py_BEGIN_ALLOW_THREADS
1623 sp = getprotobyname(name);
1624 Py_END_ALLOW_THREADS
1625 if (sp == NULL) {
1626 PyErr_SetString(PySocket_Error, "protocol not found");
1627 return NULL;
1628 }
1629 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001630#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001631}
1632
Guido van Rossum82a5c661998-07-07 20:45:43 +00001633static char getprotobyname_doc[] =
1634"getprotobyname(name) -> integer\n\
1635\n\
1636Return the protocol number for the named protocol. (Rarely used.)";
1637
Guido van Rossum3901d851996-12-19 16:35:04 +00001638
Guido van Rossum30a685f1991-06-27 15:51:29 +00001639/* Python interface to socket(family, type, proto).
1640 The third (protocol) argument is optional.
1641 Return a new socket object. */
1642
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001643/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001644static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001645BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001646{
Guido van Rossum73624e91994-10-10 17:59:00 +00001647 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001648#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001649 SOCKET fd;
1650#else
1651 int fd;
1652#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001653 int family, type, proto = 0;
1654 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1655 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001656 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001657 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001658 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001659#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001660 if (fd == INVALID_SOCKET)
1661#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001662 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001663#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001664 return PySocket_Err();
1665 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001666 /* If the object can't be created, don't forget to close the
1667 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001668 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001669 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001670 /* From now on, ignore SIGPIPE and let the error checking
1671 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001672#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001673 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001674#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001675 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001676}
1677
Guido van Rossum82a5c661998-07-07 20:45:43 +00001678static char socket_doc[] =
1679"socket(family, type[, proto]) -> socket object\n\
1680\n\
1681Open a socket of the given type. The family argument specifies the\n\
1682address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1683The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1684or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1685specifying the default protocol.";
1686
1687
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001688#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001689/* Create a socket object from a numeric file description.
1690 Useful e.g. if stdin is a socket.
1691 Additional arguments as for socket(). */
1692
1693/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001694static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001695BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001696{
Guido van Rossum73624e91994-10-10 17:59:00 +00001697 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001698 int fd, family, type, proto = 0;
1699 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1700 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001701 /* Dup the fd so it and the socket can be closed independently */
1702 fd = dup(fd);
1703 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001704 return PySocket_Err();
1705 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001706 /* From now on, ignore SIGPIPE and let the error checking
1707 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001708#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001709 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001710#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001711 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001712}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001713
1714static char fromfd_doc[] =
1715"fromfd(fd, family, type[, proto]) -> socket object\n\
1716\n\
1717Create a socket object from the given file descriptor.\n\
1718The remaining arguments are the same as for socket().";
1719
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001720#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001721
Guido van Rossum82a5c661998-07-07 20:45:43 +00001722
Guido van Rossum006bf911996-06-12 04:04:55 +00001723static PyObject *
1724BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1725{
1726 int x1, x2;
1727
1728 if (!PyArg_Parse(args, "i", &x1)) {
1729 return NULL;
1730 }
1731 x2 = (int)ntohs((short)x1);
1732 return PyInt_FromLong(x2);
1733}
1734
Guido van Rossum82a5c661998-07-07 20:45:43 +00001735static char ntohs_doc[] =
1736"ntohs(integer) -> integer\n\
1737\n\
1738Convert a 16-bit integer from network to host byte order.";
1739
1740
Guido van Rossum006bf911996-06-12 04:04:55 +00001741static PyObject *
1742BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1743{
1744 int x1, x2;
1745
1746 if (!PyArg_Parse(args, "i", &x1)) {
1747 return NULL;
1748 }
1749 x2 = ntohl(x1);
1750 return PyInt_FromLong(x2);
1751}
1752
Guido van Rossum82a5c661998-07-07 20:45:43 +00001753static char ntohl_doc[] =
1754"ntohl(integer) -> integer\n\
1755\n\
1756Convert a 32-bit integer from network to host byte order.";
1757
1758
Guido van Rossum006bf911996-06-12 04:04:55 +00001759static PyObject *
1760BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1761{
1762 int x1, x2;
1763
1764 if (!PyArg_Parse(args, "i", &x1)) {
1765 return NULL;
1766 }
1767 x2 = (int)htons((short)x1);
1768 return PyInt_FromLong(x2);
1769}
1770
Guido van Rossum82a5c661998-07-07 20:45:43 +00001771static char htons_doc[] =
1772"htons(integer) -> integer\n\
1773\n\
1774Convert a 16-bit integer from host to network byte order.";
1775
1776
Guido van Rossum006bf911996-06-12 04:04:55 +00001777static PyObject *
1778BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1779{
1780 int x1, x2;
1781
1782 if (!PyArg_Parse(args, "i", &x1)) {
1783 return NULL;
1784 }
1785 x2 = htonl(x1);
1786 return PyInt_FromLong(x2);
1787}
1788
Guido van Rossum82a5c661998-07-07 20:45:43 +00001789static char htonl_doc[] =
1790"htonl(integer) -> integer\n\
1791\n\
1792Convert a 32-bit integer from host to network byte order.";
1793
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001794/*
1795 * socket.inet_aton() and socket.inet_ntoa() functions
1796 *
1797 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
1798 *
1799 */
1800
1801static char inet_aton_doc[] =
1802"inet_aton(string) -> packed 32-bit IP representation\n\
1803\n\
1804Convert an IP address in string format (123.45.67.89) to the 32-bit packed
1805binary format used in low-level network functions.";
1806
1807static PyObject*
1808BUILD_FUNC_DEF_2(PySocket_inet_aton, PyObject *, self, PyObject *, args)
1809{
1810 char *ip_addr;
1811 struct in_addr packed_addr;
1812 int err;
1813
1814 if (!PyArg_Parse(args, "s", &ip_addr)) {
1815 return NULL;
1816 }
1817
1818 err = inet_aton(ip_addr, &packed_addr);
1819
1820 if (err == 0) { /* invalid address */
1821 PyErr_SetString(PySocket_Error,
1822 "illegal IP address string passed to inet_aton");
1823 return NULL;
1824 }
1825
1826 return PyString_FromStringAndSize((char *) &packed_addr,
1827 sizeof(packed_addr));
1828}
1829
1830static char inet_ntoa_doc[] =
1831"inet_aton(packed_ip) -> ip_address_string\n\
1832\n\
1833Convert an IP address from 32-bit packed binary format to string format";
1834
1835static PyObject*
1836BUILD_FUNC_DEF_2(PySocket_inet_ntoa, PyObject *, self, PyObject *, args)
1837{
1838 char *packed_str;
1839 int err, addr_len;
1840 struct in_addr packed_addr;
1841
1842 if (!PyArg_Parse(args, "s#", &packed_str, &addr_len)) {
1843 return NULL;
1844 }
1845
1846 if (addr_len != sizeof(packed_addr)) {
1847 PyErr_SetString(PySocket_Error,
1848 "packed IP wrong length for inet_ntoa");
1849 return NULL;
1850 }
1851
1852 memcpy(&packed_addr, packed_str, addr_len);
1853
1854 return PyString_FromString(inet_ntoa(packed_addr));
1855}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001856
Guido van Rossum30a685f1991-06-27 15:51:29 +00001857/* List of functions exported by this module. */
1858
Guido van Rossum73624e91994-10-10 17:59:00 +00001859static PyMethodDef PySocket_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001860 {"gethostbyname", PySocket_gethostbyname, 0, gethostbyname_doc},
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001861 {"gethostbyname_ex", PySocket_gethostbyname_ex, 0, ghbn_ex_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00001862 {"gethostbyaddr", PySocket_gethostbyaddr, 0, gethostbyaddr_doc},
1863 {"gethostname", PySocket_gethostname, 0, gethostname_doc},
1864 {"getservbyname", PySocket_getservbyname, 0, getservbyname_doc},
1865 {"getprotobyname", PySocket_getprotobyname, 0,getprotobyname_doc},
1866 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001867#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001868 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001869#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001870 {"ntohs", PySocket_ntohs, 0, ntohs_doc},
1871 {"ntohl", PySocket_ntohl, 0, ntohl_doc},
1872 {"htons", PySocket_htons, 0, htons_doc},
1873 {"htonl", PySocket_htonl, 0, htonl_doc},
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001874 {"inet_aton", PySocket_inet_aton, 0, inet_aton_doc},
1875 {"inet_ntoa", PySocket_inet_ntoa, 0, inet_ntoa_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001876 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001877};
1878
Guido van Rossum30a685f1991-06-27 15:51:29 +00001879
1880/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00001881 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001882 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00001883 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001884static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001885BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001886{
Guido van Rossum73624e91994-10-10 17:59:00 +00001887 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00001888 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001889 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00001890
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001891 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001892}
1893
Guido van Rossum30a685f1991-06-27 15:51:29 +00001894
Guido van Rossum8d665e61996-06-26 18:22:49 +00001895#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001896
1897/* Additional initialization and cleanup for NT/Windows */
1898
1899static void
1900NTcleanup()
1901{
1902 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001903}
1904
1905static int
1906NTinit()
1907{
1908 WSADATA WSAData;
1909 int ret;
1910 char buf[100];
1911 ret = WSAStartup(0x0101, &WSAData);
1912 switch (ret) {
1913 case 0: /* no error */
1914 atexit(NTcleanup);
1915 return 1;
1916 case WSASYSNOTREADY:
1917 PyErr_SetString(PyExc_ImportError,
1918 "WSAStartup failed: network not ready");
1919 break;
1920 case WSAVERNOTSUPPORTED:
1921 case WSAEINVAL:
1922 PyErr_SetString(PyExc_ImportError,
1923 "WSAStartup failed: requested version not supported");
1924 break;
1925 default:
1926 sprintf(buf, "WSAStartup failed: error code %d", ret);
1927 PyErr_SetString(PyExc_ImportError, buf);
1928 break;
1929 }
1930 return 0;
1931}
1932
Guido van Rossum8d665e61996-06-26 18:22:49 +00001933#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00001934
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001935#if defined(PYOS_OS2)
1936
1937/* Additional initialization and cleanup for OS/2 */
1938
1939static void
1940OS2cleanup()
1941{
1942 /* No cleanup is necessary for OS/2 Sockets */
1943}
1944
1945static int
1946OS2init()
1947{
1948 char reason[64];
1949 int rc = sock_init();
1950
1951 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00001952 atexit(OS2cleanup);
1953 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001954 }
1955
1956 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
1957 PyErr_SetString(PyExc_ImportError, reason);
1958
Guido van Rossum32c575d1997-12-02 20:37:32 +00001959 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001960}
1961
1962#endif /* PYOS_OS2 */
1963
Guido van Rossumbe32c891996-06-20 16:25:29 +00001964
Guido van Rossum30a685f1991-06-27 15:51:29 +00001965/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001966 * This is called when the first 'import socket' is done,
1967 * via a table in config.c, if config.c is compiled with USE_SOCKET
1968 * defined.
1969 *
1970 * For MS_WINDOWS (which means any Windows variant), this module
1971 * is actually called "_socket", and there's a wrapper "socket.py"
1972 * which implements some missing functionality (such as makefile(),
1973 * dup() and fromfd()). The import of "_socket" may fail with an
1974 * ImportError exception if initialization of WINSOCK fails. When
1975 * WINSOCK is initialized succesfully, a call to WSACleanup() is
1976 * scheduled to be made at exit time.
1977 *
1978 * For OS/2, this module is also called "_socket" and uses a wrapper
1979 * "socket.py" which implements that functionality that is missing
1980 * when PC operating systems don't put socket descriptors in the
1981 * operating system's filesystem layer.
1982 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001983
Guido van Rossum82a5c661998-07-07 20:45:43 +00001984static char module_doc[] =
1985"This module provides socket operations and some related functions.\n\
1986On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
1987On other systems, it only supports IP.\n\
1988\n\
1989Functions:\n\
1990\n\
1991socket() -- create a new socket object\n\
1992fromfd() -- create a socket object from an open file descriptor (*)\n\
1993gethostname() -- return the current hostname\n\
1994gethostbyname() -- map a hostname to its IP number\n\
1995gethostbyaddr() -- map an IP number or hostname to DNS info\n\
1996getservbyname() -- map a service name and a protocol name to a port number\n\
1997getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
1998ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
1999htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002000inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format\n\
2001inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002002\n\
2003(*) not available on all platforms!)\n\
2004\n\
2005Special objects:\n\
2006\n\
2007SocketType -- type object for socket objects\n\
2008error -- exception raised for I/O errors\n\
2009\n\
2010Integer constants:\n\
2011\n\
2012AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
2013SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
2014\n\
2015Many other constants may be defined; these may be used in calls to\n\
2016the setsockopt() and getsockopt() methods.\n\
2017";
2018
2019static char sockettype_doc[] =
2020"A socket represents one endpoint of a network connection.\n\
2021\n\
2022Methods:\n\
2023\n\
2024accept() -- accept a connection, returning new socket and client address\n\
2025bind() -- bind the socket to a local address\n\
2026close() -- close the socket\n\
2027connect() -- connect the socket to a remote address\n\
2028connect_ex() -- connect, return an error code instead of an exception \n\
2029dup() -- return a new socket object identical to the current one (*)\n\
2030fileno() -- return underlying file descriptor\n\
2031getpeername() -- return remote address (*)\n\
2032getsockname() -- return local address\n\
2033getsockopt() -- get socket options\n\
2034listen() -- start listening for incoming connections\n\
2035makefile() -- return a file object corresponding tot the socket (*)\n\
2036recv() -- receive data\n\
2037recvfrom() -- receive data and sender's address\n\
2038send() -- send data\n\
2039sendto() -- send data to a given address\n\
2040setblocking() -- set or clear the blocking I/O flag\n\
2041setsockopt() -- set socket options\n\
2042shutdown() -- shut down traffic in one or both directions\n\
2043\n\
2044(*) not available on all platforms!)";
2045
Guido van Rossum3886bb61998-12-04 18:50:17 +00002046DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00002047#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002048init_socket()
2049#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002050initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00002051#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002052{
Guido van Rossum73624e91994-10-10 17:59:00 +00002053 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00002054#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002055 if (!NTinit())
2056 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002057 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002058#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002059#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002060 if (!OS2init())
2061 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002062 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002063#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00002064#if defined(__BEOS__)
2065 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
2066#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002067 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002068#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00002069#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00002070#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002071 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002072 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2073 if (PySocket_Error == NULL)
2074 return;
2075 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002076 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002077 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002078 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002079 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002080 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002081 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002082
2083 /* Address families (we only support AF_INET and AF_UNIX) */
2084#ifdef AF_UNSPEC
2085 insint(d, "AF_UNSPEC", AF_UNSPEC);
2086#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002087 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002088#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002089 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002090#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002091#ifdef AF_AX25
2092 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2093#endif
2094#ifdef AF_IPX
2095 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2096#endif
2097#ifdef AF_APPLETALK
2098 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2099#endif
2100#ifdef AF_NETROM
2101 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2102#endif
2103#ifdef AF_BRIDGE
2104 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2105#endif
2106#ifdef AF_AAL5
2107 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2108#endif
2109#ifdef AF_X25
2110 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2111#endif
2112#ifdef AF_INET6
2113 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2114#endif
2115#ifdef AF_ROSE
2116 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2117#endif
2118
2119 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002120 insint(d, "SOCK_STREAM", SOCK_STREAM);
2121 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002122#ifndef __BEOS__
2123/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002124 insint(d, "SOCK_RAW", SOCK_RAW);
2125 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2126 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002127#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002128
2129#ifdef SO_DEBUG
2130 insint(d, "SO_DEBUG", SO_DEBUG);
2131#endif
2132#ifdef SO_ACCEPTCONN
2133 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2134#endif
2135#ifdef SO_REUSEADDR
2136 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2137#endif
2138#ifdef SO_KEEPALIVE
2139 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2140#endif
2141#ifdef SO_DONTROUTE
2142 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2143#endif
2144#ifdef SO_BROADCAST
2145 insint(d, "SO_BROADCAST", SO_BROADCAST);
2146#endif
2147#ifdef SO_USELOOPBACK
2148 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2149#endif
2150#ifdef SO_LINGER
2151 insint(d, "SO_LINGER", SO_LINGER);
2152#endif
2153#ifdef SO_OOBINLINE
2154 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2155#endif
2156#ifdef SO_REUSEPORT
2157 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2158#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002159#ifdef SO_SNDBUF
2160 insint(d, "SO_SNDBUF", SO_SNDBUF);
2161#endif
2162#ifdef SO_RCVBUF
2163 insint(d, "SO_RCVBUF", SO_RCVBUF);
2164#endif
2165#ifdef SO_SNDLOWAT
2166 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2167#endif
2168#ifdef SO_RCVLOWAT
2169 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2170#endif
2171#ifdef SO_SNDTIMEO
2172 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2173#endif
2174#ifdef SO_RCVTIMEO
2175 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2176#endif
2177#ifdef SO_ERROR
2178 insint(d, "SO_ERROR", SO_ERROR);
2179#endif
2180#ifdef SO_TYPE
2181 insint(d, "SO_TYPE", SO_TYPE);
2182#endif
2183
2184 /* Maximum number of connections for "listen" */
2185#ifdef SOMAXCONN
2186 insint(d, "SOMAXCONN", SOMAXCONN);
2187#else
2188 insint(d, "SOMAXCONN", 5); /* Common value */
2189#endif
2190
2191 /* Flags for send, recv */
2192#ifdef MSG_OOB
2193 insint(d, "MSG_OOB", MSG_OOB);
2194#endif
2195#ifdef MSG_PEEK
2196 insint(d, "MSG_PEEK", MSG_PEEK);
2197#endif
2198#ifdef MSG_DONTROUTE
2199 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2200#endif
2201#ifdef MSG_EOR
2202 insint(d, "MSG_EOR", MSG_EOR);
2203#endif
2204#ifdef MSG_TRUNC
2205 insint(d, "MSG_TRUNC", MSG_TRUNC);
2206#endif
2207#ifdef MSG_CTRUNC
2208 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2209#endif
2210#ifdef MSG_WAITALL
2211 insint(d, "MSG_WAITALL", MSG_WAITALL);
2212#endif
2213#ifdef MSG_BTAG
2214 insint(d, "MSG_BTAG", MSG_BTAG);
2215#endif
2216#ifdef MSG_ETAG
2217 insint(d, "MSG_ETAG", MSG_ETAG);
2218#endif
2219
2220 /* Protocol level and numbers, usable for [gs]etsockopt */
2221#ifdef SOL_SOCKET
2222 insint(d, "SOL_SOCKET", SOL_SOCKET);
2223#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002224#ifdef SOL_IP
2225 insint(d, "SOL_IP", SOL_IP);
2226#else
2227 insint(d, "SOL_IP", 0);
2228#endif
2229#ifdef SOL_IPX
2230 insint(d, "SOL_IPX", SOL_IPX);
2231#endif
2232#ifdef SOL_AX25
2233 insint(d, "SOL_AX25", SOL_AX25);
2234#endif
2235#ifdef SOL_ATALK
2236 insint(d, "SOL_ATALK", SOL_ATALK);
2237#endif
2238#ifdef SOL_NETROM
2239 insint(d, "SOL_NETROM", SOL_NETROM);
2240#endif
2241#ifdef SOL_ROSE
2242 insint(d, "SOL_ROSE", SOL_ROSE);
2243#endif
2244#ifdef SOL_TCP
2245 insint(d, "SOL_TCP", SOL_TCP);
2246#else
2247 insint(d, "SOL_TCP", 6);
2248#endif
2249#ifdef SOL_UDP
2250 insint(d, "SOL_UDP", SOL_UDP);
2251#else
2252 insint(d, "SOL_UDP", 17);
2253#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002254#ifdef IPPROTO_IP
2255 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002256#else
2257 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002258#endif
2259#ifdef IPPROTO_ICMP
2260 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002261#else
2262 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002263#endif
2264#ifdef IPPROTO_IGMP
2265 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2266#endif
2267#ifdef IPPROTO_GGP
2268 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2269#endif
2270#ifdef IPPROTO_TCP
2271 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002272#else
2273 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002274#endif
2275#ifdef IPPROTO_EGP
2276 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2277#endif
2278#ifdef IPPROTO_PUP
2279 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2280#endif
2281#ifdef IPPROTO_UDP
2282 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002283#else
2284 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002285#endif
2286#ifdef IPPROTO_IDP
2287 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2288#endif
2289#ifdef IPPROTO_HELLO
2290 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2291#endif
2292#ifdef IPPROTO_ND
2293 insint(d, "IPPROTO_ND", IPPROTO_ND);
2294#endif
2295#ifdef IPPROTO_TP
2296 insint(d, "IPPROTO_TP", IPPROTO_TP);
2297#endif
2298#ifdef IPPROTO_XTP
2299 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2300#endif
2301#ifdef IPPROTO_EON
2302 insint(d, "IPPROTO_EON", IPPROTO_EON);
2303#endif
2304#ifdef IPPROTO_BIP
2305 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2306#endif
2307/**/
2308#ifdef IPPROTO_RAW
2309 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002310#else
2311 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002312#endif
2313#ifdef IPPROTO_MAX
2314 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2315#endif
2316
2317 /* Some port configuration */
2318#ifdef IPPORT_RESERVED
2319 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2320#else
2321 insint(d, "IPPORT_RESERVED", 1024);
2322#endif
2323#ifdef IPPORT_USERRESERVED
2324 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2325#else
2326 insint(d, "IPPORT_USERRESERVED", 5000);
2327#endif
2328
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002329 /* Some reserved IP v.4 addresses */
2330#ifdef INADDR_ANY
2331 insint(d, "INADDR_ANY", INADDR_ANY);
2332#else
2333 insint(d, "INADDR_ANY", 0x00000000);
2334#endif
2335#ifdef INADDR_BROADCAST
2336 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2337#else
2338 insint(d, "INADDR_BROADCAST", 0xffffffff);
2339#endif
2340#ifdef INADDR_LOOPBACK
2341 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2342#else
2343 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2344#endif
2345#ifdef INADDR_UNSPEC_GROUP
2346 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2347#else
2348 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2349#endif
2350#ifdef INADDR_ALLHOSTS_GROUP
2351 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2352#else
2353 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2354#endif
2355#ifdef INADDR_MAX_LOCAL_GROUP
2356 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2357#else
2358 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2359#endif
2360#ifdef INADDR_NONE
2361 insint(d, "INADDR_NONE", INADDR_NONE);
2362#else
2363 insint(d, "INADDR_NONE", 0xffffffff);
2364#endif
2365
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002366 /* IP [gs]etsockopt options */
2367#ifdef IP_OPTIONS
2368 insint(d, "IP_OPTIONS", IP_OPTIONS);
2369#endif
2370#ifdef IP_HDRINCL
2371 insint(d, "IP_HDRINCL", IP_HDRINCL);
2372#endif
2373#ifdef IP_TOS
2374 insint(d, "IP_TOS", IP_TOS);
2375#endif
2376#ifdef IP_TTL
2377 insint(d, "IP_TTL", IP_TTL);
2378#endif
2379#ifdef IP_RECVOPTS
2380 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2381#endif
2382#ifdef IP_RECVRETOPTS
2383 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2384#endif
2385#ifdef IP_RECVDSTADDR
2386 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2387#endif
2388#ifdef IP_RETOPTS
2389 insint(d, "IP_RETOPTS", IP_RETOPTS);
2390#endif
2391#ifdef IP_MULTICAST_IF
2392 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2393#endif
2394#ifdef IP_MULTICAST_TTL
2395 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2396#endif
2397#ifdef IP_MULTICAST_LOOP
2398 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2399#endif
2400#ifdef IP_ADD_MEMBERSHIP
2401 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2402#endif
2403#ifdef IP_DROP_MEMBERSHIP
2404 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2405#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002406#ifdef IP_DEFAULT_MULTICAST_TTL
2407 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2408#endif
2409#ifdef IP_DEFAULT_MULTICAST_LOOP
2410 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2411#endif
2412#ifdef IP_MAX_MEMBERSHIPS
2413 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2414#endif
2415
2416 /* TCP options */
2417#ifdef TCP_NODELAY
2418 insint(d, "TCP_NODELAY", TCP_NODELAY);
2419#endif
2420#ifdef TCP_MAXSEG
2421 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2422#endif
2423
2424 /* IPX options */
2425#ifdef IPX_TYPE
2426 insint(d, "IPX_TYPE", IPX_TYPE);
2427#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002428
2429 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002430#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002431 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002432#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002433}