blob: da1d223997bd74ae8369d9c1d0c97170bc2ec224 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum6574b3e1991-06-25 21:36:08 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum6574b3e1991-06-25 21:36:08 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000029
30******************************************************************/
31
32/* Socket module */
33
34/*
35This module provides an interface to Berkeley socket IPC.
36
37Limitations:
38
Guido van Rossum30a685f1991-06-27 15:51:29 +000039- only AF_INET and AF_UNIX address families are supported
Guido van Rossum81194471991-07-27 21:42:02 +000040- no read/write operations (use send/recv or makefile instead)
Guido van Rossumbe32c891996-06-20 16:25:29 +000041- additional restrictions apply on Windows
Guido van Rossum6574b3e1991-06-25 21:36:08 +000042
Guido van Rossum27e177d1995-03-16 15:43:47 +000043Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000044
Guido van Rossum27e177d1995-03-16 15:43:47 +000045- socket.error: exception raised for socket specific errors
Guido van Rossum30a685f1991-06-27 15:51:29 +000046- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000047- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000048- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000049- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000050- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000051- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000052- socket.ntohs(16 bit value) --> new int object
53- socket.ntohl(32 bit value) --> new int object
54- socket.htons(16 bit value) --> new int object
55- socket.htonl(32 bit value) --> new int object
Guido van Rossum27e177d1995-03-16 15:43:47 +000056- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000057- an Internet socket address is a pair (hostname, port)
58 where hostname can be anything recognized by gethostbyname()
59 (including the dd.dd.dd.dd notation) and port is in host byte order
60- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000061- a UNIX domain socket address is a string specifying the pathname
Guido van Rossum6574b3e1991-06-25 21:36:08 +000062
Guido van Rossum30a685f1991-06-27 15:51:29 +000063Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000064
Guido van Rossum81194471991-07-27 21:42:02 +000065- s.accept() --> new socket object, sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000066- s.bind(sockaddr) --> None
67- s.close() --> None
68- s.connect(sockaddr) --> None
Guido van Rossumfc4255d1997-11-19 18:57:13 +000069- s.connect_ex(sockaddr) --> 0 or errno (handy for e.g. async connect)
Guido van Rossum27e177d1995-03-16 15:43:47 +000070- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000071- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000072- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000073- s.getsockname() --> sockaddr
74- s.getsockopt(level, optname[, buflen]) --> int or string
75- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000076- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000077- s.recv(buflen [,flags]) --> string
78- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000079- s.send(string [,flags]) --> nbytes
80- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000081- s.setblocking(0 | 1) --> None
82- s.setsockopt(level, optname, value) --> None
83- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000084- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000085
Guido van Rossum6574b3e1991-06-25 21:36:08 +000086*/
87
Guido van Rossum73624e91994-10-10 17:59:00 +000088#include "Python.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +000089#if defined(WITH_THREAD) && !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Guido van Rossum49b56061998-10-01 20:42:43 +000090#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +000091#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +000092
Guido van Rossuma376cc51996-12-05 23:43:35 +000093#ifdef HAVE_UNISTD_H
94#include <unistd.h>
95#endif
96
Guido van Rossumbcc20741998-08-04 22:53:56 +000097#if !defined(MS_WINDOWS) && !defined(PYOS_OS2) && !defined(__BEOS__)
Guido van Rossumfb4130d1996-12-10 15:17:08 +000098extern int gethostname(); /* For Solaris, at least */
99#endif
100
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000101#if defined(PYCC_VACPP)
102#include <types.h>
103#include <io.h>
104#include <sys/ioctl.h>
105#include <utils.h>
106#include <ctype.h>
107#endif
108
109#if defined(PYOS_OS2)
110#define INCL_DOS
111#define INCL_DOSERRORS
112#define INCL_NOPMAPI
113#include <os2.h>
114#endif
115
Guido van Rossumbcc20741998-08-04 22:53:56 +0000116#if defined(__BEOS__)
117/* It's in the libs, but not the headers... - [cjh] */
118int shutdown( int, int );
119#endif
120
Guido van Rossumb6775db1994-08-01 11:34:53 +0000121#include <sys/types.h>
122#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +0000123
Guido van Rossum81194471991-07-27 21:42:02 +0000124#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000125#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000126#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000127#include <sys/socket.h>
128#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +0000129#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000130#else
131#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000132#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000133#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000134#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000135#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000136#else
137#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000138#endif
139
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000140#ifndef O_NDELAY
141#define O_NDELAY O_NONBLOCK /* For QNX only? */
142#endif
143
Jack Jansen508537b1996-02-14 15:57:45 +0000144#ifdef USE_GUSI
145/* fdopen() isn't declared in stdio.h (sigh) */
146#include <GUSI.h>
147#endif
148
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000149
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000150/* Here we have some hacks to choose between K&R or ANSI style function
151 definitions. For NT to build this as an extension module (ie, DLL)
152 it must be compiled by the C++ compiler, as it takes the address of
153 a static data item exported from the main Python DLL.
154*/
Guido van Rossumbcc20741998-08-04 22:53:56 +0000155#if defined(MS_WINDOWS) || defined(__BEOS__)
156/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000157/* seem to be a few differences in the API */
158#define close closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000159#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000160#define FORCE_ANSI_FUNC_DEFS
161#endif
162
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000163#if defined(PYOS_OS2)
164#define close soclose
165#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
166#define FORCE_ANSI_FUNC_DEFS
167#endif
168
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000169#ifdef FORCE_ANSI_FUNC_DEFS
170#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
171fnname( arg1type arg1name )
172
173#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
174fnname( arg1type arg1name, arg2type arg2name )
175
176#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
177fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
178
179#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
180fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
181
182#else /* !FORCE_ANSI_FN_DEFS */
183#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
184fnname( arg1name ) \
185 arg1type arg1name;
186
187#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
188fnname( arg1name, arg2name ) \
189 arg1type arg1name; \
190 arg2type arg2name;
191
192#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
193fnname( arg1name, arg2name, arg3name ) \
194 arg1type arg1name; \
195 arg2type arg2name; \
196 arg3type arg3name;
197
198#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
199fnname( arg1name, arg2name, arg3name, arg4name ) \
200 arg1type arg1name; \
201 arg2type arg2name; \
202 arg3type arg3name; \
203 arg4type arg4name;
204
205#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000206
207/* Global variable holding the exception type for errors detected
208 by this module (but not argument type or memory errors, etc.). */
209
Guido van Rossum73624e91994-10-10 17:59:00 +0000210static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000211
212
213/* Convenience function to raise an error according to errno
214 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000215
Guido van Rossum73624e91994-10-10 17:59:00 +0000216static PyObject *
217PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000218{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000219#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000220 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000221 PyObject *v;
222 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000223 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000224 PyErr_SetObject(PySocket_Error, v);
225 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000226 }
227 return NULL;
228 }
229 else
230#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000231
232#if defined(PYOS_OS2)
233 if (sock_errno() != NO_ERROR) {
234 APIRET rc;
235 ULONG msglen;
236 char outbuf[100];
237 int myerrorcode = sock_errno();
238
239 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
240 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
241 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
242 if (rc == NO_ERROR) {
243 PyObject *v;
244
245 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
246 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
247 char *lastc = &outbuf[ strlen(outbuf)-1 ];
248 while (lastc > outbuf && isspace(*lastc))
249 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
250 }
251 v = Py_BuildValue("(is)", myerrorcode, outbuf);
252 if (v != NULL) {
253 PyErr_SetObject(PySocket_Error, v);
254 Py_DECREF(v);
255 }
256 return NULL;
257 }
258 }
259#endif
260
Guido van Rossum73624e91994-10-10 17:59:00 +0000261 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000262}
263
Guido van Rossum30a685f1991-06-27 15:51:29 +0000264
265/* The object holding a socket. It holds some extra information,
266 like the address family, which is used to decode socket address
267 arguments properly. */
268
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000269typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000270 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000271 int sock_fd; /* Socket file descriptor */
272 int sock_family; /* Address family, e.g., AF_INET */
273 int sock_type; /* Socket type, e.g., SOCK_STREAM */
274 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000275 union sock_addr {
276 struct sockaddr_in in;
277#ifdef AF_UNIX
278 struct sockaddr_un un;
279#endif
280 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000281} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000282
Guido van Rossum30a685f1991-06-27 15:51:29 +0000283
284/* A forward reference to the Socktype type object.
285 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000286 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000287 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000288
Guido van Rossum73624e91994-10-10 17:59:00 +0000289staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000290
Guido van Rossum30a685f1991-06-27 15:51:29 +0000291
292/* Create a new socket object.
293 This just creates the object and initializes it.
294 If the creation fails, return NULL and set an exception (implicit
295 in NEWOBJ()). */
296
Guido van Rossum73624e91994-10-10 17:59:00 +0000297static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000298BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000299{
Guido van Rossum73624e91994-10-10 17:59:00 +0000300 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000301 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000302 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000303 if (s != NULL) {
304 s->sock_fd = fd;
305 s->sock_family = family;
306 s->sock_type = type;
307 s->sock_proto = proto;
308 }
309 return s;
310}
311
Guido van Rossum30a685f1991-06-27 15:51:29 +0000312
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000313/* Lock to allow python interpreter to continue, but only allow one
314 thread to be in gethostbyname */
315#if defined(WITH_THREAD) && !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000316PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000317#endif
318
319
Guido van Rossum30a685f1991-06-27 15:51:29 +0000320/* Convert a string specifying a host name or one of a few symbolic
321 names to a numeric IP address. This usually calls gethostbyname()
322 to do the work; the names "" and "<broadcast>" are special.
323 Return the length (should always be 4 bytes), or negative if
324 an error occurred; then an exception is raised. */
325
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000326static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000327BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000328{
329 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000330 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000331 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000332 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000333#ifdef HAVE_GETHOSTBYNAME_R
334 struct hostent hp_allocated;
335 char buf[1001];
336 int buf_len = (sizeof buf) - 1;
337 int errnop;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000338#if defined(linux) && (__GLIBC__ >= 2)
339 int result;
340#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000341#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000342
Guido van Rossuma376cc51996-12-05 23:43:35 +0000343 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000344 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000345 addr_ret->sin_addr.s_addr = INADDR_ANY;
346 return 4;
347 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000348 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000349 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
350 return 4;
351 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000352 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
353 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
354 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
355 addr_ret->sin_addr.s_addr = htonl(
356 ((long) d1 << 24) | ((long) d2 << 16) |
357 ((long) d3 << 8) | ((long) d4 << 0));
358 return 4;
359 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000360 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000361#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000362#if defined(linux) && (__GLIBC__ >= 2)
363 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
364#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000365 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000366#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000367#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000368#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000369 PyThread_acquire_lock(gethostbyname_lock,1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000370#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000371 hp = gethostbyname(name);
372#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000373 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000374
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000375 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000376#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000377 /* Let's get real error message to return */
378 extern int h_errno;
379 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
380#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000381 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000382#endif
Guido van Rossum955becc1999-03-22 20:14:53 +0000383#if defined(WITH_THREAD) && !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
384 PyThread_release_lock(gethostbyname_lock);
385#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000386 return -1;
387 }
388 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000389 h_length = hp->h_length;
390#if defined(WITH_THREAD) && !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
391 PyThread_release_lock(gethostbyname_lock);
392#endif
393 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000394}
395
Guido van Rossum30a685f1991-06-27 15:51:29 +0000396
Guido van Rossum30a685f1991-06-27 15:51:29 +0000397/* Create a string object representing an IP address.
398 This is always a string of the form 'dd.dd.dd.dd' (with variable
399 size numbers). */
400
Guido van Rossum73624e91994-10-10 17:59:00 +0000401static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000402BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000403{
404 long x = ntohl(addr->sin_addr.s_addr);
405 char buf[100];
406 sprintf(buf, "%d.%d.%d.%d",
407 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
408 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000409 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000410}
411
412
413/* Create an object representing the given socket address,
414 suitable for passing it back to bind(), connect() etc.
415 The family field of the sockaddr structure is inspected
416 to determine what kind of address it really is. */
417
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000418/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000419static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000420BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000421{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000422 if (addrlen == 0) {
423 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000424 Py_INCREF(Py_None);
425 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000426 }
427
Guido van Rossumbcc20741998-08-04 22:53:56 +0000428#ifdef __BEOS__
429 /* XXX: BeOS version of accept() doesn't set family coreectly */
430 addr->sa_family = AF_INET;
431#endif
432
Guido van Rossum30a685f1991-06-27 15:51:29 +0000433 switch (addr->sa_family) {
434
435 case AF_INET:
436 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000437 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000438 PyObject *addrobj = makeipaddr(a);
439 PyObject *ret = NULL;
440 if (addrobj) {
441 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
442 Py_DECREF(addrobj);
443 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000444 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000445 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000446
Guido van Rossumb6775db1994-08-01 11:34:53 +0000447#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000448 case AF_UNIX:
449 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000450 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000451 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000452 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000453#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000454
455 /* More cases here... */
456
457 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000458 /* If we don't know the address family, don't raise an
459 exception -- return it as a tuple. */
460 return Py_BuildValue("is#",
461 addr->sa_family,
462 addr->sa_data,
463 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000464
Guido van Rossum30a685f1991-06-27 15:51:29 +0000465 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000466}
467
Guido van Rossum30a685f1991-06-27 15:51:29 +0000468
469/* Parse a socket address argument according to the socket object's
470 address family. Return 1 if the address was in the proper format,
471 0 of not. The address is returned through addr_ret, its length
472 through len_ret. */
473
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000474static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000475BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000476getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000477{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000478 switch (s->sock_family) {
479
Guido van Rossumb6775db1994-08-01 11:34:53 +0000480#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000481 case AF_UNIX:
482 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000483 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000484 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000485 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000486 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000487 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000488 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000489 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000490 PyErr_SetString(PySocket_Error,
491 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000492 return 0;
493 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000494 addr->sun_family = AF_UNIX;
495 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000496 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000497 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000498 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000499 return 1;
500 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000501#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000502
Guido van Rossum30a685f1991-06-27 15:51:29 +0000503 case AF_INET:
504 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000505 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000506 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000507 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000508 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000509 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000510 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000511 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000512 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000513 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000514 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000515 *addr_ret = (struct sockaddr *) addr;
516 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000517 return 1;
518 }
519
Guido van Rossum30a685f1991-06-27 15:51:29 +0000520 /* More cases here... */
521
522 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000523 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000524 return 0;
525
526 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000527}
528
Guido van Rossum30a685f1991-06-27 15:51:29 +0000529
Guido van Rossum710e1df1992-06-12 10:39:36 +0000530/* Get the address length according to the socket object's address family.
531 Return 1 if the family is known, 0 otherwise. The length is returned
532 through len_ret. */
533
534static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000535BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000536{
537 switch (s->sock_family) {
538
Guido van Rossumb6775db1994-08-01 11:34:53 +0000539#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000540 case AF_UNIX:
541 {
542 *len_ret = sizeof (struct sockaddr_un);
543 return 1;
544 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000545#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000546
547 case AF_INET:
548 {
549 *len_ret = sizeof (struct sockaddr_in);
550 return 1;
551 }
552
553 /* More cases here... */
554
555 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000556 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000557 return 0;
558
559 }
560}
561
562
Guido van Rossum30a685f1991-06-27 15:51:29 +0000563/* s.accept() method */
564
Guido van Rossum73624e91994-10-10 17:59:00 +0000565static PyObject *
566BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000567{
568 char addrbuf[256];
569 int addrlen, newfd;
Barry Warsaw752300b1997-01-03 17:18:10 +0000570 PyObject *sock = NULL;
571 PyObject *addr = NULL;
572 PyObject *res = NULL;
573
Guido van Rossum73624e91994-10-10 17:59:00 +0000574 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000575 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000576 if (!getsockaddrlen(s, &addrlen))
577 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000578 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000579 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000580 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000581 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000582 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000583
Guido van Rossum30a685f1991-06-27 15:51:29 +0000584 /* Create the new object with unspecified family,
585 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000586 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000587 s->sock_family,
588 s->sock_type,
589 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000590 if (sock == NULL) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000591 close(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000592 goto finally;
593 }
594 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
595 goto finally;
596
597 if (!(res = Py_BuildValue("OO", sock, addr)))
598 goto finally;
599
600 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000601 Py_XDECREF(sock);
602 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000603 return res;
604}
605
Guido van Rossum82a5c661998-07-07 20:45:43 +0000606static char accept_doc[] =
607"accept() -> (socket object, address info)\n\
608\n\
609Wait for an incoming connection. Return a new socket representing the\n\
610connection, and the address of the client. For IP sockets, the address\n\
611info is a pair (hostaddr, port).";
612
Guido van Rossum30a685f1991-06-27 15:51:29 +0000613
Guido van Rossume4485b01994-09-07 14:32:49 +0000614/* s.setblocking(1 | 0) method */
615
Guido van Rossum73624e91994-10-10 17:59:00 +0000616static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000617BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000618{
619 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000620#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000621 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000622#endif
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000623 if (!PyArg_Parse(args, "i", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000624 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000625 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000626#ifdef __BEOS__
627 block = !block;
628 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
629 (void *)(&block), sizeof( int ) );
630#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000631#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000632#ifdef PYOS_OS2
633 block = !block;
634 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
635#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000636 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
637 if (block)
638 delay_flag &= (~O_NDELAY);
639 else
640 delay_flag |= O_NDELAY;
641 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000642#endif /* !PYOS_OS2 */
643#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000644 block = !block;
645 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000646#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000647#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000648 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000649
Guido van Rossum73624e91994-10-10 17:59:00 +0000650 Py_INCREF(Py_None);
651 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000652}
Guido van Rossume4485b01994-09-07 14:32:49 +0000653
Guido van Rossum82a5c661998-07-07 20:45:43 +0000654static char setblocking_doc[] =
655"setblocking(flag)\n\
656\n\
657Set the socket to blocking (flag is true) or non-blocking (false).\n\
658This uses the FIONBIO ioctl with the O_NDELAY flag.";
659
Guido van Rossume4485b01994-09-07 14:32:49 +0000660
Guido van Rossumaee08791992-09-08 09:05:33 +0000661/* s.setsockopt() method.
662 With an integer third argument, sets an integer option.
663 With a string third argument, sets an option from a buffer;
664 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000665
Guido van Rossum73624e91994-10-10 17:59:00 +0000666static PyObject *
667BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000668{
669 int level;
670 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000671 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000672 char *buf;
673 int buflen;
674 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000675
Guido van Rossum73624e91994-10-10 17:59:00 +0000676 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000677 buf = (char *) &flag;
678 buflen = sizeof flag;
679 }
680 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000681 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +0000682 if (!PyArg_Parse(args, "(iis#)", &level, &optname,
683 &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000684 return NULL;
685 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000686 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000687 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000688 return PySocket_Err();
689 Py_INCREF(Py_None);
690 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000691}
692
Guido van Rossum82a5c661998-07-07 20:45:43 +0000693static char setsockopt_doc[] =
694"setsockopt(level, option, value)\n\
695\n\
696Set a socket option. See the Unix manual for level and option.\n\
697The value argument can either be an integer or a string.";
698
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000699
Guido van Rossumaee08791992-09-08 09:05:33 +0000700/* s.getsockopt() method.
701 With two arguments, retrieves an integer option.
702 With a third integer argument, retrieves a string buffer of that size;
703 use optional built-in module 'struct' to decode 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_getsockopt,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 Rossum73624e91994-10-10 17:59:00 +0000711 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000712 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000713
Guido van Rossumbcc20741998-08-04 22:53:56 +0000714#ifdef __BEOS__
715/* We have incomplete socket support. */
716 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
717 return NULL;
718#else
719
Guido van Rossumbe32c891996-06-20 16:25:29 +0000720 if (!PyArg_ParseTuple(args, "ii|i", &level, &optname, &buflen))
721 return NULL;
722
723 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000724 int flag = 0;
725 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000726 res = getsockopt(s->sock_fd, level, optname,
727 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000728 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000729 return PySocket_Err();
730 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000731 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000732 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000733 PyErr_SetString(PySocket_Error,
734 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000735 return NULL;
736 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000737 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000738 if (buf == NULL)
739 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000740 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000741 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000742 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000743 Py_DECREF(buf);
744 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000745 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000746 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000747 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000748#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000749}
750
Guido van Rossum82a5c661998-07-07 20:45:43 +0000751static char getsockopt_doc[] =
752"getsockopt(level, option[, buffersize]) -> value\n\
753\n\
754Get a socket option. See the Unix manual for level and option.\n\
755If a nonzero buffersize argument is given, the return value is a\n\
756string of that length; otherwise it is an integer.";
757
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000758
Guido van Rossum30a685f1991-06-27 15:51:29 +0000759/* s.bind(sockaddr) method */
760
Guido van Rossum73624e91994-10-10 17:59:00 +0000761static PyObject *
762BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000763{
764 struct sockaddr *addr;
765 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000766 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000767 if (!getsockaddrarg(s, args, &addr, &addrlen))
768 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000769 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000770 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000771 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000772 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000773 return PySocket_Err();
774 Py_INCREF(Py_None);
775 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000776}
777
Guido van Rossum82a5c661998-07-07 20:45:43 +0000778static char bind_doc[] =
779"bind(address)\n\
780\n\
781Bind the socket to a local address. For IP sockets, the address is a\n\
782pair (host, port); the host must refer to the local host.";
783
Guido van Rossum30a685f1991-06-27 15:51:29 +0000784
785/* s.close() method.
786 Set the file descriptor to -1 so operations tried subsequently
787 will surely fail. */
788
Guido van Rossum73624e91994-10-10 17:59:00 +0000789static PyObject *
790BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000791{
Guido van Rossum73624e91994-10-10 17:59:00 +0000792 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000793 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000794 if (s->sock_fd != -1) {
795 Py_BEGIN_ALLOW_THREADS
796 (void) close(s->sock_fd);
797 Py_END_ALLOW_THREADS
798 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000799 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000800 Py_INCREF(Py_None);
801 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000802}
803
Guido van Rossum82a5c661998-07-07 20:45:43 +0000804static char close_doc[] =
805"close()\n\
806\n\
807Close the socket. It cannot be used after this call.";
808
Guido van Rossum30a685f1991-06-27 15:51:29 +0000809
810/* s.connect(sockaddr) method */
811
Guido van Rossum73624e91994-10-10 17:59:00 +0000812static PyObject *
813BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000814{
815 struct sockaddr *addr;
816 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000817 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000818 if (!getsockaddrarg(s, args, &addr, &addrlen))
819 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000820 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000821 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000822 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000823 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000824 return PySocket_Err();
825 Py_INCREF(Py_None);
826 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000827}
828
Guido van Rossum82a5c661998-07-07 20:45:43 +0000829static char connect_doc[] =
830"connect(address)\n\
831\n\
832Connect the socket to a remote address. For IP sockets, the address\n\
833is a pair (host, port).";
834
Guido van Rossum30a685f1991-06-27 15:51:29 +0000835
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000836/* s.connect_ex(sockaddr) method */
837
838static PyObject *
839BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
840{
841 struct sockaddr *addr;
842 int addrlen;
843 int res;
844 if (!getsockaddrarg(s, args, &addr, &addrlen))
845 return NULL;
846 Py_BEGIN_ALLOW_THREADS
847 res = connect(s->sock_fd, addr, addrlen);
848 Py_END_ALLOW_THREADS
849 if (res != 0)
850 res = errno;
851 return PyInt_FromLong((long) res);
852}
853
Guido van Rossum82a5c661998-07-07 20:45:43 +0000854static char connect_ex_doc[] =
855"connect_ex(address)\n\
856\n\
857This is like connect(address), but returns an error code (the errno value)\n\
858instead of raising an exception when an error occurs.";
859
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000860
Guido van Rossumed233a51992-06-23 09:07:03 +0000861/* s.fileno() method */
862
Guido van Rossum73624e91994-10-10 17:59:00 +0000863static PyObject *
864BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000865{
Guido van Rossum73624e91994-10-10 17:59:00 +0000866 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000867 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000868 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000869}
870
Guido van Rossum82a5c661998-07-07 20:45:43 +0000871static char fileno_doc[] =
872"fileno() -> integer\n\
873\n\
874Return the integer file descriptor of the socket.";
875
Guido van Rossumed233a51992-06-23 09:07:03 +0000876
Guido van Rossumbe32c891996-06-20 16:25:29 +0000877#ifndef NO_DUP
878/* s.dup() method */
879
880static PyObject *
881BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
882{
883 int newfd;
884 PyObject *sock;
885 if (!PyArg_NoArgs(args))
886 return NULL;
887 newfd = dup(s->sock_fd);
888 if (newfd < 0)
889 return PySocket_Err();
890 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000891 s->sock_family,
892 s->sock_type,
893 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000894 if (sock == NULL)
895 close(newfd);
896 return sock;
897}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000898
899static char dup_doc[] =
900"dup() -> socket object\n\
901\n\
902Return a new socket object connected to the same system resource.";
903
Guido van Rossumbe32c891996-06-20 16:25:29 +0000904#endif
905
906
Guido van Rossumc89705d1992-11-26 08:54:07 +0000907/* s.getsockname() method */
908
Guido van Rossum73624e91994-10-10 17:59:00 +0000909static PyObject *
910BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000911{
912 char addrbuf[256];
913 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000914 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000915 return NULL;
916 if (!getsockaddrlen(s, &addrlen))
917 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000918 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000919 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000920 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000921 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000922 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000923 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000924 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
925}
926
Guido van Rossum82a5c661998-07-07 20:45:43 +0000927static char getsockname_doc[] =
928"getsockname() -> address info\n\
929\n\
930Return the address of the local endpoint. For IP sockets, the address\n\
931info is a pair (hostaddr, port).";
932
Guido van Rossumc89705d1992-11-26 08:54:07 +0000933
Guido van Rossumb6775db1994-08-01 11:34:53 +0000934#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000935/* s.getpeername() method */
936
Guido van Rossum73624e91994-10-10 17:59:00 +0000937static PyObject *
938BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000939{
940 char addrbuf[256];
941 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000942 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000943 return NULL;
944 if (!getsockaddrlen(s, &addrlen))
945 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000946 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000947 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000948 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000949 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000950 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000951 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
952}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000953
954static char getpeername_doc[] =
955"getpeername() -> address info\n\
956\n\
957Return the address of the remote endpoint. For IP sockets, the address\n\
958info is a pair (hostaddr, port).";
959
Guido van Rossumb6775db1994-08-01 11:34:53 +0000960#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000961
962
Guido van Rossum30a685f1991-06-27 15:51:29 +0000963/* s.listen(n) method */
964
Guido van Rossum73624e91994-10-10 17:59:00 +0000965static PyObject *
966BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000967{
968 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000969 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000970 if (!PyArg_Parse(args, "i", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000971 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000972 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000973 if (backlog < 1)
974 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000975 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000976 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000977 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000978 return PySocket_Err();
979 Py_INCREF(Py_None);
980 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000981}
982
Guido van Rossum82a5c661998-07-07 20:45:43 +0000983static char listen_doc[] =
984"listen(backlog)\n\
985\n\
986Enable a server to accept connections. The backlog argument must be at\n\
987least 1; it specifies the number of unaccepted connection that the system\n\
988will allow before refusing new connections.";
989
990
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000991#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000992/* s.makefile(mode) method.
993 Create a new open file object referring to a dupped version of
994 the socket's file descriptor. (The dup() call is necessary so
995 that the open file and socket objects may be closed independent
996 of each other.)
997 The mode argument specifies 'r' or 'w' passed to fdopen(). */
998
Guido van Rossum73624e91994-10-10 17:59:00 +0000999static PyObject *
1000BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001001{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001002 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +00001003 char *mode = "r";
1004 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001005 int fd;
1006 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001007 PyObject *f;
1008
1009 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001010 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001011#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001012 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1013 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001014#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001015 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001016#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001017 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001018 if (fd >= 0)
1019 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001020 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001021 }
1022 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1023 if (f != NULL)
1024 PyFile_SetBufSize(f, bufsize);
1025 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001026}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001027
1028static char makefile_doc[] =
1029"makefile([mode[, buffersize]]) -> file object\n\
1030\n\
1031Return a regular file object corresponding to the socket.\n\
1032The mode and buffersize arguments are as for the built-in open() function.";
1033
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001034#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001035
Guido van Rossum82a5c661998-07-07 20:45:43 +00001036
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001037/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001038
Guido van Rossum73624e91994-10-10 17:59:00 +00001039static PyObject *
1040BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001041{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001042 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001043 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001044 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1045 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001046 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001047 if (buf == NULL)
1048 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001049 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001050 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001051 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001052 if (n < 0) {
1053 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001054 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001055 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001056 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001057 return NULL;
1058 return buf;
1059}
1060
Guido van Rossum82a5c661998-07-07 20:45:43 +00001061static char recv_doc[] =
1062"recv(buffersize[, flags]) -> data\n\
1063\n\
1064Receive up to buffersize bytes from the socket. For the optional flags\n\
1065argument, see the Unix manual. When no data is available, block until\n\
1066at least one byte is available or until the remote end is closed. When\n\
1067the remote end is closed and all data is read, return the empty string.";
1068
Guido van Rossum30a685f1991-06-27 15:51:29 +00001069
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001070/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001071
Guido van Rossum73624e91994-10-10 17:59:00 +00001072static PyObject *
1073BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001074{
1075 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001076 PyObject *buf = NULL;
1077 PyObject *addr = NULL;
1078 PyObject *ret = NULL;
1079
Guido van Rossumbe32c891996-06-20 16:25:29 +00001080 int addrlen, len, n, flags = 0;
1081 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1082 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001083 if (!getsockaddrlen(s, &addrlen))
1084 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001085 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001086 if (buf == NULL)
1087 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001088 Py_BEGIN_ALLOW_THREADS
1089 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001090#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001091#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001092 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001093#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001094 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001095#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001096#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001097 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001098#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001099 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001100 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001101 if (n < 0) {
1102 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001103 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001104 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001105 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001106 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001107
1108 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1109 goto finally;
1110
Guido van Rossum73624e91994-10-10 17:59:00 +00001111 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001112 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001113 Py_XDECREF(addr);
1114 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001115 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001116}
1117
Guido van Rossum82a5c661998-07-07 20:45:43 +00001118static char recvfrom_doc[] =
1119"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1120\n\
1121Like recv(buffersize, flags) but also return the sender's address info.";
1122
Guido van Rossum30a685f1991-06-27 15:51:29 +00001123
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001124/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001125
Guido van Rossum73624e91994-10-10 17:59:00 +00001126static PyObject *
1127BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001128{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001129 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001130 int len, n, flags = 0;
1131 if (!PyArg_ParseTuple(args, "s#|i", &buf, &len, &flags))
1132 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001133 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001134 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001135 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001136 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001137 return PySocket_Err();
1138 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001139}
1140
Guido van Rossum82a5c661998-07-07 20:45:43 +00001141static char send_doc[] =
1142"send(data[, flags])\n\
1143\n\
1144Send a data string to the socket. For the optional flags\n\
1145argument, see the Unix manual.";
1146
Guido van Rossum30a685f1991-06-27 15:51:29 +00001147
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001148/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001149
Guido van Rossum73624e91994-10-10 17:59:00 +00001150static PyObject *
1151BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001152{
Guido van Rossum73624e91994-10-10 17:59:00 +00001153 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001154 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001155 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001156 int addrlen, len, n, flags;
1157 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001158 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
1159 PyErr_Clear();
1160 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001161 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001162 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001163 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001164 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001165 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001166 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001167 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001168 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001169 return PySocket_Err();
1170 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001171}
1172
Guido van Rossum82a5c661998-07-07 20:45:43 +00001173static char sendto_doc[] =
1174"sendto(data[, flags], address)\n\
1175\n\
1176Like send(data, flags) but allows specifying the destination address.\n\
1177For IP sockets, the address is a pair (hostaddr, port).";
1178
Guido van Rossum30a685f1991-06-27 15:51:29 +00001179
1180/* s.shutdown(how) method */
1181
Guido van Rossum73624e91994-10-10 17:59:00 +00001182static PyObject *
1183BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001184{
1185 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001186 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +00001187 if (!PyArg_Parse(args, "i", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001188 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001189 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001190 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001191 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001192 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001193 return PySocket_Err();
1194 Py_INCREF(Py_None);
1195 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001196}
1197
Guido van Rossum82a5c661998-07-07 20:45:43 +00001198static char shutdown_doc[] =
1199"shutdown(flag)\n\
1200\n\
1201Shut down the reading side of the socket (flag == 0), the writing side\n\
1202of the socket (flag == 1), or both ends (flag == 2).";
1203
Guido van Rossum30a685f1991-06-27 15:51:29 +00001204
1205/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001206
Guido van Rossum73624e91994-10-10 17:59:00 +00001207static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001208 {"accept", (PyCFunction)PySocketSock_accept, 0,
1209 accept_doc},
1210 {"bind", (PyCFunction)PySocketSock_bind, 0,
1211 bind_doc},
1212 {"close", (PyCFunction)PySocketSock_close, 0,
1213 close_doc},
1214 {"connect", (PyCFunction)PySocketSock_connect, 0,
1215 connect_doc},
1216 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 0,
1217 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001218#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001219 {"dup", (PyCFunction)PySocketSock_dup, 0,
1220 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001221#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001222 {"fileno", (PyCFunction)PySocketSock_fileno, 0,
1223 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001224#ifdef HAVE_GETPEERNAME
Guido van Rossum82a5c661998-07-07 20:45:43 +00001225 {"getpeername", (PyCFunction)PySocketSock_getpeername, 0,
1226 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001227#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001228 {"getsockname", (PyCFunction)PySocketSock_getsockname, 0,
1229 getsockname_doc},
1230 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1231 getsockopt_doc},
1232 {"listen", (PyCFunction)PySocketSock_listen, 0,
1233 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001234#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001235 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1236 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001237#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001238 {"recv", (PyCFunction)PySocketSock_recv, 1,
1239 recv_doc},
1240 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1241 recvfrom_doc},
1242 {"send", (PyCFunction)PySocketSock_send, 1,
1243 send_doc},
1244 {"sendto", (PyCFunction)PySocketSock_sendto, 0,
1245 sendto_doc},
1246 {"setblocking", (PyCFunction)PySocketSock_setblocking, 0,
1247 setblocking_doc},
1248 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 0,
1249 setsockopt_doc},
1250 {"shutdown", (PyCFunction)PySocketSock_shutdown, 0,
1251 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001252 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001253};
1254
Guido van Rossum30a685f1991-06-27 15:51:29 +00001255
Guido van Rossum73624e91994-10-10 17:59:00 +00001256/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001257 First close the file description. */
1258
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001259static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001260BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001261{
1262 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001263 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001264}
1265
Guido van Rossum30a685f1991-06-27 15:51:29 +00001266
1267/* Return a socket object's named attribute. */
1268
Guido van Rossum73624e91994-10-10 17:59:00 +00001269static PyObject *
1270BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001271{
Guido van Rossum73624e91994-10-10 17:59:00 +00001272 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001273}
1274
Guido van Rossum30a685f1991-06-27 15:51:29 +00001275
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001276static PyObject *
1277BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1278{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001279 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001280 sprintf(buf,
1281 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1282 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001283 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001284}
1285
1286
Guido van Rossumb6775db1994-08-01 11:34:53 +00001287/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001288
Guido van Rossum73624e91994-10-10 17:59:00 +00001289static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001290 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001291 0,
1292 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001293 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001294 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001295 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001296 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001297 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001298 0, /*tp_setattr*/
1299 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001300 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001301 0, /*tp_as_number*/
1302 0, /*tp_as_sequence*/
1303 0, /*tp_as_mapping*/
1304};
1305
Guido van Rossum30a685f1991-06-27 15:51:29 +00001306
Guido van Rossum81194471991-07-27 21:42:02 +00001307/* Python interface to gethostname(). */
1308
1309/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001310static PyObject *
1311BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001312{
1313 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001314 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001315 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +00001316 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001317 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001318 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001319 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001320 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001321 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001322 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001323 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001324}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001325
Guido van Rossum82a5c661998-07-07 20:45:43 +00001326static char gethostname_doc[] =
1327"gethostname() -> string\n\
1328\n\
1329Return the current host name.";
1330
Guido van Rossumff4949e1992-08-05 19:58:53 +00001331
Guido van Rossum30a685f1991-06-27 15:51:29 +00001332/* Python interface to gethostbyname(name). */
1333
1334/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001335static PyObject *
1336BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001337{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001338 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001339 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001340 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001341 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001342 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001343 return NULL;
1344 return makeipaddr(&addrbuf);
1345}
1346
Guido van Rossum82a5c661998-07-07 20:45:43 +00001347static char gethostbyname_doc[] =
1348"gethostbyname(host) -> address\n\
1349\n\
1350Return the IP address (a string of the form '255.255.255.255') for a host.";
1351
1352
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001353/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1354
1355static PyObject *
1356gethost_common(h, addr)
1357 struct hostent *h;
1358 struct sockaddr_in *addr;
1359{
1360 char **pch;
1361 PyObject *rtn_tuple = (PyObject *)NULL;
1362 PyObject *name_list = (PyObject *)NULL;
1363 PyObject *addr_list = (PyObject *)NULL;
1364 PyObject *tmp;
1365 if (h == NULL) {
1366#ifdef HAVE_HSTRERROR
1367 /* Let's get real error message to return */
1368 extern int h_errno;
1369 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1370#else
1371 PyErr_SetString(PySocket_Error, "host not found");
1372#endif
1373 return NULL;
1374 }
1375 if ((name_list = PyList_New(0)) == NULL)
1376 goto err;
1377 if ((addr_list = PyList_New(0)) == NULL)
1378 goto err;
1379 for (pch = h->h_aliases; *pch != NULL; pch++) {
1380 int status;
1381 tmp = PyString_FromString(*pch);
1382 if (tmp == NULL)
1383 goto err;
1384 status = PyList_Append(name_list, tmp);
1385 Py_DECREF(tmp);
1386 if (status)
1387 goto err;
1388 }
1389 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1390 int status;
1391 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1392 tmp = makeipaddr(addr);
1393 if (tmp == NULL)
1394 goto err;
1395 status = PyList_Append(addr_list, tmp);
1396 Py_DECREF(tmp);
1397 if (status)
1398 goto err;
1399 }
1400 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1401 err:
1402 Py_XDECREF(name_list);
1403 Py_XDECREF(addr_list);
1404 return rtn_tuple;
1405}
1406
1407
1408/* Python interface to gethostbyname_ex(name). */
1409
1410/*ARGSUSED*/
1411static PyObject *
1412BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1413{
1414 char *name;
1415 struct hostent *h;
1416 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001417 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001418#ifdef HAVE_GETHOSTBYNAME_R
1419 struct hostent hp_allocated;
1420 char buf[16384];
1421 int buf_len = (sizeof buf) - 1;
1422 int errnop;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001423#if defined(linux) && (__GLIBC__ >= 2)
1424 int result;
1425#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001426#endif /* HAVE_GETHOSTBYNAME_R */
1427 if (!PyArg_Parse(args, "s", &name))
1428 return NULL;
1429 if (setipaddr(name, &addr) < 0)
1430 return NULL;
1431 Py_BEGIN_ALLOW_THREADS
1432#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001433#if defined(linux) && (__GLIBC__ >= 2)
1434 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
1435#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001436 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001437#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001438#else /* not HAVE_GETHOSTBYNAME_R */
1439#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +00001440 PyThread_acquire_lock(gethostbyname_lock,1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001441#endif
1442 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001443#endif /* HAVE_GETHOSTBYNAME_R */
1444 Py_END_ALLOW_THREADS
Guido van Rossum955becc1999-03-22 20:14:53 +00001445 ret = gethost_common(h,&addr);
1446#if defined(WITH_THREAD) && !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
1447 PyThread_release_lock(gethostbyname_lock);
1448#endif
1449 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001450}
1451
1452static char ghbn_ex_doc[] =
1453"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1454\n\
1455Return the true host name, a list of aliases, and a list of IP addresses,\n\
1456for a host. The host argument is a string giving a host name or IP number.";
1457
1458
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001459/* Python interface to gethostbyaddr(IP). */
1460
1461/*ARGSUSED*/
1462static PyObject *
1463BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1464{
1465 struct sockaddr_in addr;
1466 char *ip_num;
1467 struct hostent *h;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001468#ifdef HAVE_GETHOSTBYNAME_R
1469 struct hostent hp_allocated;
1470 char buf[16384];
1471 int buf_len = (sizeof buf) - 1;
1472 int errnop;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001473#if defined(linux) && (__GLIBC__ >= 2)
1474 int result;
1475#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001476#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001477
1478 if (!PyArg_Parse(args, "s", &ip_num))
1479 return NULL;
1480 if (setipaddr(ip_num, &addr) < 0)
1481 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001482 Py_BEGIN_ALLOW_THREADS
1483#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001484#if defined(linux) && (__GLIBC__ >= 2)
1485 result = gethostbyaddr_r((char *)&addr.sin_addr,
1486 sizeof(addr.sin_addr),
1487 AF_INET, &hp_allocated, buf, buf_len,
1488 &h, &errnop);
1489#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001490 h = gethostbyaddr_r((char *)&addr.sin_addr,
1491 sizeof(addr.sin_addr),
1492 AF_INET,
1493 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001494#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001495#else /* not HAVE_GETHOSTBYNAME_R */
1496#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +00001497 PyThread_acquire_lock(gethostbyname_lock,1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001498#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001499 h = gethostbyaddr((char *)&addr.sin_addr,
1500 sizeof(addr.sin_addr),
1501 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001502#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +00001503 PyThread_release_lock(gethostbyname_lock);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001504#endif
1505#endif /* HAVE_GETHOSTBYNAME_R */
1506 Py_END_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001507 return gethost_common(h,&addr);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001508}
1509
Guido van Rossum82a5c661998-07-07 20:45:43 +00001510static char gethostbyaddr_doc[] =
1511"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1512\n\
1513Return the true host name, a list of aliases, and a list of IP addresses,\n\
1514for a host. The host argument is a string giving a host name or IP number.";
1515
Guido van Rossum30a685f1991-06-27 15:51:29 +00001516
1517/* Python interface to getservbyname(name).
1518 This only returns the port number, since the other info is already
1519 known or not useful (like the list of aliases). */
1520
1521/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001522static PyObject *
1523BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001524{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001525 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001526 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001527 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001528 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001529 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001530 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001531 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001532 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001533 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001534 return NULL;
1535 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001536 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001537}
1538
Guido van Rossum82a5c661998-07-07 20:45:43 +00001539static char getservbyname_doc[] =
1540"getservbyname(servicename, protocolname) -> integer\n\
1541\n\
1542Return a port number from a service name and protocol name.\n\
1543The protocol name should be 'tcp' or 'udp'.";
1544
Guido van Rossum30a685f1991-06-27 15:51:29 +00001545
Guido van Rossum3901d851996-12-19 16:35:04 +00001546/* Python interface to getprotobyname(name).
1547 This only returns the protocol number, since the other info is
1548 already known or not useful (like the list of aliases). */
1549
1550/*ARGSUSED*/
1551static PyObject *
1552BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1553{
1554 char *name;
1555 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001556#ifdef __BEOS__
1557/* Not available in BeOS yet. - [cjh] */
1558 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1559 return NULL;
1560#else
Guido van Rossum3901d851996-12-19 16:35:04 +00001561 if (!PyArg_Parse(args, "s", &name))
1562 return NULL;
1563 Py_BEGIN_ALLOW_THREADS
1564 sp = getprotobyname(name);
1565 Py_END_ALLOW_THREADS
1566 if (sp == NULL) {
1567 PyErr_SetString(PySocket_Error, "protocol not found");
1568 return NULL;
1569 }
1570 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001571#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001572}
1573
Guido van Rossum82a5c661998-07-07 20:45:43 +00001574static char getprotobyname_doc[] =
1575"getprotobyname(name) -> integer\n\
1576\n\
1577Return the protocol number for the named protocol. (Rarely used.)";
1578
Guido van Rossum3901d851996-12-19 16:35:04 +00001579
Guido van Rossum30a685f1991-06-27 15:51:29 +00001580/* Python interface to socket(family, type, proto).
1581 The third (protocol) argument is optional.
1582 Return a new socket object. */
1583
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001584/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001585static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001586BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001587{
Guido van Rossum73624e91994-10-10 17:59:00 +00001588 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001589#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001590 SOCKET fd;
1591#else
1592 int fd;
1593#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001594 int family, type, proto = 0;
1595 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1596 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001597 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001598 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001599 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001600#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001601 if (fd == INVALID_SOCKET)
1602#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001603 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001604#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001605 return PySocket_Err();
1606 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001607 /* If the object can't be created, don't forget to close the
1608 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001609 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001610 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001611 /* From now on, ignore SIGPIPE and let the error checking
1612 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001613#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001614 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001615#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001616 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001617}
1618
Guido van Rossum82a5c661998-07-07 20:45:43 +00001619static char socket_doc[] =
1620"socket(family, type[, proto]) -> socket object\n\
1621\n\
1622Open a socket of the given type. The family argument specifies the\n\
1623address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1624The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1625or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1626specifying the default protocol.";
1627
1628
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001629#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001630/* Create a socket object from a numeric file description.
1631 Useful e.g. if stdin is a socket.
1632 Additional arguments as for socket(). */
1633
1634/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001635static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001636BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001637{
Guido van Rossum73624e91994-10-10 17:59:00 +00001638 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001639 int fd, family, type, proto = 0;
1640 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1641 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001642 /* Dup the fd so it and the socket can be closed independently */
1643 fd = dup(fd);
1644 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001645 return PySocket_Err();
1646 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001647 /* From now on, ignore SIGPIPE and let the error checking
1648 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001649#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001650 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001651#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001652 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001653}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001654
1655static char fromfd_doc[] =
1656"fromfd(fd, family, type[, proto]) -> socket object\n\
1657\n\
1658Create a socket object from the given file descriptor.\n\
1659The remaining arguments are the same as for socket().";
1660
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001661#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001662
Guido van Rossum82a5c661998-07-07 20:45:43 +00001663
Guido van Rossum006bf911996-06-12 04:04:55 +00001664static PyObject *
1665BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1666{
1667 int x1, x2;
1668
1669 if (!PyArg_Parse(args, "i", &x1)) {
1670 return NULL;
1671 }
1672 x2 = (int)ntohs((short)x1);
1673 return PyInt_FromLong(x2);
1674}
1675
Guido van Rossum82a5c661998-07-07 20:45:43 +00001676static char ntohs_doc[] =
1677"ntohs(integer) -> integer\n\
1678\n\
1679Convert a 16-bit integer from network to host byte order.";
1680
1681
Guido van Rossum006bf911996-06-12 04:04:55 +00001682static PyObject *
1683BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1684{
1685 int x1, x2;
1686
1687 if (!PyArg_Parse(args, "i", &x1)) {
1688 return NULL;
1689 }
1690 x2 = ntohl(x1);
1691 return PyInt_FromLong(x2);
1692}
1693
Guido van Rossum82a5c661998-07-07 20:45:43 +00001694static char ntohl_doc[] =
1695"ntohl(integer) -> integer\n\
1696\n\
1697Convert a 32-bit integer from network to host byte order.";
1698
1699
Guido van Rossum006bf911996-06-12 04:04:55 +00001700static PyObject *
1701BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1702{
1703 int x1, x2;
1704
1705 if (!PyArg_Parse(args, "i", &x1)) {
1706 return NULL;
1707 }
1708 x2 = (int)htons((short)x1);
1709 return PyInt_FromLong(x2);
1710}
1711
Guido van Rossum82a5c661998-07-07 20:45:43 +00001712static char htons_doc[] =
1713"htons(integer) -> integer\n\
1714\n\
1715Convert a 16-bit integer from host to network byte order.";
1716
1717
Guido van Rossum006bf911996-06-12 04:04:55 +00001718static PyObject *
1719BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1720{
1721 int x1, x2;
1722
1723 if (!PyArg_Parse(args, "i", &x1)) {
1724 return NULL;
1725 }
1726 x2 = htonl(x1);
1727 return PyInt_FromLong(x2);
1728}
1729
Guido van Rossum82a5c661998-07-07 20:45:43 +00001730static char htonl_doc[] =
1731"htonl(integer) -> integer\n\
1732\n\
1733Convert a 32-bit integer from host to network byte order.";
1734
1735
Guido van Rossum30a685f1991-06-27 15:51:29 +00001736/* List of functions exported by this module. */
1737
Guido van Rossum73624e91994-10-10 17:59:00 +00001738static PyMethodDef PySocket_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001739 {"gethostbyname", PySocket_gethostbyname, 0, gethostbyname_doc},
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001740 {"gethostbyname_ex", PySocket_gethostbyname_ex, 0, ghbn_ex_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00001741 {"gethostbyaddr", PySocket_gethostbyaddr, 0, gethostbyaddr_doc},
1742 {"gethostname", PySocket_gethostname, 0, gethostname_doc},
1743 {"getservbyname", PySocket_getservbyname, 0, getservbyname_doc},
1744 {"getprotobyname", PySocket_getprotobyname, 0,getprotobyname_doc},
1745 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001746#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001747 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001748#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001749 {"ntohs", PySocket_ntohs, 0, ntohs_doc},
1750 {"ntohl", PySocket_ntohl, 0, ntohl_doc},
1751 {"htons", PySocket_htons, 0, htons_doc},
1752 {"htonl", PySocket_htonl, 0, htonl_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001753 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001754};
1755
Guido van Rossum30a685f1991-06-27 15:51:29 +00001756
1757/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00001758 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001759 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00001760 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001761static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001762BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001763{
Guido van Rossum73624e91994-10-10 17:59:00 +00001764 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00001765 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001766 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00001767
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001768 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001769}
1770
Guido van Rossum30a685f1991-06-27 15:51:29 +00001771
Guido van Rossum8d665e61996-06-26 18:22:49 +00001772#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001773
1774/* Additional initialization and cleanup for NT/Windows */
1775
1776static void
1777NTcleanup()
1778{
1779 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001780}
1781
1782static int
1783NTinit()
1784{
1785 WSADATA WSAData;
1786 int ret;
1787 char buf[100];
1788 ret = WSAStartup(0x0101, &WSAData);
1789 switch (ret) {
1790 case 0: /* no error */
1791 atexit(NTcleanup);
1792 return 1;
1793 case WSASYSNOTREADY:
1794 PyErr_SetString(PyExc_ImportError,
1795 "WSAStartup failed: network not ready");
1796 break;
1797 case WSAVERNOTSUPPORTED:
1798 case WSAEINVAL:
1799 PyErr_SetString(PyExc_ImportError,
1800 "WSAStartup failed: requested version not supported");
1801 break;
1802 default:
1803 sprintf(buf, "WSAStartup failed: error code %d", ret);
1804 PyErr_SetString(PyExc_ImportError, buf);
1805 break;
1806 }
1807 return 0;
1808}
1809
Guido van Rossum8d665e61996-06-26 18:22:49 +00001810#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00001811
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001812#if defined(PYOS_OS2)
1813
1814/* Additional initialization and cleanup for OS/2 */
1815
1816static void
1817OS2cleanup()
1818{
1819 /* No cleanup is necessary for OS/2 Sockets */
1820}
1821
1822static int
1823OS2init()
1824{
1825 char reason[64];
1826 int rc = sock_init();
1827
1828 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00001829 atexit(OS2cleanup);
1830 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001831 }
1832
1833 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
1834 PyErr_SetString(PyExc_ImportError, reason);
1835
Guido van Rossum32c575d1997-12-02 20:37:32 +00001836 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001837}
1838
1839#endif /* PYOS_OS2 */
1840
Guido van Rossumbe32c891996-06-20 16:25:29 +00001841
Guido van Rossum30a685f1991-06-27 15:51:29 +00001842/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001843 * This is called when the first 'import socket' is done,
1844 * via a table in config.c, if config.c is compiled with USE_SOCKET
1845 * defined.
1846 *
1847 * For MS_WINDOWS (which means any Windows variant), this module
1848 * is actually called "_socket", and there's a wrapper "socket.py"
1849 * which implements some missing functionality (such as makefile(),
1850 * dup() and fromfd()). The import of "_socket" may fail with an
1851 * ImportError exception if initialization of WINSOCK fails. When
1852 * WINSOCK is initialized succesfully, a call to WSACleanup() is
1853 * scheduled to be made at exit time.
1854 *
1855 * For OS/2, this module is also called "_socket" and uses a wrapper
1856 * "socket.py" which implements that functionality that is missing
1857 * when PC operating systems don't put socket descriptors in the
1858 * operating system's filesystem layer.
1859 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001860
Guido van Rossum82a5c661998-07-07 20:45:43 +00001861static char module_doc[] =
1862"This module provides socket operations and some related functions.\n\
1863On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
1864On other systems, it only supports IP.\n\
1865\n\
1866Functions:\n\
1867\n\
1868socket() -- create a new socket object\n\
1869fromfd() -- create a socket object from an open file descriptor (*)\n\
1870gethostname() -- return the current hostname\n\
1871gethostbyname() -- map a hostname to its IP number\n\
1872gethostbyaddr() -- map an IP number or hostname to DNS info\n\
1873getservbyname() -- map a service name and a protocol name to a port number\n\
1874getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
1875ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
1876htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
1877\n\
1878(*) not available on all platforms!)\n\
1879\n\
1880Special objects:\n\
1881\n\
1882SocketType -- type object for socket objects\n\
1883error -- exception raised for I/O errors\n\
1884\n\
1885Integer constants:\n\
1886\n\
1887AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
1888SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
1889\n\
1890Many other constants may be defined; these may be used in calls to\n\
1891the setsockopt() and getsockopt() methods.\n\
1892";
1893
1894static char sockettype_doc[] =
1895"A socket represents one endpoint of a network connection.\n\
1896\n\
1897Methods:\n\
1898\n\
1899accept() -- accept a connection, returning new socket and client address\n\
1900bind() -- bind the socket to a local address\n\
1901close() -- close the socket\n\
1902connect() -- connect the socket to a remote address\n\
1903connect_ex() -- connect, return an error code instead of an exception \n\
1904dup() -- return a new socket object identical to the current one (*)\n\
1905fileno() -- return underlying file descriptor\n\
1906getpeername() -- return remote address (*)\n\
1907getsockname() -- return local address\n\
1908getsockopt() -- get socket options\n\
1909listen() -- start listening for incoming connections\n\
1910makefile() -- return a file object corresponding tot the socket (*)\n\
1911recv() -- receive data\n\
1912recvfrom() -- receive data and sender's address\n\
1913send() -- send data\n\
1914sendto() -- send data to a given address\n\
1915setblocking() -- set or clear the blocking I/O flag\n\
1916setsockopt() -- set socket options\n\
1917shutdown() -- shut down traffic in one or both directions\n\
1918\n\
1919(*) not available on all platforms!)";
1920
Guido van Rossum3886bb61998-12-04 18:50:17 +00001921DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00001922#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001923init_socket()
1924#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001925initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00001926#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001927{
Guido van Rossum73624e91994-10-10 17:59:00 +00001928 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001929#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001930 if (!NTinit())
1931 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001932 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001933#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00001934#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001935 if (!OS2init())
1936 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001937 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00001938#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00001939#if defined(__BEOS__)
1940 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
1941#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001942 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001943#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00001944#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001945#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001946 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001947 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
1948 if (PySocket_Error == NULL)
1949 return;
1950 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001951 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001952 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001953 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00001954 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001955 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001956 return;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001957 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001958#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001959 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001960#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001961 insint(d, "SOCK_STREAM", SOCK_STREAM);
1962 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001963#ifndef __BEOS__
1964/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001965 insint(d, "SOCK_RAW", SOCK_RAW);
1966 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1967 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001968#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001969
1970#ifdef SO_DEBUG
1971 insint(d, "SO_DEBUG", SO_DEBUG);
1972#endif
1973#ifdef SO_ACCEPTCONN
1974 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1975#endif
1976#ifdef SO_REUSEADDR
1977 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1978#endif
1979#ifdef SO_KEEPALIVE
1980 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1981#endif
1982#ifdef SO_DONTROUTE
1983 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1984#endif
1985#ifdef SO_BROADCAST
1986 insint(d, "SO_BROADCAST", SO_BROADCAST);
1987#endif
1988#ifdef SO_USELOOPBACK
1989 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1990#endif
1991#ifdef SO_LINGER
1992 insint(d, "SO_LINGER", SO_LINGER);
1993#endif
1994#ifdef SO_OOBINLINE
1995 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1996#endif
1997#ifdef SO_REUSEPORT
1998 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1999#endif
2000
2001#ifdef SO_SNDBUF
2002 insint(d, "SO_SNDBUF", SO_SNDBUF);
2003#endif
2004#ifdef SO_RCVBUF
2005 insint(d, "SO_RCVBUF", SO_RCVBUF);
2006#endif
2007#ifdef SO_SNDLOWAT
2008 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2009#endif
2010#ifdef SO_RCVLOWAT
2011 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2012#endif
2013#ifdef SO_SNDTIMEO
2014 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2015#endif
2016#ifdef SO_RCVTIMEO
2017 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2018#endif
2019#ifdef SO_ERROR
2020 insint(d, "SO_ERROR", SO_ERROR);
2021#endif
2022#ifdef SO_TYPE
2023 insint(d, "SO_TYPE", SO_TYPE);
2024#endif
2025
2026 /* Maximum number of connections for "listen" */
2027#ifdef SOMAXCONN
2028 insint(d, "SOMAXCONN", SOMAXCONN);
2029#else
2030 insint(d, "SOMAXCONN", 5); /* Common value */
2031#endif
2032
2033 /* Flags for send, recv */
2034#ifdef MSG_OOB
2035 insint(d, "MSG_OOB", MSG_OOB);
2036#endif
2037#ifdef MSG_PEEK
2038 insint(d, "MSG_PEEK", MSG_PEEK);
2039#endif
2040#ifdef MSG_DONTROUTE
2041 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2042#endif
2043#ifdef MSG_EOR
2044 insint(d, "MSG_EOR", MSG_EOR);
2045#endif
2046#ifdef MSG_TRUNC
2047 insint(d, "MSG_TRUNC", MSG_TRUNC);
2048#endif
2049#ifdef MSG_CTRUNC
2050 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2051#endif
2052#ifdef MSG_WAITALL
2053 insint(d, "MSG_WAITALL", MSG_WAITALL);
2054#endif
2055#ifdef MSG_BTAG
2056 insint(d, "MSG_BTAG", MSG_BTAG);
2057#endif
2058#ifdef MSG_ETAG
2059 insint(d, "MSG_ETAG", MSG_ETAG);
2060#endif
2061
2062 /* Protocol level and numbers, usable for [gs]etsockopt */
Guido van Rossum578de301998-05-28 20:18:18 +00002063/* Sigh -- some systems (e.g. Linux) use enums for these. */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002064#ifdef SOL_SOCKET
2065 insint(d, "SOL_SOCKET", SOL_SOCKET);
2066#endif
2067#ifdef IPPROTO_IP
2068 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002069#else
2070 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002071#endif
2072#ifdef IPPROTO_ICMP
2073 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002074#else
2075 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002076#endif
2077#ifdef IPPROTO_IGMP
2078 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2079#endif
2080#ifdef IPPROTO_GGP
2081 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2082#endif
2083#ifdef IPPROTO_TCP
2084 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002085#else
2086 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002087#endif
2088#ifdef IPPROTO_EGP
2089 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2090#endif
2091#ifdef IPPROTO_PUP
2092 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2093#endif
2094#ifdef IPPROTO_UDP
2095 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002096#else
2097 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002098#endif
2099#ifdef IPPROTO_IDP
2100 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2101#endif
2102#ifdef IPPROTO_HELLO
2103 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2104#endif
2105#ifdef IPPROTO_ND
2106 insint(d, "IPPROTO_ND", IPPROTO_ND);
2107#endif
2108#ifdef IPPROTO_TP
2109 insint(d, "IPPROTO_TP", IPPROTO_TP);
2110#endif
2111#ifdef IPPROTO_XTP
2112 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2113#endif
2114#ifdef IPPROTO_EON
2115 insint(d, "IPPROTO_EON", IPPROTO_EON);
2116#endif
2117#ifdef IPPROTO_BIP
2118 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2119#endif
2120/**/
2121#ifdef IPPROTO_RAW
2122 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002123#else
2124 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002125#endif
2126#ifdef IPPROTO_MAX
2127 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2128#endif
2129
2130 /* Some port configuration */
2131#ifdef IPPORT_RESERVED
2132 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2133#else
2134 insint(d, "IPPORT_RESERVED", 1024);
2135#endif
2136#ifdef IPPORT_USERRESERVED
2137 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2138#else
2139 insint(d, "IPPORT_USERRESERVED", 5000);
2140#endif
2141
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002142 /* Some reserved IP v.4 addresses */
2143#ifdef INADDR_ANY
2144 insint(d, "INADDR_ANY", INADDR_ANY);
2145#else
2146 insint(d, "INADDR_ANY", 0x00000000);
2147#endif
2148#ifdef INADDR_BROADCAST
2149 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2150#else
2151 insint(d, "INADDR_BROADCAST", 0xffffffff);
2152#endif
2153#ifdef INADDR_LOOPBACK
2154 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2155#else
2156 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2157#endif
2158#ifdef INADDR_UNSPEC_GROUP
2159 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2160#else
2161 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2162#endif
2163#ifdef INADDR_ALLHOSTS_GROUP
2164 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2165#else
2166 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2167#endif
2168#ifdef INADDR_MAX_LOCAL_GROUP
2169 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2170#else
2171 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2172#endif
2173#ifdef INADDR_NONE
2174 insint(d, "INADDR_NONE", INADDR_NONE);
2175#else
2176 insint(d, "INADDR_NONE", 0xffffffff);
2177#endif
2178
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002179 /* IP [gs]etsockopt options */
2180#ifdef IP_OPTIONS
2181 insint(d, "IP_OPTIONS", IP_OPTIONS);
2182#endif
2183#ifdef IP_HDRINCL
2184 insint(d, "IP_HDRINCL", IP_HDRINCL);
2185#endif
2186#ifdef IP_TOS
2187 insint(d, "IP_TOS", IP_TOS);
2188#endif
2189#ifdef IP_TTL
2190 insint(d, "IP_TTL", IP_TTL);
2191#endif
2192#ifdef IP_RECVOPTS
2193 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2194#endif
2195#ifdef IP_RECVRETOPTS
2196 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2197#endif
2198#ifdef IP_RECVDSTADDR
2199 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2200#endif
2201#ifdef IP_RETOPTS
2202 insint(d, "IP_RETOPTS", IP_RETOPTS);
2203#endif
2204#ifdef IP_MULTICAST_IF
2205 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2206#endif
2207#ifdef IP_MULTICAST_TTL
2208 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2209#endif
2210#ifdef IP_MULTICAST_LOOP
2211 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2212#endif
2213#ifdef IP_ADD_MEMBERSHIP
2214 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2215#endif
2216#ifdef IP_DROP_MEMBERSHIP
2217 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2218#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002219
2220 /* Initialize gethostbyname lock */
2221#if defined(WITH_THREAD) && !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +00002222 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002223#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002224}