blob: 8b087d2ce126630b9b21351a345fb2834296a78e [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;
331 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000332#ifdef HAVE_GETHOSTBYNAME_R
333 struct hostent hp_allocated;
334 char buf[1001];
335 int buf_len = (sizeof buf) - 1;
336 int errnop;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000337#if defined(linux) && (__GLIBC__ >= 2)
338 int result;
339#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000340#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000341
Guido van Rossuma376cc51996-12-05 23:43:35 +0000342 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000343 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000344 addr_ret->sin_addr.s_addr = INADDR_ANY;
345 return 4;
346 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000347 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000348 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
349 return 4;
350 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000351 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
352 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
353 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
354 addr_ret->sin_addr.s_addr = htonl(
355 ((long) d1 << 24) | ((long) d2 << 16) |
356 ((long) d3 << 8) | ((long) d4 << 0));
357 return 4;
358 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000359 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000360#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000361#if defined(linux) && (__GLIBC__ >= 2)
362 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
363#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000364 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000365#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000366#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000367#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000368 PyThread_acquire_lock(gethostbyname_lock,1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000369#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000370 hp = gethostbyname(name);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000371#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000372 PyThread_release_lock(gethostbyname_lock);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000373#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000374#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000375 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000376
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000377 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000378#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000379 /* Let's get real error message to return */
380 extern int h_errno;
381 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
382#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000383 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000384#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000385 return -1;
386 }
387 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
388 return hp->h_length;
389}
390
Guido van Rossum30a685f1991-06-27 15:51:29 +0000391
Guido van Rossum30a685f1991-06-27 15:51:29 +0000392/* Create a string object representing an IP address.
393 This is always a string of the form 'dd.dd.dd.dd' (with variable
394 size numbers). */
395
Guido van Rossum73624e91994-10-10 17:59:00 +0000396static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000397BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000398{
399 long x = ntohl(addr->sin_addr.s_addr);
400 char buf[100];
401 sprintf(buf, "%d.%d.%d.%d",
402 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
403 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000404 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000405}
406
407
408/* Create an object representing the given socket address,
409 suitable for passing it back to bind(), connect() etc.
410 The family field of the sockaddr structure is inspected
411 to determine what kind of address it really is. */
412
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000413/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000414static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000415BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000416{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000417 if (addrlen == 0) {
418 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000419 Py_INCREF(Py_None);
420 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000421 }
422
Guido van Rossumbcc20741998-08-04 22:53:56 +0000423#ifdef __BEOS__
424 /* XXX: BeOS version of accept() doesn't set family coreectly */
425 addr->sa_family = AF_INET;
426#endif
427
Guido van Rossum30a685f1991-06-27 15:51:29 +0000428 switch (addr->sa_family) {
429
430 case AF_INET:
431 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000432 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000433 PyObject *addrobj = makeipaddr(a);
434 PyObject *ret = NULL;
435 if (addrobj) {
436 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
437 Py_DECREF(addrobj);
438 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000439 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000440 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000441
Guido van Rossumb6775db1994-08-01 11:34:53 +0000442#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000443 case AF_UNIX:
444 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000445 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000446 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000447 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000448#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000449
450 /* More cases here... */
451
452 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000453 /* If we don't know the address family, don't raise an
454 exception -- return it as a tuple. */
455 return Py_BuildValue("is#",
456 addr->sa_family,
457 addr->sa_data,
458 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000459
Guido van Rossum30a685f1991-06-27 15:51:29 +0000460 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000461}
462
Guido van Rossum30a685f1991-06-27 15:51:29 +0000463
464/* Parse a socket address argument according to the socket object's
465 address family. Return 1 if the address was in the proper format,
466 0 of not. The address is returned through addr_ret, its length
467 through len_ret. */
468
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000469static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000470BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000471getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000472{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000473 switch (s->sock_family) {
474
Guido van Rossumb6775db1994-08-01 11:34:53 +0000475#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000476 case AF_UNIX:
477 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000478 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000479 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000480 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000481 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000482 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000483 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000484 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000485 PyErr_SetString(PySocket_Error,
486 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000487 return 0;
488 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000489 addr->sun_family = AF_UNIX;
490 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000491 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000492 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000493 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000494 return 1;
495 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000496#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000497
Guido van Rossum30a685f1991-06-27 15:51:29 +0000498 case AF_INET:
499 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000500 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000501 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000502 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000503 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000504 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000505 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000506 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000507 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000508 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000509 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000510 *addr_ret = (struct sockaddr *) addr;
511 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000512 return 1;
513 }
514
Guido van Rossum30a685f1991-06-27 15:51:29 +0000515 /* More cases here... */
516
517 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000518 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000519 return 0;
520
521 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000522}
523
Guido van Rossum30a685f1991-06-27 15:51:29 +0000524
Guido van Rossum710e1df1992-06-12 10:39:36 +0000525/* Get the address length according to the socket object's address family.
526 Return 1 if the family is known, 0 otherwise. The length is returned
527 through len_ret. */
528
529static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000530BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000531{
532 switch (s->sock_family) {
533
Guido van Rossumb6775db1994-08-01 11:34:53 +0000534#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000535 case AF_UNIX:
536 {
537 *len_ret = sizeof (struct sockaddr_un);
538 return 1;
539 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000540#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000541
542 case AF_INET:
543 {
544 *len_ret = sizeof (struct sockaddr_in);
545 return 1;
546 }
547
548 /* More cases here... */
549
550 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000551 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000552 return 0;
553
554 }
555}
556
557
Guido van Rossum30a685f1991-06-27 15:51:29 +0000558/* s.accept() method */
559
Guido van Rossum73624e91994-10-10 17:59:00 +0000560static PyObject *
561BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000562{
563 char addrbuf[256];
564 int addrlen, newfd;
Barry Warsaw752300b1997-01-03 17:18:10 +0000565 PyObject *sock = NULL;
566 PyObject *addr = NULL;
567 PyObject *res = NULL;
568
Guido van Rossum73624e91994-10-10 17:59:00 +0000569 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000570 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000571 if (!getsockaddrlen(s, &addrlen))
572 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000573 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000574 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000575 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000576 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000577 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000578
Guido van Rossum30a685f1991-06-27 15:51:29 +0000579 /* Create the new object with unspecified family,
580 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000581 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000582 s->sock_family,
583 s->sock_type,
584 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000585 if (sock == NULL) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000586 close(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000587 goto finally;
588 }
589 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
590 goto finally;
591
592 if (!(res = Py_BuildValue("OO", sock, addr)))
593 goto finally;
594
595 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000596 Py_XDECREF(sock);
597 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000598 return res;
599}
600
Guido van Rossum82a5c661998-07-07 20:45:43 +0000601static char accept_doc[] =
602"accept() -> (socket object, address info)\n\
603\n\
604Wait for an incoming connection. Return a new socket representing the\n\
605connection, and the address of the client. For IP sockets, the address\n\
606info is a pair (hostaddr, port).";
607
Guido van Rossum30a685f1991-06-27 15:51:29 +0000608
Guido van Rossume4485b01994-09-07 14:32:49 +0000609/* s.setblocking(1 | 0) method */
610
Guido van Rossum73624e91994-10-10 17:59:00 +0000611static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000612BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000613{
614 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000615#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000616 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000617#endif
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000618 if (!PyArg_Parse(args, "i", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000619 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000620 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000621#ifdef __BEOS__
622 block = !block;
623 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
624 (void *)(&block), sizeof( int ) );
625#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000626#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000627#ifdef PYOS_OS2
628 block = !block;
629 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
630#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000631 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
632 if (block)
633 delay_flag &= (~O_NDELAY);
634 else
635 delay_flag |= O_NDELAY;
636 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000637#endif /* !PYOS_OS2 */
638#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000639 block = !block;
640 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000641#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000642#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000643 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000644
Guido van Rossum73624e91994-10-10 17:59:00 +0000645 Py_INCREF(Py_None);
646 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000647}
Guido van Rossume4485b01994-09-07 14:32:49 +0000648
Guido van Rossum82a5c661998-07-07 20:45:43 +0000649static char setblocking_doc[] =
650"setblocking(flag)\n\
651\n\
652Set the socket to blocking (flag is true) or non-blocking (false).\n\
653This uses the FIONBIO ioctl with the O_NDELAY flag.";
654
Guido van Rossume4485b01994-09-07 14:32:49 +0000655
Guido van Rossumaee08791992-09-08 09:05:33 +0000656/* s.setsockopt() method.
657 With an integer third argument, sets an integer option.
658 With a string third argument, sets an option from a buffer;
659 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000660
Guido van Rossum73624e91994-10-10 17:59:00 +0000661static PyObject *
662BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000663{
664 int level;
665 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000666 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000667 char *buf;
668 int buflen;
669 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000670
Guido van Rossum73624e91994-10-10 17:59:00 +0000671 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000672 buf = (char *) &flag;
673 buflen = sizeof flag;
674 }
675 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000676 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +0000677 if (!PyArg_Parse(args, "(iis#)", &level, &optname,
678 &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000679 return NULL;
680 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000681 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000682 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000683 return PySocket_Err();
684 Py_INCREF(Py_None);
685 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000686}
687
Guido van Rossum82a5c661998-07-07 20:45:43 +0000688static char setsockopt_doc[] =
689"setsockopt(level, option, value)\n\
690\n\
691Set a socket option. See the Unix manual for level and option.\n\
692The value argument can either be an integer or a string.";
693
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000694
Guido van Rossumaee08791992-09-08 09:05:33 +0000695/* s.getsockopt() method.
696 With two arguments, retrieves an integer option.
697 With a third integer argument, retrieves a string buffer of that size;
698 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000699
Guido van Rossum73624e91994-10-10 17:59:00 +0000700static PyObject *
701BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000702{
703 int level;
704 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000705 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000706 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000707 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000708
Guido van Rossumbcc20741998-08-04 22:53:56 +0000709#ifdef __BEOS__
710/* We have incomplete socket support. */
711 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
712 return NULL;
713#else
714
Guido van Rossumbe32c891996-06-20 16:25:29 +0000715 if (!PyArg_ParseTuple(args, "ii|i", &level, &optname, &buflen))
716 return NULL;
717
718 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000719 int flag = 0;
720 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000721 res = getsockopt(s->sock_fd, level, optname,
722 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000723 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000724 return PySocket_Err();
725 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000726 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000727 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000728 PyErr_SetString(PySocket_Error,
729 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000730 return NULL;
731 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000732 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000733 if (buf == NULL)
734 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000735 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000736 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000737 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000738 Py_DECREF(buf);
739 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000740 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000741 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000742 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000743#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000744}
745
Guido van Rossum82a5c661998-07-07 20:45:43 +0000746static char getsockopt_doc[] =
747"getsockopt(level, option[, buffersize]) -> value\n\
748\n\
749Get a socket option. See the Unix manual for level and option.\n\
750If a nonzero buffersize argument is given, the return value is a\n\
751string of that length; otherwise it is an integer.";
752
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000753
Guido van Rossum30a685f1991-06-27 15:51:29 +0000754/* s.bind(sockaddr) method */
755
Guido van Rossum73624e91994-10-10 17:59:00 +0000756static PyObject *
757BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000758{
759 struct sockaddr *addr;
760 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000761 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000762 if (!getsockaddrarg(s, args, &addr, &addrlen))
763 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000764 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000765 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000766 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000767 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000768 return PySocket_Err();
769 Py_INCREF(Py_None);
770 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000771}
772
Guido van Rossum82a5c661998-07-07 20:45:43 +0000773static char bind_doc[] =
774"bind(address)\n\
775\n\
776Bind the socket to a local address. For IP sockets, the address is a\n\
777pair (host, port); the host must refer to the local host.";
778
Guido van Rossum30a685f1991-06-27 15:51:29 +0000779
780/* s.close() method.
781 Set the file descriptor to -1 so operations tried subsequently
782 will surely fail. */
783
Guido van Rossum73624e91994-10-10 17:59:00 +0000784static PyObject *
785BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000786{
Guido van Rossum73624e91994-10-10 17:59:00 +0000787 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000788 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000789 if (s->sock_fd != -1) {
790 Py_BEGIN_ALLOW_THREADS
791 (void) close(s->sock_fd);
792 Py_END_ALLOW_THREADS
793 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000794 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000795 Py_INCREF(Py_None);
796 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000797}
798
Guido van Rossum82a5c661998-07-07 20:45:43 +0000799static char close_doc[] =
800"close()\n\
801\n\
802Close the socket. It cannot be used after this call.";
803
Guido van Rossum30a685f1991-06-27 15:51:29 +0000804
805/* s.connect(sockaddr) method */
806
Guido van Rossum73624e91994-10-10 17:59:00 +0000807static PyObject *
808BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000809{
810 struct sockaddr *addr;
811 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000812 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000813 if (!getsockaddrarg(s, args, &addr, &addrlen))
814 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000815 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000816 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000817 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000818 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000819 return PySocket_Err();
820 Py_INCREF(Py_None);
821 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000822}
823
Guido van Rossum82a5c661998-07-07 20:45:43 +0000824static char connect_doc[] =
825"connect(address)\n\
826\n\
827Connect the socket to a remote address. For IP sockets, the address\n\
828is a pair (host, port).";
829
Guido van Rossum30a685f1991-06-27 15:51:29 +0000830
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000831/* s.connect_ex(sockaddr) method */
832
833static PyObject *
834BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
835{
836 struct sockaddr *addr;
837 int addrlen;
838 int res;
839 if (!getsockaddrarg(s, args, &addr, &addrlen))
840 return NULL;
841 Py_BEGIN_ALLOW_THREADS
842 res = connect(s->sock_fd, addr, addrlen);
843 Py_END_ALLOW_THREADS
844 if (res != 0)
845 res = errno;
846 return PyInt_FromLong((long) res);
847}
848
Guido van Rossum82a5c661998-07-07 20:45:43 +0000849static char connect_ex_doc[] =
850"connect_ex(address)\n\
851\n\
852This is like connect(address), but returns an error code (the errno value)\n\
853instead of raising an exception when an error occurs.";
854
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000855
Guido van Rossumed233a51992-06-23 09:07:03 +0000856/* s.fileno() method */
857
Guido van Rossum73624e91994-10-10 17:59:00 +0000858static PyObject *
859BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000860{
Guido van Rossum73624e91994-10-10 17:59:00 +0000861 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000862 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000863 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000864}
865
Guido van Rossum82a5c661998-07-07 20:45:43 +0000866static char fileno_doc[] =
867"fileno() -> integer\n\
868\n\
869Return the integer file descriptor of the socket.";
870
Guido van Rossumed233a51992-06-23 09:07:03 +0000871
Guido van Rossumbe32c891996-06-20 16:25:29 +0000872#ifndef NO_DUP
873/* s.dup() method */
874
875static PyObject *
876BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
877{
878 int newfd;
879 PyObject *sock;
880 if (!PyArg_NoArgs(args))
881 return NULL;
882 newfd = dup(s->sock_fd);
883 if (newfd < 0)
884 return PySocket_Err();
885 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000886 s->sock_family,
887 s->sock_type,
888 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000889 if (sock == NULL)
890 close(newfd);
891 return sock;
892}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000893
894static char dup_doc[] =
895"dup() -> socket object\n\
896\n\
897Return a new socket object connected to the same system resource.";
898
Guido van Rossumbe32c891996-06-20 16:25:29 +0000899#endif
900
901
Guido van Rossumc89705d1992-11-26 08:54:07 +0000902/* s.getsockname() method */
903
Guido van Rossum73624e91994-10-10 17:59:00 +0000904static PyObject *
905BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000906{
907 char addrbuf[256];
908 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000909 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000910 return NULL;
911 if (!getsockaddrlen(s, &addrlen))
912 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000913 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000914 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000915 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000916 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000917 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000918 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000919 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
920}
921
Guido van Rossum82a5c661998-07-07 20:45:43 +0000922static char getsockname_doc[] =
923"getsockname() -> address info\n\
924\n\
925Return the address of the local endpoint. For IP sockets, the address\n\
926info is a pair (hostaddr, port).";
927
Guido van Rossumc89705d1992-11-26 08:54:07 +0000928
Guido van Rossumb6775db1994-08-01 11:34:53 +0000929#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000930/* s.getpeername() method */
931
Guido van Rossum73624e91994-10-10 17:59:00 +0000932static PyObject *
933BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000934{
935 char addrbuf[256];
936 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000937 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000938 return NULL;
939 if (!getsockaddrlen(s, &addrlen))
940 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000941 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000942 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000943 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000944 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000945 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000946 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
947}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000948
949static char getpeername_doc[] =
950"getpeername() -> address info\n\
951\n\
952Return the address of the remote endpoint. For IP sockets, the address\n\
953info is a pair (hostaddr, port).";
954
Guido van Rossumb6775db1994-08-01 11:34:53 +0000955#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000956
957
Guido van Rossum30a685f1991-06-27 15:51:29 +0000958/* s.listen(n) method */
959
Guido van Rossum73624e91994-10-10 17:59:00 +0000960static PyObject *
961BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000962{
963 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000964 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000965 if (!PyArg_Parse(args, "i", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000966 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000967 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000968 if (backlog < 1)
969 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000970 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000971 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000972 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000973 return PySocket_Err();
974 Py_INCREF(Py_None);
975 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000976}
977
Guido van Rossum82a5c661998-07-07 20:45:43 +0000978static char listen_doc[] =
979"listen(backlog)\n\
980\n\
981Enable a server to accept connections. The backlog argument must be at\n\
982least 1; it specifies the number of unaccepted connection that the system\n\
983will allow before refusing new connections.";
984
985
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000986#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000987/* s.makefile(mode) method.
988 Create a new open file object referring to a dupped version of
989 the socket's file descriptor. (The dup() call is necessary so
990 that the open file and socket objects may be closed independent
991 of each other.)
992 The mode argument specifies 'r' or 'w' passed to fdopen(). */
993
Guido van Rossum73624e91994-10-10 17:59:00 +0000994static PyObject *
995BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000996{
Guido van Rossuma597dde1995-01-10 20:56:29 +0000997 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +0000998 char *mode = "r";
999 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001000 int fd;
1001 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001002 PyObject *f;
1003
1004 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001005 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001006#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001007 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1008 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001009#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001010 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001011#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001012 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001013 if (fd >= 0)
1014 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001015 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001016 }
1017 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1018 if (f != NULL)
1019 PyFile_SetBufSize(f, bufsize);
1020 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001021}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001022
1023static char makefile_doc[] =
1024"makefile([mode[, buffersize]]) -> file object\n\
1025\n\
1026Return a regular file object corresponding to the socket.\n\
1027The mode and buffersize arguments are as for the built-in open() function.";
1028
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001029#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001030
Guido van Rossum82a5c661998-07-07 20:45:43 +00001031
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001032/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001033
Guido van Rossum73624e91994-10-10 17:59:00 +00001034static PyObject *
1035BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001036{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001037 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001038 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001039 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1040 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001041 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001042 if (buf == NULL)
1043 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001044 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001045 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001046 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001047 if (n < 0) {
1048 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001049 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001050 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001051 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001052 return NULL;
1053 return buf;
1054}
1055
Guido van Rossum82a5c661998-07-07 20:45:43 +00001056static char recv_doc[] =
1057"recv(buffersize[, flags]) -> data\n\
1058\n\
1059Receive up to buffersize bytes from the socket. For the optional flags\n\
1060argument, see the Unix manual. When no data is available, block until\n\
1061at least one byte is available or until the remote end is closed. When\n\
1062the remote end is closed and all data is read, return the empty string.";
1063
Guido van Rossum30a685f1991-06-27 15:51:29 +00001064
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001065/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001066
Guido van Rossum73624e91994-10-10 17:59:00 +00001067static PyObject *
1068BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001069{
1070 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001071 PyObject *buf = NULL;
1072 PyObject *addr = NULL;
1073 PyObject *ret = NULL;
1074
Guido van Rossumbe32c891996-06-20 16:25:29 +00001075 int addrlen, len, n, flags = 0;
1076 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1077 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001078 if (!getsockaddrlen(s, &addrlen))
1079 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001080 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001081 if (buf == NULL)
1082 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001083 Py_BEGIN_ALLOW_THREADS
1084 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001085#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001086#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001087 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001088#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001089 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001090#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001091#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001092 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001093#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001094 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001095 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001096 if (n < 0) {
1097 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001098 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001099 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001100 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001101 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001102
1103 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1104 goto finally;
1105
Guido van Rossum73624e91994-10-10 17:59:00 +00001106 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001107 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001108 Py_XDECREF(addr);
1109 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001110 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001111}
1112
Guido van Rossum82a5c661998-07-07 20:45:43 +00001113static char recvfrom_doc[] =
1114"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1115\n\
1116Like recv(buffersize, flags) but also return the sender's address info.";
1117
Guido van Rossum30a685f1991-06-27 15:51:29 +00001118
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001119/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001120
Guido van Rossum73624e91994-10-10 17:59:00 +00001121static PyObject *
1122BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001123{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001124 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001125 int len, n, flags = 0;
1126 if (!PyArg_ParseTuple(args, "s#|i", &buf, &len, &flags))
1127 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001128 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001129 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001130 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001131 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001132 return PySocket_Err();
1133 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001134}
1135
Guido van Rossum82a5c661998-07-07 20:45:43 +00001136static char send_doc[] =
1137"send(data[, flags])\n\
1138\n\
1139Send a data string to the socket. For the optional flags\n\
1140argument, see the Unix manual.";
1141
Guido van Rossum30a685f1991-06-27 15:51:29 +00001142
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001143/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001144
Guido van Rossum73624e91994-10-10 17:59:00 +00001145static PyObject *
1146BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001147{
Guido van Rossum73624e91994-10-10 17:59:00 +00001148 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001149 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001150 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001151 int addrlen, len, n, flags;
1152 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001153 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
1154 PyErr_Clear();
1155 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001156 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001157 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001158 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001159 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001160 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001161 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001162 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001163 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001164 return PySocket_Err();
1165 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001166}
1167
Guido van Rossum82a5c661998-07-07 20:45:43 +00001168static char sendto_doc[] =
1169"sendto(data[, flags], address)\n\
1170\n\
1171Like send(data, flags) but allows specifying the destination address.\n\
1172For IP sockets, the address is a pair (hostaddr, port).";
1173
Guido van Rossum30a685f1991-06-27 15:51:29 +00001174
1175/* s.shutdown(how) method */
1176
Guido van Rossum73624e91994-10-10 17:59:00 +00001177static PyObject *
1178BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001179{
1180 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001181 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +00001182 if (!PyArg_Parse(args, "i", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001183 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001184 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001185 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001186 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001187 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001188 return PySocket_Err();
1189 Py_INCREF(Py_None);
1190 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001191}
1192
Guido van Rossum82a5c661998-07-07 20:45:43 +00001193static char shutdown_doc[] =
1194"shutdown(flag)\n\
1195\n\
1196Shut down the reading side of the socket (flag == 0), the writing side\n\
1197of the socket (flag == 1), or both ends (flag == 2).";
1198
Guido van Rossum30a685f1991-06-27 15:51:29 +00001199
1200/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001201
Guido van Rossum73624e91994-10-10 17:59:00 +00001202static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001203 {"accept", (PyCFunction)PySocketSock_accept, 0,
1204 accept_doc},
1205 {"bind", (PyCFunction)PySocketSock_bind, 0,
1206 bind_doc},
1207 {"close", (PyCFunction)PySocketSock_close, 0,
1208 close_doc},
1209 {"connect", (PyCFunction)PySocketSock_connect, 0,
1210 connect_doc},
1211 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 0,
1212 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001213#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001214 {"dup", (PyCFunction)PySocketSock_dup, 0,
1215 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001216#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001217 {"fileno", (PyCFunction)PySocketSock_fileno, 0,
1218 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001219#ifdef HAVE_GETPEERNAME
Guido van Rossum82a5c661998-07-07 20:45:43 +00001220 {"getpeername", (PyCFunction)PySocketSock_getpeername, 0,
1221 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001222#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001223 {"getsockname", (PyCFunction)PySocketSock_getsockname, 0,
1224 getsockname_doc},
1225 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1226 getsockopt_doc},
1227 {"listen", (PyCFunction)PySocketSock_listen, 0,
1228 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001229#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001230 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1231 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001232#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001233 {"recv", (PyCFunction)PySocketSock_recv, 1,
1234 recv_doc},
1235 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1236 recvfrom_doc},
1237 {"send", (PyCFunction)PySocketSock_send, 1,
1238 send_doc},
1239 {"sendto", (PyCFunction)PySocketSock_sendto, 0,
1240 sendto_doc},
1241 {"setblocking", (PyCFunction)PySocketSock_setblocking, 0,
1242 setblocking_doc},
1243 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 0,
1244 setsockopt_doc},
1245 {"shutdown", (PyCFunction)PySocketSock_shutdown, 0,
1246 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001247 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001248};
1249
Guido van Rossum30a685f1991-06-27 15:51:29 +00001250
Guido van Rossum73624e91994-10-10 17:59:00 +00001251/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001252 First close the file description. */
1253
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001254static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001255BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001256{
1257 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001258 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001259}
1260
Guido van Rossum30a685f1991-06-27 15:51:29 +00001261
1262/* Return a socket object's named attribute. */
1263
Guido van Rossum73624e91994-10-10 17:59:00 +00001264static PyObject *
1265BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001266{
Guido van Rossum73624e91994-10-10 17:59:00 +00001267 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001268}
1269
Guido van Rossum30a685f1991-06-27 15:51:29 +00001270
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001271static PyObject *
1272BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1273{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001274 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001275 sprintf(buf,
1276 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1277 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001278 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001279}
1280
1281
Guido van Rossumb6775db1994-08-01 11:34:53 +00001282/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001283
Guido van Rossum73624e91994-10-10 17:59:00 +00001284static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001285 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001286 0,
1287 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001288 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001289 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001290 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001291 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001292 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001293 0, /*tp_setattr*/
1294 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001295 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001296 0, /*tp_as_number*/
1297 0, /*tp_as_sequence*/
1298 0, /*tp_as_mapping*/
1299};
1300
Guido van Rossum30a685f1991-06-27 15:51:29 +00001301
Guido van Rossum81194471991-07-27 21:42:02 +00001302/* Python interface to gethostname(). */
1303
1304/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001305static PyObject *
1306BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001307{
1308 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001309 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001310 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +00001311 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001312 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001313 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001314 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001315 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001316 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001317 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001318 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001319}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001320
Guido van Rossum82a5c661998-07-07 20:45:43 +00001321static char gethostname_doc[] =
1322"gethostname() -> string\n\
1323\n\
1324Return the current host name.";
1325
Guido van Rossumff4949e1992-08-05 19:58:53 +00001326
Guido van Rossum30a685f1991-06-27 15:51:29 +00001327/* Python interface to gethostbyname(name). */
1328
1329/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001330static PyObject *
1331BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001332{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001333 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001334 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001335 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001336 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001337 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001338 return NULL;
1339 return makeipaddr(&addrbuf);
1340}
1341
Guido van Rossum82a5c661998-07-07 20:45:43 +00001342static char gethostbyname_doc[] =
1343"gethostbyname(host) -> address\n\
1344\n\
1345Return the IP address (a string of the form '255.255.255.255') for a host.";
1346
1347
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001348/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1349
1350static PyObject *
1351gethost_common(h, addr)
1352 struct hostent *h;
1353 struct sockaddr_in *addr;
1354{
1355 char **pch;
1356 PyObject *rtn_tuple = (PyObject *)NULL;
1357 PyObject *name_list = (PyObject *)NULL;
1358 PyObject *addr_list = (PyObject *)NULL;
1359 PyObject *tmp;
1360 if (h == NULL) {
1361#ifdef HAVE_HSTRERROR
1362 /* Let's get real error message to return */
1363 extern int h_errno;
1364 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1365#else
1366 PyErr_SetString(PySocket_Error, "host not found");
1367#endif
1368 return NULL;
1369 }
1370 if ((name_list = PyList_New(0)) == NULL)
1371 goto err;
1372 if ((addr_list = PyList_New(0)) == NULL)
1373 goto err;
1374 for (pch = h->h_aliases; *pch != NULL; pch++) {
1375 int status;
1376 tmp = PyString_FromString(*pch);
1377 if (tmp == NULL)
1378 goto err;
1379 status = PyList_Append(name_list, tmp);
1380 Py_DECREF(tmp);
1381 if (status)
1382 goto err;
1383 }
1384 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1385 int status;
1386 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1387 tmp = makeipaddr(addr);
1388 if (tmp == NULL)
1389 goto err;
1390 status = PyList_Append(addr_list, tmp);
1391 Py_DECREF(tmp);
1392 if (status)
1393 goto err;
1394 }
1395 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1396 err:
1397 Py_XDECREF(name_list);
1398 Py_XDECREF(addr_list);
1399 return rtn_tuple;
1400}
1401
1402
1403/* Python interface to gethostbyname_ex(name). */
1404
1405/*ARGSUSED*/
1406static PyObject *
1407BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1408{
1409 char *name;
1410 struct hostent *h;
1411 struct sockaddr_in addr;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001412#ifdef HAVE_GETHOSTBYNAME_R
1413 struct hostent hp_allocated;
1414 char buf[16384];
1415 int buf_len = (sizeof buf) - 1;
1416 int errnop;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001417#if defined(linux) && (__GLIBC__ >= 2)
1418 int result;
1419#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001420#endif /* HAVE_GETHOSTBYNAME_R */
1421 if (!PyArg_Parse(args, "s", &name))
1422 return NULL;
1423 if (setipaddr(name, &addr) < 0)
1424 return NULL;
1425 Py_BEGIN_ALLOW_THREADS
1426#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001427#if defined(linux) && (__GLIBC__ >= 2)
1428 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
1429#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001430 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001431#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001432#else /* not HAVE_GETHOSTBYNAME_R */
1433#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +00001434 PyThread_acquire_lock(gethostbyname_lock,1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001435#endif
1436 h = gethostbyname(name);
1437#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +00001438 PyThread_release_lock(gethostbyname_lock);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001439#endif
1440#endif /* HAVE_GETHOSTBYNAME_R */
1441 Py_END_ALLOW_THREADS
1442 return gethost_common(h,&addr);
1443}
1444
1445static char ghbn_ex_doc[] =
1446"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1447\n\
1448Return the true host name, a list of aliases, and a list of IP addresses,\n\
1449for a host. The host argument is a string giving a host name or IP number.";
1450
1451
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001452/* Python interface to gethostbyaddr(IP). */
1453
1454/*ARGSUSED*/
1455static PyObject *
1456BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1457{
1458 struct sockaddr_in addr;
1459 char *ip_num;
1460 struct hostent *h;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001461#ifdef HAVE_GETHOSTBYNAME_R
1462 struct hostent hp_allocated;
1463 char buf[16384];
1464 int buf_len = (sizeof buf) - 1;
1465 int errnop;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001466#if defined(linux) && (__GLIBC__ >= 2)
1467 int result;
1468#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001469#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001470
1471 if (!PyArg_Parse(args, "s", &ip_num))
1472 return NULL;
1473 if (setipaddr(ip_num, &addr) < 0)
1474 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001475 Py_BEGIN_ALLOW_THREADS
1476#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001477#if defined(linux) && (__GLIBC__ >= 2)
1478 result = gethostbyaddr_r((char *)&addr.sin_addr,
1479 sizeof(addr.sin_addr),
1480 AF_INET, &hp_allocated, buf, buf_len,
1481 &h, &errnop);
1482#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001483 h = gethostbyaddr_r((char *)&addr.sin_addr,
1484 sizeof(addr.sin_addr),
1485 AF_INET,
1486 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001487#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001488#else /* not HAVE_GETHOSTBYNAME_R */
1489#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +00001490 PyThread_acquire_lock(gethostbyname_lock,1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001491#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001492 h = gethostbyaddr((char *)&addr.sin_addr,
1493 sizeof(addr.sin_addr),
1494 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001495#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +00001496 PyThread_release_lock(gethostbyname_lock);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001497#endif
1498#endif /* HAVE_GETHOSTBYNAME_R */
1499 Py_END_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001500 return gethost_common(h,&addr);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001501}
1502
Guido van Rossum82a5c661998-07-07 20:45:43 +00001503static char gethostbyaddr_doc[] =
1504"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1505\n\
1506Return the true host name, a list of aliases, and a list of IP addresses,\n\
1507for a host. The host argument is a string giving a host name or IP number.";
1508
Guido van Rossum30a685f1991-06-27 15:51:29 +00001509
1510/* Python interface to getservbyname(name).
1511 This only returns the port number, since the other info is already
1512 known or not useful (like the list of aliases). */
1513
1514/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001515static PyObject *
1516BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001517{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001518 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001519 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001520 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001521 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001522 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001523 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001524 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001525 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001526 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001527 return NULL;
1528 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001529 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001530}
1531
Guido van Rossum82a5c661998-07-07 20:45:43 +00001532static char getservbyname_doc[] =
1533"getservbyname(servicename, protocolname) -> integer\n\
1534\n\
1535Return a port number from a service name and protocol name.\n\
1536The protocol name should be 'tcp' or 'udp'.";
1537
Guido van Rossum30a685f1991-06-27 15:51:29 +00001538
Guido van Rossum3901d851996-12-19 16:35:04 +00001539/* Python interface to getprotobyname(name).
1540 This only returns the protocol number, since the other info is
1541 already known or not useful (like the list of aliases). */
1542
1543/*ARGSUSED*/
1544static PyObject *
1545BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1546{
1547 char *name;
1548 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001549#ifdef __BEOS__
1550/* Not available in BeOS yet. - [cjh] */
1551 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1552 return NULL;
1553#else
Guido van Rossum3901d851996-12-19 16:35:04 +00001554 if (!PyArg_Parse(args, "s", &name))
1555 return NULL;
1556 Py_BEGIN_ALLOW_THREADS
1557 sp = getprotobyname(name);
1558 Py_END_ALLOW_THREADS
1559 if (sp == NULL) {
1560 PyErr_SetString(PySocket_Error, "protocol not found");
1561 return NULL;
1562 }
1563 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001564#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001565}
1566
Guido van Rossum82a5c661998-07-07 20:45:43 +00001567static char getprotobyname_doc[] =
1568"getprotobyname(name) -> integer\n\
1569\n\
1570Return the protocol number for the named protocol. (Rarely used.)";
1571
Guido van Rossum3901d851996-12-19 16:35:04 +00001572
Guido van Rossum30a685f1991-06-27 15:51:29 +00001573/* Python interface to socket(family, type, proto).
1574 The third (protocol) argument is optional.
1575 Return a new socket object. */
1576
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001577/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001578static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001579BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001580{
Guido van Rossum73624e91994-10-10 17:59:00 +00001581 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001582#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001583 SOCKET fd;
1584#else
1585 int fd;
1586#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001587 int family, type, proto = 0;
1588 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1589 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001590 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001591 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001592 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001593#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001594 if (fd == INVALID_SOCKET)
1595#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001596 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001597#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001598 return PySocket_Err();
1599 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001600 /* If the object can't be created, don't forget to close the
1601 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001602 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001603 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001604 /* From now on, ignore SIGPIPE and let the error checking
1605 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001606#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001607 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001608#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001609 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001610}
1611
Guido van Rossum82a5c661998-07-07 20:45:43 +00001612static char socket_doc[] =
1613"socket(family, type[, proto]) -> socket object\n\
1614\n\
1615Open a socket of the given type. The family argument specifies the\n\
1616address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1617The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1618or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1619specifying the default protocol.";
1620
1621
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001622#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001623/* Create a socket object from a numeric file description.
1624 Useful e.g. if stdin is a socket.
1625 Additional arguments as for socket(). */
1626
1627/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001628static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001629BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001630{
Guido van Rossum73624e91994-10-10 17:59:00 +00001631 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001632 int fd, family, type, proto = 0;
1633 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1634 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001635 /* Dup the fd so it and the socket can be closed independently */
1636 fd = dup(fd);
1637 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001638 return PySocket_Err();
1639 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001640 /* From now on, ignore SIGPIPE and let the error checking
1641 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001642#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001643 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001644#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001645 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001646}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001647
1648static char fromfd_doc[] =
1649"fromfd(fd, family, type[, proto]) -> socket object\n\
1650\n\
1651Create a socket object from the given file descriptor.\n\
1652The remaining arguments are the same as for socket().";
1653
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001654#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001655
Guido van Rossum82a5c661998-07-07 20:45:43 +00001656
Guido van Rossum006bf911996-06-12 04:04:55 +00001657static PyObject *
1658BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1659{
1660 int x1, x2;
1661
1662 if (!PyArg_Parse(args, "i", &x1)) {
1663 return NULL;
1664 }
1665 x2 = (int)ntohs((short)x1);
1666 return PyInt_FromLong(x2);
1667}
1668
Guido van Rossum82a5c661998-07-07 20:45:43 +00001669static char ntohs_doc[] =
1670"ntohs(integer) -> integer\n\
1671\n\
1672Convert a 16-bit integer from network to host byte order.";
1673
1674
Guido van Rossum006bf911996-06-12 04:04:55 +00001675static PyObject *
1676BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1677{
1678 int x1, x2;
1679
1680 if (!PyArg_Parse(args, "i", &x1)) {
1681 return NULL;
1682 }
1683 x2 = ntohl(x1);
1684 return PyInt_FromLong(x2);
1685}
1686
Guido van Rossum82a5c661998-07-07 20:45:43 +00001687static char ntohl_doc[] =
1688"ntohl(integer) -> integer\n\
1689\n\
1690Convert a 32-bit integer from network to host byte order.";
1691
1692
Guido van Rossum006bf911996-06-12 04:04:55 +00001693static PyObject *
1694BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1695{
1696 int x1, x2;
1697
1698 if (!PyArg_Parse(args, "i", &x1)) {
1699 return NULL;
1700 }
1701 x2 = (int)htons((short)x1);
1702 return PyInt_FromLong(x2);
1703}
1704
Guido van Rossum82a5c661998-07-07 20:45:43 +00001705static char htons_doc[] =
1706"htons(integer) -> integer\n\
1707\n\
1708Convert a 16-bit integer from host to network byte order.";
1709
1710
Guido van Rossum006bf911996-06-12 04:04:55 +00001711static PyObject *
1712BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1713{
1714 int x1, x2;
1715
1716 if (!PyArg_Parse(args, "i", &x1)) {
1717 return NULL;
1718 }
1719 x2 = htonl(x1);
1720 return PyInt_FromLong(x2);
1721}
1722
Guido van Rossum82a5c661998-07-07 20:45:43 +00001723static char htonl_doc[] =
1724"htonl(integer) -> integer\n\
1725\n\
1726Convert a 32-bit integer from host to network byte order.";
1727
1728
Guido van Rossum30a685f1991-06-27 15:51:29 +00001729/* List of functions exported by this module. */
1730
Guido van Rossum73624e91994-10-10 17:59:00 +00001731static PyMethodDef PySocket_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001732 {"gethostbyname", PySocket_gethostbyname, 0, gethostbyname_doc},
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001733 {"gethostbyname_ex", PySocket_gethostbyname_ex, 0, ghbn_ex_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00001734 {"gethostbyaddr", PySocket_gethostbyaddr, 0, gethostbyaddr_doc},
1735 {"gethostname", PySocket_gethostname, 0, gethostname_doc},
1736 {"getservbyname", PySocket_getservbyname, 0, getservbyname_doc},
1737 {"getprotobyname", PySocket_getprotobyname, 0,getprotobyname_doc},
1738 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001739#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001740 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001741#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001742 {"ntohs", PySocket_ntohs, 0, ntohs_doc},
1743 {"ntohl", PySocket_ntohl, 0, ntohl_doc},
1744 {"htons", PySocket_htons, 0, htons_doc},
1745 {"htonl", PySocket_htonl, 0, htonl_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001746 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001747};
1748
Guido van Rossum30a685f1991-06-27 15:51:29 +00001749
1750/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00001751 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001752 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00001753 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001754static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001755BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001756{
Guido van Rossum73624e91994-10-10 17:59:00 +00001757 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00001758 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001759 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00001760
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001761 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001762}
1763
Guido van Rossum30a685f1991-06-27 15:51:29 +00001764
Guido van Rossum8d665e61996-06-26 18:22:49 +00001765#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001766
1767/* Additional initialization and cleanup for NT/Windows */
1768
1769static void
1770NTcleanup()
1771{
1772 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001773}
1774
1775static int
1776NTinit()
1777{
1778 WSADATA WSAData;
1779 int ret;
1780 char buf[100];
1781 ret = WSAStartup(0x0101, &WSAData);
1782 switch (ret) {
1783 case 0: /* no error */
1784 atexit(NTcleanup);
1785 return 1;
1786 case WSASYSNOTREADY:
1787 PyErr_SetString(PyExc_ImportError,
1788 "WSAStartup failed: network not ready");
1789 break;
1790 case WSAVERNOTSUPPORTED:
1791 case WSAEINVAL:
1792 PyErr_SetString(PyExc_ImportError,
1793 "WSAStartup failed: requested version not supported");
1794 break;
1795 default:
1796 sprintf(buf, "WSAStartup failed: error code %d", ret);
1797 PyErr_SetString(PyExc_ImportError, buf);
1798 break;
1799 }
1800 return 0;
1801}
1802
Guido van Rossum8d665e61996-06-26 18:22:49 +00001803#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00001804
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001805#if defined(PYOS_OS2)
1806
1807/* Additional initialization and cleanup for OS/2 */
1808
1809static void
1810OS2cleanup()
1811{
1812 /* No cleanup is necessary for OS/2 Sockets */
1813}
1814
1815static int
1816OS2init()
1817{
1818 char reason[64];
1819 int rc = sock_init();
1820
1821 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00001822 atexit(OS2cleanup);
1823 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001824 }
1825
1826 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
1827 PyErr_SetString(PyExc_ImportError, reason);
1828
Guido van Rossum32c575d1997-12-02 20:37:32 +00001829 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001830}
1831
1832#endif /* PYOS_OS2 */
1833
Guido van Rossumbe32c891996-06-20 16:25:29 +00001834
Guido van Rossum30a685f1991-06-27 15:51:29 +00001835/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001836 * This is called when the first 'import socket' is done,
1837 * via a table in config.c, if config.c is compiled with USE_SOCKET
1838 * defined.
1839 *
1840 * For MS_WINDOWS (which means any Windows variant), this module
1841 * is actually called "_socket", and there's a wrapper "socket.py"
1842 * which implements some missing functionality (such as makefile(),
1843 * dup() and fromfd()). The import of "_socket" may fail with an
1844 * ImportError exception if initialization of WINSOCK fails. When
1845 * WINSOCK is initialized succesfully, a call to WSACleanup() is
1846 * scheduled to be made at exit time.
1847 *
1848 * For OS/2, this module is also called "_socket" and uses a wrapper
1849 * "socket.py" which implements that functionality that is missing
1850 * when PC operating systems don't put socket descriptors in the
1851 * operating system's filesystem layer.
1852 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001853
Guido van Rossum82a5c661998-07-07 20:45:43 +00001854static char module_doc[] =
1855"This module provides socket operations and some related functions.\n\
1856On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
1857On other systems, it only supports IP.\n\
1858\n\
1859Functions:\n\
1860\n\
1861socket() -- create a new socket object\n\
1862fromfd() -- create a socket object from an open file descriptor (*)\n\
1863gethostname() -- return the current hostname\n\
1864gethostbyname() -- map a hostname to its IP number\n\
1865gethostbyaddr() -- map an IP number or hostname to DNS info\n\
1866getservbyname() -- map a service name and a protocol name to a port number\n\
1867getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
1868ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
1869htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
1870\n\
1871(*) not available on all platforms!)\n\
1872\n\
1873Special objects:\n\
1874\n\
1875SocketType -- type object for socket objects\n\
1876error -- exception raised for I/O errors\n\
1877\n\
1878Integer constants:\n\
1879\n\
1880AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
1881SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
1882\n\
1883Many other constants may be defined; these may be used in calls to\n\
1884the setsockopt() and getsockopt() methods.\n\
1885";
1886
1887static char sockettype_doc[] =
1888"A socket represents one endpoint of a network connection.\n\
1889\n\
1890Methods:\n\
1891\n\
1892accept() -- accept a connection, returning new socket and client address\n\
1893bind() -- bind the socket to a local address\n\
1894close() -- close the socket\n\
1895connect() -- connect the socket to a remote address\n\
1896connect_ex() -- connect, return an error code instead of an exception \n\
1897dup() -- return a new socket object identical to the current one (*)\n\
1898fileno() -- return underlying file descriptor\n\
1899getpeername() -- return remote address (*)\n\
1900getsockname() -- return local address\n\
1901getsockopt() -- get socket options\n\
1902listen() -- start listening for incoming connections\n\
1903makefile() -- return a file object corresponding tot the socket (*)\n\
1904recv() -- receive data\n\
1905recvfrom() -- receive data and sender's address\n\
1906send() -- send data\n\
1907sendto() -- send data to a given address\n\
1908setblocking() -- set or clear the blocking I/O flag\n\
1909setsockopt() -- set socket options\n\
1910shutdown() -- shut down traffic in one or both directions\n\
1911\n\
1912(*) not available on all platforms!)";
1913
Guido van Rossum3886bb61998-12-04 18:50:17 +00001914DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00001915#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001916init_socket()
1917#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001918initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00001919#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001920{
Guido van Rossum73624e91994-10-10 17:59:00 +00001921 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001922#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001923 if (!NTinit())
1924 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001925 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001926#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00001927#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001928 if (!OS2init())
1929 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001930 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00001931#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00001932#if defined(__BEOS__)
1933 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
1934#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001935 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001936#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00001937#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001938#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001939 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001940 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
1941 if (PySocket_Error == NULL)
1942 return;
1943 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001944 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001945 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001946 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00001947 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001948 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001949 return;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001950 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001951#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001952 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001953#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001954 insint(d, "SOCK_STREAM", SOCK_STREAM);
1955 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001956#ifndef __BEOS__
1957/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001958 insint(d, "SOCK_RAW", SOCK_RAW);
1959 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1960 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001961#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001962
1963#ifdef SO_DEBUG
1964 insint(d, "SO_DEBUG", SO_DEBUG);
1965#endif
1966#ifdef SO_ACCEPTCONN
1967 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1968#endif
1969#ifdef SO_REUSEADDR
1970 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1971#endif
1972#ifdef SO_KEEPALIVE
1973 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1974#endif
1975#ifdef SO_DONTROUTE
1976 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1977#endif
1978#ifdef SO_BROADCAST
1979 insint(d, "SO_BROADCAST", SO_BROADCAST);
1980#endif
1981#ifdef SO_USELOOPBACK
1982 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1983#endif
1984#ifdef SO_LINGER
1985 insint(d, "SO_LINGER", SO_LINGER);
1986#endif
1987#ifdef SO_OOBINLINE
1988 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1989#endif
1990#ifdef SO_REUSEPORT
1991 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1992#endif
1993
1994#ifdef SO_SNDBUF
1995 insint(d, "SO_SNDBUF", SO_SNDBUF);
1996#endif
1997#ifdef SO_RCVBUF
1998 insint(d, "SO_RCVBUF", SO_RCVBUF);
1999#endif
2000#ifdef SO_SNDLOWAT
2001 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2002#endif
2003#ifdef SO_RCVLOWAT
2004 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2005#endif
2006#ifdef SO_SNDTIMEO
2007 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2008#endif
2009#ifdef SO_RCVTIMEO
2010 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2011#endif
2012#ifdef SO_ERROR
2013 insint(d, "SO_ERROR", SO_ERROR);
2014#endif
2015#ifdef SO_TYPE
2016 insint(d, "SO_TYPE", SO_TYPE);
2017#endif
2018
2019 /* Maximum number of connections for "listen" */
2020#ifdef SOMAXCONN
2021 insint(d, "SOMAXCONN", SOMAXCONN);
2022#else
2023 insint(d, "SOMAXCONN", 5); /* Common value */
2024#endif
2025
2026 /* Flags for send, recv */
2027#ifdef MSG_OOB
2028 insint(d, "MSG_OOB", MSG_OOB);
2029#endif
2030#ifdef MSG_PEEK
2031 insint(d, "MSG_PEEK", MSG_PEEK);
2032#endif
2033#ifdef MSG_DONTROUTE
2034 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2035#endif
2036#ifdef MSG_EOR
2037 insint(d, "MSG_EOR", MSG_EOR);
2038#endif
2039#ifdef MSG_TRUNC
2040 insint(d, "MSG_TRUNC", MSG_TRUNC);
2041#endif
2042#ifdef MSG_CTRUNC
2043 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2044#endif
2045#ifdef MSG_WAITALL
2046 insint(d, "MSG_WAITALL", MSG_WAITALL);
2047#endif
2048#ifdef MSG_BTAG
2049 insint(d, "MSG_BTAG", MSG_BTAG);
2050#endif
2051#ifdef MSG_ETAG
2052 insint(d, "MSG_ETAG", MSG_ETAG);
2053#endif
2054
2055 /* Protocol level and numbers, usable for [gs]etsockopt */
Guido van Rossum578de301998-05-28 20:18:18 +00002056/* Sigh -- some systems (e.g. Linux) use enums for these. */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002057#ifdef SOL_SOCKET
2058 insint(d, "SOL_SOCKET", SOL_SOCKET);
2059#endif
2060#ifdef IPPROTO_IP
2061 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002062#else
2063 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002064#endif
2065#ifdef IPPROTO_ICMP
2066 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002067#else
2068 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002069#endif
2070#ifdef IPPROTO_IGMP
2071 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2072#endif
2073#ifdef IPPROTO_GGP
2074 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2075#endif
2076#ifdef IPPROTO_TCP
2077 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002078#else
2079 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002080#endif
2081#ifdef IPPROTO_EGP
2082 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2083#endif
2084#ifdef IPPROTO_PUP
2085 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2086#endif
2087#ifdef IPPROTO_UDP
2088 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002089#else
2090 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002091#endif
2092#ifdef IPPROTO_IDP
2093 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2094#endif
2095#ifdef IPPROTO_HELLO
2096 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2097#endif
2098#ifdef IPPROTO_ND
2099 insint(d, "IPPROTO_ND", IPPROTO_ND);
2100#endif
2101#ifdef IPPROTO_TP
2102 insint(d, "IPPROTO_TP", IPPROTO_TP);
2103#endif
2104#ifdef IPPROTO_XTP
2105 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2106#endif
2107#ifdef IPPROTO_EON
2108 insint(d, "IPPROTO_EON", IPPROTO_EON);
2109#endif
2110#ifdef IPPROTO_BIP
2111 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2112#endif
2113/**/
2114#ifdef IPPROTO_RAW
2115 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002116#else
2117 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002118#endif
2119#ifdef IPPROTO_MAX
2120 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2121#endif
2122
2123 /* Some port configuration */
2124#ifdef IPPORT_RESERVED
2125 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2126#else
2127 insint(d, "IPPORT_RESERVED", 1024);
2128#endif
2129#ifdef IPPORT_USERRESERVED
2130 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2131#else
2132 insint(d, "IPPORT_USERRESERVED", 5000);
2133#endif
2134
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002135 /* Some reserved IP v.4 addresses */
2136#ifdef INADDR_ANY
2137 insint(d, "INADDR_ANY", INADDR_ANY);
2138#else
2139 insint(d, "INADDR_ANY", 0x00000000);
2140#endif
2141#ifdef INADDR_BROADCAST
2142 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2143#else
2144 insint(d, "INADDR_BROADCAST", 0xffffffff);
2145#endif
2146#ifdef INADDR_LOOPBACK
2147 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2148#else
2149 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2150#endif
2151#ifdef INADDR_UNSPEC_GROUP
2152 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2153#else
2154 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2155#endif
2156#ifdef INADDR_ALLHOSTS_GROUP
2157 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2158#else
2159 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2160#endif
2161#ifdef INADDR_MAX_LOCAL_GROUP
2162 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2163#else
2164 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2165#endif
2166#ifdef INADDR_NONE
2167 insint(d, "INADDR_NONE", INADDR_NONE);
2168#else
2169 insint(d, "INADDR_NONE", 0xffffffff);
2170#endif
2171
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002172 /* IP [gs]etsockopt options */
2173#ifdef IP_OPTIONS
2174 insint(d, "IP_OPTIONS", IP_OPTIONS);
2175#endif
2176#ifdef IP_HDRINCL
2177 insint(d, "IP_HDRINCL", IP_HDRINCL);
2178#endif
2179#ifdef IP_TOS
2180 insint(d, "IP_TOS", IP_TOS);
2181#endif
2182#ifdef IP_TTL
2183 insint(d, "IP_TTL", IP_TTL);
2184#endif
2185#ifdef IP_RECVOPTS
2186 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2187#endif
2188#ifdef IP_RECVRETOPTS
2189 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2190#endif
2191#ifdef IP_RECVDSTADDR
2192 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2193#endif
2194#ifdef IP_RETOPTS
2195 insint(d, "IP_RETOPTS", IP_RETOPTS);
2196#endif
2197#ifdef IP_MULTICAST_IF
2198 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2199#endif
2200#ifdef IP_MULTICAST_TTL
2201 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2202#endif
2203#ifdef IP_MULTICAST_LOOP
2204 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2205#endif
2206#ifdef IP_ADD_MEMBERSHIP
2207 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2208#endif
2209#ifdef IP_DROP_MEMBERSHIP
2210 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2211#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002212
2213 /* Initialize gethostbyname lock */
2214#if defined(WITH_THREAD) && !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +00002215 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002216#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002217}