blob: 8415d90985d3dd4cd1adf4be625c4e4b12a0bde1 [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 Rossum3baaa131999-03-22 21:44:51 +000089
Guido van Rossum3baaa131999-03-22 21:44:51 +000090#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
91#define USE_GETHOSTBYNAME_LOCK
92#endif
93
94#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum49b56061998-10-01 20:42:43 +000095#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +000096#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +000097
Guido van Rossuma376cc51996-12-05 23:43:35 +000098#ifdef HAVE_UNISTD_H
99#include <unistd.h>
100#endif
101
Guido van Rossumbcc20741998-08-04 22:53:56 +0000102#if !defined(MS_WINDOWS) && !defined(PYOS_OS2) && !defined(__BEOS__)
Guido van Rossumfb4130d1996-12-10 15:17:08 +0000103extern int gethostname(); /* For Solaris, at least */
104#endif
105
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000106#if defined(PYCC_VACPP)
107#include <types.h>
108#include <io.h>
109#include <sys/ioctl.h>
110#include <utils.h>
111#include <ctype.h>
112#endif
113
114#if defined(PYOS_OS2)
115#define INCL_DOS
116#define INCL_DOSERRORS
117#define INCL_NOPMAPI
118#include <os2.h>
119#endif
120
Guido van Rossumbcc20741998-08-04 22:53:56 +0000121#if defined(__BEOS__)
122/* It's in the libs, but not the headers... - [cjh] */
123int shutdown( int, int );
124#endif
125
Guido van Rossumb6775db1994-08-01 11:34:53 +0000126#include <sys/types.h>
127#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +0000128
Guido van Rossum81194471991-07-27 21:42:02 +0000129#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000130#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000131#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000132#include <sys/socket.h>
133#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +0000134#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000135#else
136#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000137#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000138#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000139#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000140#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000141#else
142#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000143#endif
144
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000145#ifndef O_NDELAY
146#define O_NDELAY O_NONBLOCK /* For QNX only? */
147#endif
148
Jack Jansen508537b1996-02-14 15:57:45 +0000149#ifdef USE_GUSI
150/* fdopen() isn't declared in stdio.h (sigh) */
151#include <GUSI.h>
152#endif
153
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000154
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000155/* Here we have some hacks to choose between K&R or ANSI style function
156 definitions. For NT to build this as an extension module (ie, DLL)
157 it must be compiled by the C++ compiler, as it takes the address of
158 a static data item exported from the main Python DLL.
159*/
Guido van Rossumbcc20741998-08-04 22:53:56 +0000160#if defined(MS_WINDOWS) || defined(__BEOS__)
161/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000162/* seem to be a few differences in the API */
163#define close closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000164#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000165#define FORCE_ANSI_FUNC_DEFS
166#endif
167
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000168#if defined(PYOS_OS2)
169#define close soclose
170#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
171#define FORCE_ANSI_FUNC_DEFS
172#endif
173
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000174#ifdef FORCE_ANSI_FUNC_DEFS
175#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
176fnname( arg1type arg1name )
177
178#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
179fnname( arg1type arg1name, arg2type arg2name )
180
181#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
182fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
183
184#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
185fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
186
187#else /* !FORCE_ANSI_FN_DEFS */
188#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
189fnname( arg1name ) \
190 arg1type arg1name;
191
192#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
193fnname( arg1name, arg2name ) \
194 arg1type arg1name; \
195 arg2type arg2name;
196
197#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
198fnname( arg1name, arg2name, arg3name ) \
199 arg1type arg1name; \
200 arg2type arg2name; \
201 arg3type arg3name;
202
203#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
204fnname( arg1name, arg2name, arg3name, arg4name ) \
205 arg1type arg1name; \
206 arg2type arg2name; \
207 arg3type arg3name; \
208 arg4type arg4name;
209
210#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000211
212/* Global variable holding the exception type for errors detected
213 by this module (but not argument type or memory errors, etc.). */
214
Guido van Rossum73624e91994-10-10 17:59:00 +0000215static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000216
217
218/* Convenience function to raise an error according to errno
219 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000220
Guido van Rossum73624e91994-10-10 17:59:00 +0000221static PyObject *
222PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000223{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000224#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000225 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000226 PyObject *v;
227 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000228 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000229 PyErr_SetObject(PySocket_Error, v);
230 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000231 }
232 return NULL;
233 }
234 else
235#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000236
237#if defined(PYOS_OS2)
238 if (sock_errno() != NO_ERROR) {
239 APIRET rc;
240 ULONG msglen;
241 char outbuf[100];
242 int myerrorcode = sock_errno();
243
244 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
245 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
246 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
247 if (rc == NO_ERROR) {
248 PyObject *v;
249
250 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
251 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
252 char *lastc = &outbuf[ strlen(outbuf)-1 ];
253 while (lastc > outbuf && isspace(*lastc))
254 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
255 }
256 v = Py_BuildValue("(is)", myerrorcode, outbuf);
257 if (v != NULL) {
258 PyErr_SetObject(PySocket_Error, v);
259 Py_DECREF(v);
260 }
261 return NULL;
262 }
263 }
264#endif
265
Guido van Rossum73624e91994-10-10 17:59:00 +0000266 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000267}
268
Guido van Rossum30a685f1991-06-27 15:51:29 +0000269
270/* The object holding a socket. It holds some extra information,
271 like the address family, which is used to decode socket address
272 arguments properly. */
273
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000274typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000275 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000276 int sock_fd; /* Socket file descriptor */
277 int sock_family; /* Address family, e.g., AF_INET */
278 int sock_type; /* Socket type, e.g., SOCK_STREAM */
279 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000280 union sock_addr {
281 struct sockaddr_in in;
282#ifdef AF_UNIX
283 struct sockaddr_un un;
284#endif
285 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000286} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000287
Guido van Rossum30a685f1991-06-27 15:51:29 +0000288
289/* A forward reference to the Socktype type object.
290 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000291 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000292 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000293
Guido van Rossum73624e91994-10-10 17:59:00 +0000294staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000295
Guido van Rossum30a685f1991-06-27 15:51:29 +0000296
297/* Create a new socket object.
298 This just creates the object and initializes it.
299 If the creation fails, return NULL and set an exception (implicit
300 in NEWOBJ()). */
301
Guido van Rossum73624e91994-10-10 17:59:00 +0000302static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000303BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000304{
Guido van Rossum73624e91994-10-10 17:59:00 +0000305 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000306 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000307 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000308 if (s != NULL) {
309 s->sock_fd = fd;
310 s->sock_family = family;
311 s->sock_type = type;
312 s->sock_proto = proto;
313 }
314 return s;
315}
316
Guido van Rossum30a685f1991-06-27 15:51:29 +0000317
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000318/* Lock to allow python interpreter to continue, but only allow one
319 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000320#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000321PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000322#endif
323
324
Guido van Rossum30a685f1991-06-27 15:51:29 +0000325/* Convert a string specifying a host name or one of a few symbolic
326 names to a numeric IP address. This usually calls gethostbyname()
327 to do the work; the names "" and "<broadcast>" are special.
328 Return the length (should always be 4 bytes), or negative if
329 an error occurred; then an exception is raised. */
330
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000331static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000332BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000333{
334 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000335 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000336 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000337 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000338#ifdef HAVE_GETHOSTBYNAME_R
339 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000340#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
341 struct hostent_data data;
342#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000343 char buf[1001];
344 int buf_len = (sizeof buf) - 1;
345 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000346#endif
347#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000348 int result;
349#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000350#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000351
Guido van Rossuma376cc51996-12-05 23:43:35 +0000352 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000353 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000354 addr_ret->sin_addr.s_addr = INADDR_ANY;
355 return 4;
356 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000357 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000358 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
359 return 4;
360 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000361 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
362 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
363 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
364 addr_ret->sin_addr.s_addr = htonl(
365 ((long) d1 << 24) | ((long) d2 << 16) |
366 ((long) d3 << 8) | ((long) d4 << 0));
367 return 4;
368 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000369 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000370#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000371#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000372 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000373#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000374 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000375#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
376 result = gethostbyname_r(name, &hp_allocated, &data);
377 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000378#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000379#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000380#ifdef USE_GETHOSTBYNAME_LOCK
381 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000382#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000383 hp = gethostbyname(name);
384#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000385 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000386
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000387 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000388#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000389 /* Let's get real error message to return */
390 extern int h_errno;
391 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
392#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000393 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000394#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000395#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000396 PyThread_release_lock(gethostbyname_lock);
397#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000398 return -1;
399 }
400 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000401 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000402#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000403 PyThread_release_lock(gethostbyname_lock);
404#endif
405 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000406}
407
Guido van Rossum30a685f1991-06-27 15:51:29 +0000408
Guido van Rossum30a685f1991-06-27 15:51:29 +0000409/* Create a string object representing an IP address.
410 This is always a string of the form 'dd.dd.dd.dd' (with variable
411 size numbers). */
412
Guido van Rossum73624e91994-10-10 17:59:00 +0000413static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000414BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000415{
416 long x = ntohl(addr->sin_addr.s_addr);
417 char buf[100];
418 sprintf(buf, "%d.%d.%d.%d",
419 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
420 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000421 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000422}
423
424
425/* Create an object representing the given socket address,
426 suitable for passing it back to bind(), connect() etc.
427 The family field of the sockaddr structure is inspected
428 to determine what kind of address it really is. */
429
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000430/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000431static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000432BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000433{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000434 if (addrlen == 0) {
435 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000436 Py_INCREF(Py_None);
437 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000438 }
439
Guido van Rossumbcc20741998-08-04 22:53:56 +0000440#ifdef __BEOS__
441 /* XXX: BeOS version of accept() doesn't set family coreectly */
442 addr->sa_family = AF_INET;
443#endif
444
Guido van Rossum30a685f1991-06-27 15:51:29 +0000445 switch (addr->sa_family) {
446
447 case AF_INET:
448 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000449 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000450 PyObject *addrobj = makeipaddr(a);
451 PyObject *ret = NULL;
452 if (addrobj) {
453 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
454 Py_DECREF(addrobj);
455 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000456 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000457 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000458
Guido van Rossumb6775db1994-08-01 11:34:53 +0000459#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000460 case AF_UNIX:
461 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000462 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000463 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000464 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000465#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000466
467 /* More cases here... */
468
469 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000470 /* If we don't know the address family, don't raise an
471 exception -- return it as a tuple. */
472 return Py_BuildValue("is#",
473 addr->sa_family,
474 addr->sa_data,
475 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000476
Guido van Rossum30a685f1991-06-27 15:51:29 +0000477 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000478}
479
Guido van Rossum30a685f1991-06-27 15:51:29 +0000480
481/* Parse a socket address argument according to the socket object's
482 address family. Return 1 if the address was in the proper format,
483 0 of not. The address is returned through addr_ret, its length
484 through len_ret. */
485
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000486static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000487BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000488getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000489{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000490 switch (s->sock_family) {
491
Guido van Rossumb6775db1994-08-01 11:34:53 +0000492#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000493 case AF_UNIX:
494 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000495 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000496 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000497 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000498 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000499 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000500 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000501 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000502 PyErr_SetString(PySocket_Error,
503 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000504 return 0;
505 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000506 addr->sun_family = AF_UNIX;
507 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000508 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000509 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000510 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000511 return 1;
512 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000513#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000514
Guido van Rossum30a685f1991-06-27 15:51:29 +0000515 case AF_INET:
516 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000517 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000518 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000519 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000520 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000521 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000522 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000523 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000524 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000525 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000526 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000527 *addr_ret = (struct sockaddr *) addr;
528 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000529 return 1;
530 }
531
Guido van Rossum30a685f1991-06-27 15:51:29 +0000532 /* More cases here... */
533
534 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000535 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000536 return 0;
537
538 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000539}
540
Guido van Rossum30a685f1991-06-27 15:51:29 +0000541
Guido van Rossum710e1df1992-06-12 10:39:36 +0000542/* Get the address length according to the socket object's address family.
543 Return 1 if the family is known, 0 otherwise. The length is returned
544 through len_ret. */
545
546static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000547BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000548{
549 switch (s->sock_family) {
550
Guido van Rossumb6775db1994-08-01 11:34:53 +0000551#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000552 case AF_UNIX:
553 {
554 *len_ret = sizeof (struct sockaddr_un);
555 return 1;
556 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000557#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000558
559 case AF_INET:
560 {
561 *len_ret = sizeof (struct sockaddr_in);
562 return 1;
563 }
564
565 /* More cases here... */
566
567 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000568 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000569 return 0;
570
571 }
572}
573
574
Guido van Rossum30a685f1991-06-27 15:51:29 +0000575/* s.accept() method */
576
Guido van Rossum73624e91994-10-10 17:59:00 +0000577static PyObject *
578BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000579{
580 char addrbuf[256];
581 int addrlen, newfd;
Barry Warsaw752300b1997-01-03 17:18:10 +0000582 PyObject *sock = NULL;
583 PyObject *addr = NULL;
584 PyObject *res = NULL;
585
Guido van Rossum73624e91994-10-10 17:59:00 +0000586 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000587 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000588 if (!getsockaddrlen(s, &addrlen))
589 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000590 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000591 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000592 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000593 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000594 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000595
Guido van Rossum30a685f1991-06-27 15:51:29 +0000596 /* Create the new object with unspecified family,
597 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000598 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000599 s->sock_family,
600 s->sock_type,
601 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000602 if (sock == NULL) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000603 close(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000604 goto finally;
605 }
606 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
607 goto finally;
608
609 if (!(res = Py_BuildValue("OO", sock, addr)))
610 goto finally;
611
612 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000613 Py_XDECREF(sock);
614 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000615 return res;
616}
617
Guido van Rossum82a5c661998-07-07 20:45:43 +0000618static char accept_doc[] =
619"accept() -> (socket object, address info)\n\
620\n\
621Wait for an incoming connection. Return a new socket representing the\n\
622connection, and the address of the client. For IP sockets, the address\n\
623info is a pair (hostaddr, port).";
624
Guido van Rossum30a685f1991-06-27 15:51:29 +0000625
Guido van Rossume4485b01994-09-07 14:32:49 +0000626/* s.setblocking(1 | 0) method */
627
Guido van Rossum73624e91994-10-10 17:59:00 +0000628static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000629BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000630{
631 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000632#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000633 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000634#endif
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000635 if (!PyArg_Parse(args, "i", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000636 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000637 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000638#ifdef __BEOS__
639 block = !block;
640 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
641 (void *)(&block), sizeof( int ) );
642#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000643#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000644#ifdef PYOS_OS2
645 block = !block;
646 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
647#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000648 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
649 if (block)
650 delay_flag &= (~O_NDELAY);
651 else
652 delay_flag |= O_NDELAY;
653 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000654#endif /* !PYOS_OS2 */
655#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000656 block = !block;
657 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000658#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000659#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000660 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000661
Guido van Rossum73624e91994-10-10 17:59:00 +0000662 Py_INCREF(Py_None);
663 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000664}
Guido van Rossume4485b01994-09-07 14:32:49 +0000665
Guido van Rossum82a5c661998-07-07 20:45:43 +0000666static char setblocking_doc[] =
667"setblocking(flag)\n\
668\n\
669Set the socket to blocking (flag is true) or non-blocking (false).\n\
670This uses the FIONBIO ioctl with the O_NDELAY flag.";
671
Guido van Rossume4485b01994-09-07 14:32:49 +0000672
Guido van Rossumaee08791992-09-08 09:05:33 +0000673/* s.setsockopt() method.
674 With an integer third argument, sets an integer option.
675 With a string third argument, sets an option from a buffer;
676 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000677
Guido van Rossum73624e91994-10-10 17:59:00 +0000678static PyObject *
679BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000680{
681 int level;
682 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000683 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000684 char *buf;
685 int buflen;
686 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000687
Guido van Rossum73624e91994-10-10 17:59:00 +0000688 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000689 buf = (char *) &flag;
690 buflen = sizeof flag;
691 }
692 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000693 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +0000694 if (!PyArg_Parse(args, "(iis#)", &level, &optname,
695 &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000696 return NULL;
697 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000698 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000699 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000700 return PySocket_Err();
701 Py_INCREF(Py_None);
702 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000703}
704
Guido van Rossum82a5c661998-07-07 20:45:43 +0000705static char setsockopt_doc[] =
706"setsockopt(level, option, value)\n\
707\n\
708Set a socket option. See the Unix manual for level and option.\n\
709The value argument can either be an integer or a string.";
710
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000711
Guido van Rossumaee08791992-09-08 09:05:33 +0000712/* s.getsockopt() method.
713 With two arguments, retrieves an integer option.
714 With a third integer argument, retrieves a string buffer of that size;
715 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000716
Guido van Rossum73624e91994-10-10 17:59:00 +0000717static PyObject *
718BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000719{
720 int level;
721 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000722 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000723 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000724 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000725
Guido van Rossumbcc20741998-08-04 22:53:56 +0000726#ifdef __BEOS__
727/* We have incomplete socket support. */
728 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
729 return NULL;
730#else
731
Guido van Rossumbe32c891996-06-20 16:25:29 +0000732 if (!PyArg_ParseTuple(args, "ii|i", &level, &optname, &buflen))
733 return NULL;
734
735 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000736 int flag = 0;
737 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000738 res = getsockopt(s->sock_fd, level, optname,
739 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000740 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000741 return PySocket_Err();
742 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000743 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000744 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000745 PyErr_SetString(PySocket_Error,
746 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000747 return NULL;
748 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000749 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000750 if (buf == NULL)
751 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000752 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000753 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000754 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000755 Py_DECREF(buf);
756 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000757 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000758 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000759 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000760#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000761}
762
Guido van Rossum82a5c661998-07-07 20:45:43 +0000763static char getsockopt_doc[] =
764"getsockopt(level, option[, buffersize]) -> value\n\
765\n\
766Get a socket option. See the Unix manual for level and option.\n\
767If a nonzero buffersize argument is given, the return value is a\n\
768string of that length; otherwise it is an integer.";
769
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000770
Guido van Rossum30a685f1991-06-27 15:51:29 +0000771/* s.bind(sockaddr) method */
772
Guido van Rossum73624e91994-10-10 17:59:00 +0000773static PyObject *
774BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000775{
776 struct sockaddr *addr;
777 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000778 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000779 if (!getsockaddrarg(s, args, &addr, &addrlen))
780 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000781 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000782 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000783 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000784 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000785 return PySocket_Err();
786 Py_INCREF(Py_None);
787 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000788}
789
Guido van Rossum82a5c661998-07-07 20:45:43 +0000790static char bind_doc[] =
791"bind(address)\n\
792\n\
793Bind the socket to a local address. For IP sockets, the address is a\n\
794pair (host, port); the host must refer to the local host.";
795
Guido van Rossum30a685f1991-06-27 15:51:29 +0000796
797/* s.close() method.
798 Set the file descriptor to -1 so operations tried subsequently
799 will surely fail. */
800
Guido van Rossum73624e91994-10-10 17:59:00 +0000801static PyObject *
802BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000803{
Guido van Rossum73624e91994-10-10 17:59:00 +0000804 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000805 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000806 if (s->sock_fd != -1) {
807 Py_BEGIN_ALLOW_THREADS
808 (void) close(s->sock_fd);
809 Py_END_ALLOW_THREADS
810 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000811 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000812 Py_INCREF(Py_None);
813 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000814}
815
Guido van Rossum82a5c661998-07-07 20:45:43 +0000816static char close_doc[] =
817"close()\n\
818\n\
819Close the socket. It cannot be used after this call.";
820
Guido van Rossum30a685f1991-06-27 15:51:29 +0000821
822/* s.connect(sockaddr) method */
823
Guido van Rossum73624e91994-10-10 17:59:00 +0000824static PyObject *
825BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000826{
827 struct sockaddr *addr;
828 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000829 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000830 if (!getsockaddrarg(s, args, &addr, &addrlen))
831 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000832 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000833 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000834 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000835 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000836 return PySocket_Err();
837 Py_INCREF(Py_None);
838 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000839}
840
Guido van Rossum82a5c661998-07-07 20:45:43 +0000841static char connect_doc[] =
842"connect(address)\n\
843\n\
844Connect the socket to a remote address. For IP sockets, the address\n\
845is a pair (host, port).";
846
Guido van Rossum30a685f1991-06-27 15:51:29 +0000847
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000848/* s.connect_ex(sockaddr) method */
849
850static PyObject *
851BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
852{
853 struct sockaddr *addr;
854 int addrlen;
855 int res;
856 if (!getsockaddrarg(s, args, &addr, &addrlen))
857 return NULL;
858 Py_BEGIN_ALLOW_THREADS
859 res = connect(s->sock_fd, addr, addrlen);
860 Py_END_ALLOW_THREADS
861 if (res != 0)
862 res = errno;
863 return PyInt_FromLong((long) res);
864}
865
Guido van Rossum82a5c661998-07-07 20:45:43 +0000866static char connect_ex_doc[] =
867"connect_ex(address)\n\
868\n\
869This is like connect(address), but returns an error code (the errno value)\n\
870instead of raising an exception when an error occurs.";
871
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000872
Guido van Rossumed233a51992-06-23 09:07:03 +0000873/* s.fileno() method */
874
Guido van Rossum73624e91994-10-10 17:59:00 +0000875static PyObject *
876BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000877{
Guido van Rossum73624e91994-10-10 17:59:00 +0000878 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000879 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000880 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000881}
882
Guido van Rossum82a5c661998-07-07 20:45:43 +0000883static char fileno_doc[] =
884"fileno() -> integer\n\
885\n\
886Return the integer file descriptor of the socket.";
887
Guido van Rossumed233a51992-06-23 09:07:03 +0000888
Guido van Rossumbe32c891996-06-20 16:25:29 +0000889#ifndef NO_DUP
890/* s.dup() method */
891
892static PyObject *
893BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
894{
895 int newfd;
896 PyObject *sock;
897 if (!PyArg_NoArgs(args))
898 return NULL;
899 newfd = dup(s->sock_fd);
900 if (newfd < 0)
901 return PySocket_Err();
902 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000903 s->sock_family,
904 s->sock_type,
905 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000906 if (sock == NULL)
907 close(newfd);
908 return sock;
909}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000910
911static char dup_doc[] =
912"dup() -> socket object\n\
913\n\
914Return a new socket object connected to the same system resource.";
915
Guido van Rossumbe32c891996-06-20 16:25:29 +0000916#endif
917
918
Guido van Rossumc89705d1992-11-26 08:54:07 +0000919/* s.getsockname() method */
920
Guido van Rossum73624e91994-10-10 17:59:00 +0000921static PyObject *
922BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000923{
924 char addrbuf[256];
925 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000926 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000927 return NULL;
928 if (!getsockaddrlen(s, &addrlen))
929 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000930 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000931 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000932 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000933 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000934 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000935 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000936 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
937}
938
Guido van Rossum82a5c661998-07-07 20:45:43 +0000939static char getsockname_doc[] =
940"getsockname() -> address info\n\
941\n\
942Return the address of the local endpoint. For IP sockets, the address\n\
943info is a pair (hostaddr, port).";
944
Guido van Rossumc89705d1992-11-26 08:54:07 +0000945
Guido van Rossumb6775db1994-08-01 11:34:53 +0000946#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000947/* s.getpeername() method */
948
Guido van Rossum73624e91994-10-10 17:59:00 +0000949static PyObject *
950BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000951{
952 char addrbuf[256];
953 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000954 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000955 return NULL;
956 if (!getsockaddrlen(s, &addrlen))
957 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000958 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000959 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000960 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000961 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000962 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000963 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
964}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000965
966static char getpeername_doc[] =
967"getpeername() -> address info\n\
968\n\
969Return the address of the remote endpoint. For IP sockets, the address\n\
970info is a pair (hostaddr, port).";
971
Guido van Rossumb6775db1994-08-01 11:34:53 +0000972#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000973
974
Guido van Rossum30a685f1991-06-27 15:51:29 +0000975/* s.listen(n) method */
976
Guido van Rossum73624e91994-10-10 17:59:00 +0000977static PyObject *
978BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000979{
980 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000981 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000982 if (!PyArg_Parse(args, "i", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000983 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000984 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000985 if (backlog < 1)
986 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000987 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000988 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000989 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000990 return PySocket_Err();
991 Py_INCREF(Py_None);
992 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000993}
994
Guido van Rossum82a5c661998-07-07 20:45:43 +0000995static char listen_doc[] =
996"listen(backlog)\n\
997\n\
998Enable a server to accept connections. The backlog argument must be at\n\
999least 1; it specifies the number of unaccepted connection that the system\n\
1000will allow before refusing new connections.";
1001
1002
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001003#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001004/* s.makefile(mode) method.
1005 Create a new open file object referring to a dupped version of
1006 the socket's file descriptor. (The dup() call is necessary so
1007 that the open file and socket objects may be closed independent
1008 of each other.)
1009 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1010
Guido van Rossum73624e91994-10-10 17:59:00 +00001011static PyObject *
1012BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001013{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001014 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +00001015 char *mode = "r";
1016 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001017 int fd;
1018 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001019 PyObject *f;
1020
1021 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001022 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001023#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001024 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1025 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001026#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001027 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001028#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001029 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001030 if (fd >= 0)
1031 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001032 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001033 }
1034 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1035 if (f != NULL)
1036 PyFile_SetBufSize(f, bufsize);
1037 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001038}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001039
1040static char makefile_doc[] =
1041"makefile([mode[, buffersize]]) -> file object\n\
1042\n\
1043Return a regular file object corresponding to the socket.\n\
1044The mode and buffersize arguments are as for the built-in open() function.";
1045
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001046#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001047
Guido van Rossum82a5c661998-07-07 20:45:43 +00001048
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001049/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001050
Guido van Rossum73624e91994-10-10 17:59:00 +00001051static PyObject *
1052BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001053{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001054 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001055 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001056 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1057 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001058 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001059 if (buf == NULL)
1060 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001061 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001062 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001063 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001064 if (n < 0) {
1065 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001066 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001067 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001068 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001069 return NULL;
1070 return buf;
1071}
1072
Guido van Rossum82a5c661998-07-07 20:45:43 +00001073static char recv_doc[] =
1074"recv(buffersize[, flags]) -> data\n\
1075\n\
1076Receive up to buffersize bytes from the socket. For the optional flags\n\
1077argument, see the Unix manual. When no data is available, block until\n\
1078at least one byte is available or until the remote end is closed. When\n\
1079the remote end is closed and all data is read, return the empty string.";
1080
Guido van Rossum30a685f1991-06-27 15:51:29 +00001081
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001082/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001083
Guido van Rossum73624e91994-10-10 17:59:00 +00001084static PyObject *
1085BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001086{
1087 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001088 PyObject *buf = NULL;
1089 PyObject *addr = NULL;
1090 PyObject *ret = NULL;
1091
Guido van Rossumbe32c891996-06-20 16:25:29 +00001092 int addrlen, len, n, flags = 0;
1093 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1094 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001095 if (!getsockaddrlen(s, &addrlen))
1096 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001097 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001098 if (buf == NULL)
1099 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001100 Py_BEGIN_ALLOW_THREADS
1101 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001102#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001103#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001104 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001105#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001106 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001107#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001108#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001109 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001110#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001111 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001112 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001113 if (n < 0) {
1114 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001115 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001116 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001117 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001118 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001119
1120 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1121 goto finally;
1122
Guido van Rossum73624e91994-10-10 17:59:00 +00001123 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001124 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001125 Py_XDECREF(addr);
1126 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001127 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001128}
1129
Guido van Rossum82a5c661998-07-07 20:45:43 +00001130static char recvfrom_doc[] =
1131"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1132\n\
1133Like recv(buffersize, flags) but also return the sender's address info.";
1134
Guido van Rossum30a685f1991-06-27 15:51:29 +00001135
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001136/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001137
Guido van Rossum73624e91994-10-10 17:59:00 +00001138static PyObject *
1139BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001140{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001141 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001142 int len, n, flags = 0;
1143 if (!PyArg_ParseTuple(args, "s#|i", &buf, &len, &flags))
1144 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001145 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001146 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001147 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001148 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001149 return PySocket_Err();
1150 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001151}
1152
Guido van Rossum82a5c661998-07-07 20:45:43 +00001153static char send_doc[] =
1154"send(data[, flags])\n\
1155\n\
1156Send a data string to the socket. For the optional flags\n\
1157argument, see the Unix manual.";
1158
Guido van Rossum30a685f1991-06-27 15:51:29 +00001159
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001160/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001161
Guido van Rossum73624e91994-10-10 17:59:00 +00001162static PyObject *
1163BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001164{
Guido van Rossum73624e91994-10-10 17:59:00 +00001165 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001166 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001167 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001168 int addrlen, len, n, flags;
1169 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001170 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
1171 PyErr_Clear();
1172 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001173 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001174 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001175 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001176 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001177 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001178 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001179 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001180 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001181 return PySocket_Err();
1182 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001183}
1184
Guido van Rossum82a5c661998-07-07 20:45:43 +00001185static char sendto_doc[] =
1186"sendto(data[, flags], address)\n\
1187\n\
1188Like send(data, flags) but allows specifying the destination address.\n\
1189For IP sockets, the address is a pair (hostaddr, port).";
1190
Guido van Rossum30a685f1991-06-27 15:51:29 +00001191
1192/* s.shutdown(how) method */
1193
Guido van Rossum73624e91994-10-10 17:59:00 +00001194static PyObject *
1195BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001196{
1197 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001198 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +00001199 if (!PyArg_Parse(args, "i", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001200 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001201 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001202 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001203 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001204 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001205 return PySocket_Err();
1206 Py_INCREF(Py_None);
1207 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001208}
1209
Guido van Rossum82a5c661998-07-07 20:45:43 +00001210static char shutdown_doc[] =
1211"shutdown(flag)\n\
1212\n\
1213Shut down the reading side of the socket (flag == 0), the writing side\n\
1214of the socket (flag == 1), or both ends (flag == 2).";
1215
Guido van Rossum30a685f1991-06-27 15:51:29 +00001216
1217/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001218
Guido van Rossum73624e91994-10-10 17:59:00 +00001219static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001220 {"accept", (PyCFunction)PySocketSock_accept, 0,
1221 accept_doc},
1222 {"bind", (PyCFunction)PySocketSock_bind, 0,
1223 bind_doc},
1224 {"close", (PyCFunction)PySocketSock_close, 0,
1225 close_doc},
1226 {"connect", (PyCFunction)PySocketSock_connect, 0,
1227 connect_doc},
1228 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 0,
1229 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001230#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001231 {"dup", (PyCFunction)PySocketSock_dup, 0,
1232 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001233#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001234 {"fileno", (PyCFunction)PySocketSock_fileno, 0,
1235 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001236#ifdef HAVE_GETPEERNAME
Guido van Rossum82a5c661998-07-07 20:45:43 +00001237 {"getpeername", (PyCFunction)PySocketSock_getpeername, 0,
1238 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001239#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001240 {"getsockname", (PyCFunction)PySocketSock_getsockname, 0,
1241 getsockname_doc},
1242 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1243 getsockopt_doc},
1244 {"listen", (PyCFunction)PySocketSock_listen, 0,
1245 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001246#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001247 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1248 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001249#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001250 {"recv", (PyCFunction)PySocketSock_recv, 1,
1251 recv_doc},
1252 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1253 recvfrom_doc},
1254 {"send", (PyCFunction)PySocketSock_send, 1,
1255 send_doc},
1256 {"sendto", (PyCFunction)PySocketSock_sendto, 0,
1257 sendto_doc},
1258 {"setblocking", (PyCFunction)PySocketSock_setblocking, 0,
1259 setblocking_doc},
1260 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 0,
1261 setsockopt_doc},
1262 {"shutdown", (PyCFunction)PySocketSock_shutdown, 0,
1263 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001264 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001265};
1266
Guido van Rossum30a685f1991-06-27 15:51:29 +00001267
Guido van Rossum73624e91994-10-10 17:59:00 +00001268/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001269 First close the file description. */
1270
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001271static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001272BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001273{
1274 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001275 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001276}
1277
Guido van Rossum30a685f1991-06-27 15:51:29 +00001278
1279/* Return a socket object's named attribute. */
1280
Guido van Rossum73624e91994-10-10 17:59:00 +00001281static PyObject *
1282BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001283{
Guido van Rossum73624e91994-10-10 17:59:00 +00001284 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001285}
1286
Guido van Rossum30a685f1991-06-27 15:51:29 +00001287
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001288static PyObject *
1289BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1290{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001291 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001292 sprintf(buf,
1293 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1294 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001295 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001296}
1297
1298
Guido van Rossumb6775db1994-08-01 11:34:53 +00001299/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001300
Guido van Rossum73624e91994-10-10 17:59:00 +00001301static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001302 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001303 0,
1304 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001305 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001306 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001307 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001308 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001309 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001310 0, /*tp_setattr*/
1311 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001312 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001313 0, /*tp_as_number*/
1314 0, /*tp_as_sequence*/
1315 0, /*tp_as_mapping*/
1316};
1317
Guido van Rossum30a685f1991-06-27 15:51:29 +00001318
Guido van Rossum81194471991-07-27 21:42:02 +00001319/* Python interface to gethostname(). */
1320
1321/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001322static PyObject *
1323BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001324{
1325 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001326 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001327 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +00001328 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001329 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001330 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001331 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001332 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001333 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001334 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001335 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001336}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001337
Guido van Rossum82a5c661998-07-07 20:45:43 +00001338static char gethostname_doc[] =
1339"gethostname() -> string\n\
1340\n\
1341Return the current host name.";
1342
Guido van Rossumff4949e1992-08-05 19:58:53 +00001343
Guido van Rossum30a685f1991-06-27 15:51:29 +00001344/* Python interface to gethostbyname(name). */
1345
1346/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001347static PyObject *
1348BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001349{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001350 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001351 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001352 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001353 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001354 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001355 return NULL;
1356 return makeipaddr(&addrbuf);
1357}
1358
Guido van Rossum82a5c661998-07-07 20:45:43 +00001359static char gethostbyname_doc[] =
1360"gethostbyname(host) -> address\n\
1361\n\
1362Return the IP address (a string of the form '255.255.255.255') for a host.";
1363
1364
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001365/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1366
1367static PyObject *
1368gethost_common(h, addr)
1369 struct hostent *h;
1370 struct sockaddr_in *addr;
1371{
1372 char **pch;
1373 PyObject *rtn_tuple = (PyObject *)NULL;
1374 PyObject *name_list = (PyObject *)NULL;
1375 PyObject *addr_list = (PyObject *)NULL;
1376 PyObject *tmp;
1377 if (h == NULL) {
1378#ifdef HAVE_HSTRERROR
1379 /* Let's get real error message to return */
1380 extern int h_errno;
1381 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1382#else
1383 PyErr_SetString(PySocket_Error, "host not found");
1384#endif
1385 return NULL;
1386 }
1387 if ((name_list = PyList_New(0)) == NULL)
1388 goto err;
1389 if ((addr_list = PyList_New(0)) == NULL)
1390 goto err;
1391 for (pch = h->h_aliases; *pch != NULL; pch++) {
1392 int status;
1393 tmp = PyString_FromString(*pch);
1394 if (tmp == NULL)
1395 goto err;
1396 status = PyList_Append(name_list, tmp);
1397 Py_DECREF(tmp);
1398 if (status)
1399 goto err;
1400 }
1401 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1402 int status;
1403 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1404 tmp = makeipaddr(addr);
1405 if (tmp == NULL)
1406 goto err;
1407 status = PyList_Append(addr_list, tmp);
1408 Py_DECREF(tmp);
1409 if (status)
1410 goto err;
1411 }
1412 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1413 err:
1414 Py_XDECREF(name_list);
1415 Py_XDECREF(addr_list);
1416 return rtn_tuple;
1417}
1418
1419
1420/* Python interface to gethostbyname_ex(name). */
1421
1422/*ARGSUSED*/
1423static PyObject *
1424BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1425{
1426 char *name;
1427 struct hostent *h;
1428 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001429 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001430#ifdef HAVE_GETHOSTBYNAME_R
1431 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001432#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1433 struct hostent_data data;
1434#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001435 char buf[16384];
1436 int buf_len = (sizeof buf) - 1;
1437 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001438#endif
1439#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001440 int result;
1441#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001442#endif /* HAVE_GETHOSTBYNAME_R */
1443 if (!PyArg_Parse(args, "s", &name))
1444 return NULL;
1445 if (setipaddr(name, &addr) < 0)
1446 return NULL;
1447 Py_BEGIN_ALLOW_THREADS
1448#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001449#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001450 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001451#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001452 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001453#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
1454 result = gethostbyname_r(name, &hp_allocated, &data);
1455 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001456#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001457#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001458#ifdef USE_GETHOSTBYNAME_LOCK
1459 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001460#endif
1461 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001462#endif /* HAVE_GETHOSTBYNAME_R */
1463 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001464 ret = gethost_common(h, &addr);
1465#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001466 PyThread_release_lock(gethostbyname_lock);
1467#endif
1468 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001469}
1470
1471static char ghbn_ex_doc[] =
1472"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1473\n\
1474Return the true host name, a list of aliases, and a list of IP addresses,\n\
1475for a host. The host argument is a string giving a host name or IP number.";
1476
1477
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001478/* Python interface to gethostbyaddr(IP). */
1479
1480/*ARGSUSED*/
1481static PyObject *
1482BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1483{
1484 struct sockaddr_in addr;
1485 char *ip_num;
1486 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001487 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001488#ifdef HAVE_GETHOSTBYNAME_R
1489 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001490#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1491 struct hostent_data data;
1492#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001493 char buf[16384];
1494 int buf_len = (sizeof buf) - 1;
1495 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001496#endif
1497#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001498 int result;
1499#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001500#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001501
1502 if (!PyArg_Parse(args, "s", &ip_num))
1503 return NULL;
1504 if (setipaddr(ip_num, &addr) < 0)
1505 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001506 Py_BEGIN_ALLOW_THREADS
1507#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001508#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001509 result = gethostbyaddr_r((char *)&addr.sin_addr,
1510 sizeof(addr.sin_addr),
1511 AF_INET, &hp_allocated, buf, buf_len,
1512 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001513#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001514 h = gethostbyaddr_r((char *)&addr.sin_addr,
1515 sizeof(addr.sin_addr),
1516 AF_INET,
1517 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001518#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
1519 result = gethostbyaddr_r((char *)&addr.sin_addr,
1520 sizeof(addr.sin_addr),
1521 AF_INET, &hp_allocated, &data);
1522 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001523#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001524#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001525#ifdef USE_GETHOSTBYNAME_LOCK
1526 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001527#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001528 h = gethostbyaddr((char *)&addr.sin_addr,
1529 sizeof(addr.sin_addr),
1530 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001531#endif /* HAVE_GETHOSTBYNAME_R */
1532 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001533 ret = gethost_common(h, &addr);
1534#ifdef USE_GETHOSTBYNAME_LOCK
1535 PyThread_release_lock(gethostbyname_lock);
1536#endif
1537 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001538}
1539
Guido van Rossum82a5c661998-07-07 20:45:43 +00001540static char gethostbyaddr_doc[] =
1541"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1542\n\
1543Return the true host name, a list of aliases, and a list of IP addresses,\n\
1544for a host. The host argument is a string giving a host name or IP number.";
1545
Guido van Rossum30a685f1991-06-27 15:51:29 +00001546
1547/* Python interface to getservbyname(name).
1548 This only returns the port number, since the other info is already
1549 known or not useful (like the list of aliases). */
1550
1551/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001552static PyObject *
1553BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001554{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001555 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001556 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001557 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001558 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001559 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001560 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001561 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001562 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001563 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001564 return NULL;
1565 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001566 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001567}
1568
Guido van Rossum82a5c661998-07-07 20:45:43 +00001569static char getservbyname_doc[] =
1570"getservbyname(servicename, protocolname) -> integer\n\
1571\n\
1572Return a port number from a service name and protocol name.\n\
1573The protocol name should be 'tcp' or 'udp'.";
1574
Guido van Rossum30a685f1991-06-27 15:51:29 +00001575
Guido van Rossum3901d851996-12-19 16:35:04 +00001576/* Python interface to getprotobyname(name).
1577 This only returns the protocol number, since the other info is
1578 already known or not useful (like the list of aliases). */
1579
1580/*ARGSUSED*/
1581static PyObject *
1582BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1583{
1584 char *name;
1585 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001586#ifdef __BEOS__
1587/* Not available in BeOS yet. - [cjh] */
1588 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1589 return NULL;
1590#else
Guido van Rossum3901d851996-12-19 16:35:04 +00001591 if (!PyArg_Parse(args, "s", &name))
1592 return NULL;
1593 Py_BEGIN_ALLOW_THREADS
1594 sp = getprotobyname(name);
1595 Py_END_ALLOW_THREADS
1596 if (sp == NULL) {
1597 PyErr_SetString(PySocket_Error, "protocol not found");
1598 return NULL;
1599 }
1600 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001601#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001602}
1603
Guido van Rossum82a5c661998-07-07 20:45:43 +00001604static char getprotobyname_doc[] =
1605"getprotobyname(name) -> integer\n\
1606\n\
1607Return the protocol number for the named protocol. (Rarely used.)";
1608
Guido van Rossum3901d851996-12-19 16:35:04 +00001609
Guido van Rossum30a685f1991-06-27 15:51:29 +00001610/* Python interface to socket(family, type, proto).
1611 The third (protocol) argument is optional.
1612 Return a new socket object. */
1613
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001614/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001615static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001616BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001617{
Guido van Rossum73624e91994-10-10 17:59:00 +00001618 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001619#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001620 SOCKET fd;
1621#else
1622 int fd;
1623#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001624 int family, type, proto = 0;
1625 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1626 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001627 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001628 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001629 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001630#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001631 if (fd == INVALID_SOCKET)
1632#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001633 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001634#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001635 return PySocket_Err();
1636 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001637 /* If the object can't be created, don't forget to close the
1638 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001639 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001640 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001641 /* From now on, ignore SIGPIPE and let the error checking
1642 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001643#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001644 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001645#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001646 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001647}
1648
Guido van Rossum82a5c661998-07-07 20:45:43 +00001649static char socket_doc[] =
1650"socket(family, type[, proto]) -> socket object\n\
1651\n\
1652Open a socket of the given type. The family argument specifies the\n\
1653address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1654The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1655or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1656specifying the default protocol.";
1657
1658
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001659#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001660/* Create a socket object from a numeric file description.
1661 Useful e.g. if stdin is a socket.
1662 Additional arguments as for socket(). */
1663
1664/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001665static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001666BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001667{
Guido van Rossum73624e91994-10-10 17:59:00 +00001668 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001669 int fd, family, type, proto = 0;
1670 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1671 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001672 /* Dup the fd so it and the socket can be closed independently */
1673 fd = dup(fd);
1674 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001675 return PySocket_Err();
1676 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001677 /* From now on, ignore SIGPIPE and let the error checking
1678 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001679#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001680 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001681#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001682 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001683}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001684
1685static char fromfd_doc[] =
1686"fromfd(fd, family, type[, proto]) -> socket object\n\
1687\n\
1688Create a socket object from the given file descriptor.\n\
1689The remaining arguments are the same as for socket().";
1690
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001691#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001692
Guido van Rossum82a5c661998-07-07 20:45:43 +00001693
Guido van Rossum006bf911996-06-12 04:04:55 +00001694static PyObject *
1695BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1696{
1697 int x1, x2;
1698
1699 if (!PyArg_Parse(args, "i", &x1)) {
1700 return NULL;
1701 }
1702 x2 = (int)ntohs((short)x1);
1703 return PyInt_FromLong(x2);
1704}
1705
Guido van Rossum82a5c661998-07-07 20:45:43 +00001706static char ntohs_doc[] =
1707"ntohs(integer) -> integer\n\
1708\n\
1709Convert a 16-bit integer from network to host byte order.";
1710
1711
Guido van Rossum006bf911996-06-12 04:04:55 +00001712static PyObject *
1713BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1714{
1715 int x1, x2;
1716
1717 if (!PyArg_Parse(args, "i", &x1)) {
1718 return NULL;
1719 }
1720 x2 = ntohl(x1);
1721 return PyInt_FromLong(x2);
1722}
1723
Guido van Rossum82a5c661998-07-07 20:45:43 +00001724static char ntohl_doc[] =
1725"ntohl(integer) -> integer\n\
1726\n\
1727Convert a 32-bit integer from network to host byte order.";
1728
1729
Guido van Rossum006bf911996-06-12 04:04:55 +00001730static PyObject *
1731BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1732{
1733 int x1, x2;
1734
1735 if (!PyArg_Parse(args, "i", &x1)) {
1736 return NULL;
1737 }
1738 x2 = (int)htons((short)x1);
1739 return PyInt_FromLong(x2);
1740}
1741
Guido van Rossum82a5c661998-07-07 20:45:43 +00001742static char htons_doc[] =
1743"htons(integer) -> integer\n\
1744\n\
1745Convert a 16-bit integer from host to network byte order.";
1746
1747
Guido van Rossum006bf911996-06-12 04:04:55 +00001748static PyObject *
1749BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1750{
1751 int x1, x2;
1752
1753 if (!PyArg_Parse(args, "i", &x1)) {
1754 return NULL;
1755 }
1756 x2 = htonl(x1);
1757 return PyInt_FromLong(x2);
1758}
1759
Guido van Rossum82a5c661998-07-07 20:45:43 +00001760static char htonl_doc[] =
1761"htonl(integer) -> integer\n\
1762\n\
1763Convert a 32-bit integer from host to network byte order.";
1764
1765
Guido van Rossum30a685f1991-06-27 15:51:29 +00001766/* List of functions exported by this module. */
1767
Guido van Rossum73624e91994-10-10 17:59:00 +00001768static PyMethodDef PySocket_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001769 {"gethostbyname", PySocket_gethostbyname, 0, gethostbyname_doc},
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001770 {"gethostbyname_ex", PySocket_gethostbyname_ex, 0, ghbn_ex_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00001771 {"gethostbyaddr", PySocket_gethostbyaddr, 0, gethostbyaddr_doc},
1772 {"gethostname", PySocket_gethostname, 0, gethostname_doc},
1773 {"getservbyname", PySocket_getservbyname, 0, getservbyname_doc},
1774 {"getprotobyname", PySocket_getprotobyname, 0,getprotobyname_doc},
1775 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001776#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001777 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001778#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001779 {"ntohs", PySocket_ntohs, 0, ntohs_doc},
1780 {"ntohl", PySocket_ntohl, 0, ntohl_doc},
1781 {"htons", PySocket_htons, 0, htons_doc},
1782 {"htonl", PySocket_htonl, 0, htonl_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001783 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001784};
1785
Guido van Rossum30a685f1991-06-27 15:51:29 +00001786
1787/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00001788 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001789 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00001790 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001791static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001792BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001793{
Guido van Rossum73624e91994-10-10 17:59:00 +00001794 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00001795 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001796 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00001797
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001798 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001799}
1800
Guido van Rossum30a685f1991-06-27 15:51:29 +00001801
Guido van Rossum8d665e61996-06-26 18:22:49 +00001802#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001803
1804/* Additional initialization and cleanup for NT/Windows */
1805
1806static void
1807NTcleanup()
1808{
1809 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001810}
1811
1812static int
1813NTinit()
1814{
1815 WSADATA WSAData;
1816 int ret;
1817 char buf[100];
1818 ret = WSAStartup(0x0101, &WSAData);
1819 switch (ret) {
1820 case 0: /* no error */
1821 atexit(NTcleanup);
1822 return 1;
1823 case WSASYSNOTREADY:
1824 PyErr_SetString(PyExc_ImportError,
1825 "WSAStartup failed: network not ready");
1826 break;
1827 case WSAVERNOTSUPPORTED:
1828 case WSAEINVAL:
1829 PyErr_SetString(PyExc_ImportError,
1830 "WSAStartup failed: requested version not supported");
1831 break;
1832 default:
1833 sprintf(buf, "WSAStartup failed: error code %d", ret);
1834 PyErr_SetString(PyExc_ImportError, buf);
1835 break;
1836 }
1837 return 0;
1838}
1839
Guido van Rossum8d665e61996-06-26 18:22:49 +00001840#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00001841
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001842#if defined(PYOS_OS2)
1843
1844/* Additional initialization and cleanup for OS/2 */
1845
1846static void
1847OS2cleanup()
1848{
1849 /* No cleanup is necessary for OS/2 Sockets */
1850}
1851
1852static int
1853OS2init()
1854{
1855 char reason[64];
1856 int rc = sock_init();
1857
1858 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00001859 atexit(OS2cleanup);
1860 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001861 }
1862
1863 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
1864 PyErr_SetString(PyExc_ImportError, reason);
1865
Guido van Rossum32c575d1997-12-02 20:37:32 +00001866 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001867}
1868
1869#endif /* PYOS_OS2 */
1870
Guido van Rossumbe32c891996-06-20 16:25:29 +00001871
Guido van Rossum30a685f1991-06-27 15:51:29 +00001872/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001873 * This is called when the first 'import socket' is done,
1874 * via a table in config.c, if config.c is compiled with USE_SOCKET
1875 * defined.
1876 *
1877 * For MS_WINDOWS (which means any Windows variant), this module
1878 * is actually called "_socket", and there's a wrapper "socket.py"
1879 * which implements some missing functionality (such as makefile(),
1880 * dup() and fromfd()). The import of "_socket" may fail with an
1881 * ImportError exception if initialization of WINSOCK fails. When
1882 * WINSOCK is initialized succesfully, a call to WSACleanup() is
1883 * scheduled to be made at exit time.
1884 *
1885 * For OS/2, this module is also called "_socket" and uses a wrapper
1886 * "socket.py" which implements that functionality that is missing
1887 * when PC operating systems don't put socket descriptors in the
1888 * operating system's filesystem layer.
1889 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001890
Guido van Rossum82a5c661998-07-07 20:45:43 +00001891static char module_doc[] =
1892"This module provides socket operations and some related functions.\n\
1893On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
1894On other systems, it only supports IP.\n\
1895\n\
1896Functions:\n\
1897\n\
1898socket() -- create a new socket object\n\
1899fromfd() -- create a socket object from an open file descriptor (*)\n\
1900gethostname() -- return the current hostname\n\
1901gethostbyname() -- map a hostname to its IP number\n\
1902gethostbyaddr() -- map an IP number or hostname to DNS info\n\
1903getservbyname() -- map a service name and a protocol name to a port number\n\
1904getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
1905ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
1906htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
1907\n\
1908(*) not available on all platforms!)\n\
1909\n\
1910Special objects:\n\
1911\n\
1912SocketType -- type object for socket objects\n\
1913error -- exception raised for I/O errors\n\
1914\n\
1915Integer constants:\n\
1916\n\
1917AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
1918SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
1919\n\
1920Many other constants may be defined; these may be used in calls to\n\
1921the setsockopt() and getsockopt() methods.\n\
1922";
1923
1924static char sockettype_doc[] =
1925"A socket represents one endpoint of a network connection.\n\
1926\n\
1927Methods:\n\
1928\n\
1929accept() -- accept a connection, returning new socket and client address\n\
1930bind() -- bind the socket to a local address\n\
1931close() -- close the socket\n\
1932connect() -- connect the socket to a remote address\n\
1933connect_ex() -- connect, return an error code instead of an exception \n\
1934dup() -- return a new socket object identical to the current one (*)\n\
1935fileno() -- return underlying file descriptor\n\
1936getpeername() -- return remote address (*)\n\
1937getsockname() -- return local address\n\
1938getsockopt() -- get socket options\n\
1939listen() -- start listening for incoming connections\n\
1940makefile() -- return a file object corresponding tot the socket (*)\n\
1941recv() -- receive data\n\
1942recvfrom() -- receive data and sender's address\n\
1943send() -- send data\n\
1944sendto() -- send data to a given address\n\
1945setblocking() -- set or clear the blocking I/O flag\n\
1946setsockopt() -- set socket options\n\
1947shutdown() -- shut down traffic in one or both directions\n\
1948\n\
1949(*) not available on all platforms!)";
1950
Guido van Rossum3886bb61998-12-04 18:50:17 +00001951DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00001952#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001953init_socket()
1954#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001955initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00001956#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001957{
Guido van Rossum73624e91994-10-10 17:59:00 +00001958 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001959#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001960 if (!NTinit())
1961 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001962 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001963#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00001964#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001965 if (!OS2init())
1966 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001967 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00001968#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00001969#if defined(__BEOS__)
1970 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
1971#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001972 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001973#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00001974#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001975#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001976 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001977 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
1978 if (PySocket_Error == NULL)
1979 return;
1980 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001981 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001982 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001983 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00001984 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001985 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001986 return;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001987 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001988#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001989 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001990#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001991 insint(d, "SOCK_STREAM", SOCK_STREAM);
1992 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001993#ifndef __BEOS__
1994/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001995 insint(d, "SOCK_RAW", SOCK_RAW);
1996 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1997 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001998#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001999
2000#ifdef SO_DEBUG
2001 insint(d, "SO_DEBUG", SO_DEBUG);
2002#endif
2003#ifdef SO_ACCEPTCONN
2004 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2005#endif
2006#ifdef SO_REUSEADDR
2007 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2008#endif
2009#ifdef SO_KEEPALIVE
2010 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2011#endif
2012#ifdef SO_DONTROUTE
2013 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2014#endif
2015#ifdef SO_BROADCAST
2016 insint(d, "SO_BROADCAST", SO_BROADCAST);
2017#endif
2018#ifdef SO_USELOOPBACK
2019 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2020#endif
2021#ifdef SO_LINGER
2022 insint(d, "SO_LINGER", SO_LINGER);
2023#endif
2024#ifdef SO_OOBINLINE
2025 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2026#endif
2027#ifdef SO_REUSEPORT
2028 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2029#endif
2030
2031#ifdef SO_SNDBUF
2032 insint(d, "SO_SNDBUF", SO_SNDBUF);
2033#endif
2034#ifdef SO_RCVBUF
2035 insint(d, "SO_RCVBUF", SO_RCVBUF);
2036#endif
2037#ifdef SO_SNDLOWAT
2038 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2039#endif
2040#ifdef SO_RCVLOWAT
2041 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2042#endif
2043#ifdef SO_SNDTIMEO
2044 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2045#endif
2046#ifdef SO_RCVTIMEO
2047 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2048#endif
2049#ifdef SO_ERROR
2050 insint(d, "SO_ERROR", SO_ERROR);
2051#endif
2052#ifdef SO_TYPE
2053 insint(d, "SO_TYPE", SO_TYPE);
2054#endif
2055
2056 /* Maximum number of connections for "listen" */
2057#ifdef SOMAXCONN
2058 insint(d, "SOMAXCONN", SOMAXCONN);
2059#else
2060 insint(d, "SOMAXCONN", 5); /* Common value */
2061#endif
2062
2063 /* Flags for send, recv */
2064#ifdef MSG_OOB
2065 insint(d, "MSG_OOB", MSG_OOB);
2066#endif
2067#ifdef MSG_PEEK
2068 insint(d, "MSG_PEEK", MSG_PEEK);
2069#endif
2070#ifdef MSG_DONTROUTE
2071 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2072#endif
2073#ifdef MSG_EOR
2074 insint(d, "MSG_EOR", MSG_EOR);
2075#endif
2076#ifdef MSG_TRUNC
2077 insint(d, "MSG_TRUNC", MSG_TRUNC);
2078#endif
2079#ifdef MSG_CTRUNC
2080 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2081#endif
2082#ifdef MSG_WAITALL
2083 insint(d, "MSG_WAITALL", MSG_WAITALL);
2084#endif
2085#ifdef MSG_BTAG
2086 insint(d, "MSG_BTAG", MSG_BTAG);
2087#endif
2088#ifdef MSG_ETAG
2089 insint(d, "MSG_ETAG", MSG_ETAG);
2090#endif
2091
2092 /* Protocol level and numbers, usable for [gs]etsockopt */
Guido van Rossum578de301998-05-28 20:18:18 +00002093/* Sigh -- some systems (e.g. Linux) use enums for these. */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002094#ifdef SOL_SOCKET
2095 insint(d, "SOL_SOCKET", SOL_SOCKET);
2096#endif
2097#ifdef IPPROTO_IP
2098 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002099#else
2100 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002101#endif
2102#ifdef IPPROTO_ICMP
2103 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002104#else
2105 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002106#endif
2107#ifdef IPPROTO_IGMP
2108 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2109#endif
2110#ifdef IPPROTO_GGP
2111 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2112#endif
2113#ifdef IPPROTO_TCP
2114 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002115#else
2116 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002117#endif
2118#ifdef IPPROTO_EGP
2119 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2120#endif
2121#ifdef IPPROTO_PUP
2122 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2123#endif
2124#ifdef IPPROTO_UDP
2125 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002126#else
2127 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002128#endif
2129#ifdef IPPROTO_IDP
2130 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2131#endif
2132#ifdef IPPROTO_HELLO
2133 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2134#endif
2135#ifdef IPPROTO_ND
2136 insint(d, "IPPROTO_ND", IPPROTO_ND);
2137#endif
2138#ifdef IPPROTO_TP
2139 insint(d, "IPPROTO_TP", IPPROTO_TP);
2140#endif
2141#ifdef IPPROTO_XTP
2142 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2143#endif
2144#ifdef IPPROTO_EON
2145 insint(d, "IPPROTO_EON", IPPROTO_EON);
2146#endif
2147#ifdef IPPROTO_BIP
2148 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2149#endif
2150/**/
2151#ifdef IPPROTO_RAW
2152 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002153#else
2154 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002155#endif
2156#ifdef IPPROTO_MAX
2157 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2158#endif
2159
2160 /* Some port configuration */
2161#ifdef IPPORT_RESERVED
2162 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2163#else
2164 insint(d, "IPPORT_RESERVED", 1024);
2165#endif
2166#ifdef IPPORT_USERRESERVED
2167 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2168#else
2169 insint(d, "IPPORT_USERRESERVED", 5000);
2170#endif
2171
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002172 /* Some reserved IP v.4 addresses */
2173#ifdef INADDR_ANY
2174 insint(d, "INADDR_ANY", INADDR_ANY);
2175#else
2176 insint(d, "INADDR_ANY", 0x00000000);
2177#endif
2178#ifdef INADDR_BROADCAST
2179 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2180#else
2181 insint(d, "INADDR_BROADCAST", 0xffffffff);
2182#endif
2183#ifdef INADDR_LOOPBACK
2184 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2185#else
2186 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2187#endif
2188#ifdef INADDR_UNSPEC_GROUP
2189 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2190#else
2191 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2192#endif
2193#ifdef INADDR_ALLHOSTS_GROUP
2194 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2195#else
2196 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2197#endif
2198#ifdef INADDR_MAX_LOCAL_GROUP
2199 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2200#else
2201 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2202#endif
2203#ifdef INADDR_NONE
2204 insint(d, "INADDR_NONE", INADDR_NONE);
2205#else
2206 insint(d, "INADDR_NONE", 0xffffffff);
2207#endif
2208
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002209 /* IP [gs]etsockopt options */
2210#ifdef IP_OPTIONS
2211 insint(d, "IP_OPTIONS", IP_OPTIONS);
2212#endif
2213#ifdef IP_HDRINCL
2214 insint(d, "IP_HDRINCL", IP_HDRINCL);
2215#endif
2216#ifdef IP_TOS
2217 insint(d, "IP_TOS", IP_TOS);
2218#endif
2219#ifdef IP_TTL
2220 insint(d, "IP_TTL", IP_TTL);
2221#endif
2222#ifdef IP_RECVOPTS
2223 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2224#endif
2225#ifdef IP_RECVRETOPTS
2226 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2227#endif
2228#ifdef IP_RECVDSTADDR
2229 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2230#endif
2231#ifdef IP_RETOPTS
2232 insint(d, "IP_RETOPTS", IP_RETOPTS);
2233#endif
2234#ifdef IP_MULTICAST_IF
2235 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2236#endif
2237#ifdef IP_MULTICAST_TTL
2238 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2239#endif
2240#ifdef IP_MULTICAST_LOOP
2241 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2242#endif
2243#ifdef IP_ADD_MEMBERSHIP
2244 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2245#endif
2246#ifdef IP_DROP_MEMBERSHIP
2247 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2248#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002249
2250 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002251#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002252 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002253#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002254}