blob: ab0014c79c7bb8181ffa6bcd3a9f97e4a8fb6b86 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum6574b3e1991-06-25 21:36:08 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum6574b3e1991-06-25 21:36:08 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000029
30******************************************************************/
31
32/* Socket module */
33
34/*
35This module provides an interface to Berkeley socket IPC.
36
37Limitations:
38
Guido van Rossum30a685f1991-06-27 15:51:29 +000039- only AF_INET and AF_UNIX address families are supported
Guido van Rossum81194471991-07-27 21:42:02 +000040- no read/write operations (use send/recv or makefile instead)
Guido van Rossumbe32c891996-06-20 16:25:29 +000041- additional restrictions apply on Windows
Guido van Rossum6574b3e1991-06-25 21:36:08 +000042
Guido van Rossum27e177d1995-03-16 15:43:47 +000043Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000044
Guido van Rossum27e177d1995-03-16 15:43:47 +000045- socket.error: exception raised for socket specific errors
Guido van Rossum30a685f1991-06-27 15:51:29 +000046- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000047- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000048- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000049- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000050- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000051- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000052- socket.ntohs(16 bit value) --> new int object
53- socket.ntohl(32 bit value) --> new int object
54- socket.htons(16 bit value) --> new int object
55- socket.htonl(32 bit value) --> new int object
Guido van Rossum27e177d1995-03-16 15:43:47 +000056- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000057- an Internet socket address is a pair (hostname, port)
58 where hostname can be anything recognized by gethostbyname()
59 (including the dd.dd.dd.dd notation) and port is in host byte order
60- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000061- a UNIX domain socket address is a string specifying the pathname
Guido van Rossum6574b3e1991-06-25 21:36:08 +000062
Guido van Rossum30a685f1991-06-27 15:51:29 +000063Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000064
Guido van Rossum81194471991-07-27 21:42:02 +000065- s.accept() --> new socket object, sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000066- s.bind(sockaddr) --> None
67- s.close() --> None
68- s.connect(sockaddr) --> None
Guido van Rossumfc4255d1997-11-19 18:57:13 +000069- s.connect_ex(sockaddr) --> 0 or errno (handy for e.g. async connect)
Guido van Rossum27e177d1995-03-16 15:43:47 +000070- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000071- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000072- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000073- s.getsockname() --> sockaddr
74- s.getsockopt(level, optname[, buflen]) --> int or string
75- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000076- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000077- s.recv(buflen [,flags]) --> string
78- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000079- s.send(string [,flags]) --> nbytes
80- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000081- s.setblocking(0 | 1) --> None
82- s.setsockopt(level, optname, value) --> None
83- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000084- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000085
Guido van Rossum6574b3e1991-06-25 21:36:08 +000086*/
87
Guido van Rossum73624e91994-10-10 17:59:00 +000088#include "Python.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +000089#if defined(WITH_THREAD) && !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Guido van Rossum49b56061998-10-01 20:42:43 +000090#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +000091#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +000092
Guido van Rossuma376cc51996-12-05 23:43:35 +000093#ifdef HAVE_UNISTD_H
94#include <unistd.h>
95#endif
96
Guido van Rossumbcc20741998-08-04 22:53:56 +000097#if !defined(MS_WINDOWS) && !defined(PYOS_OS2) && !defined(__BEOS__)
Guido van Rossumfb4130d1996-12-10 15:17:08 +000098extern int gethostname(); /* For Solaris, at least */
99#endif
100
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000101#if defined(PYCC_VACPP)
102#include <types.h>
103#include <io.h>
104#include <sys/ioctl.h>
105#include <utils.h>
106#include <ctype.h>
107#endif
108
109#if defined(PYOS_OS2)
110#define INCL_DOS
111#define INCL_DOSERRORS
112#define INCL_NOPMAPI
113#include <os2.h>
114#endif
115
Guido van Rossumbcc20741998-08-04 22:53:56 +0000116#if defined(__BEOS__)
117/* It's in the libs, but not the headers... - [cjh] */
118int shutdown( int, int );
119#endif
120
Guido van Rossumb6775db1994-08-01 11:34:53 +0000121#include <sys/types.h>
122#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +0000123
Guido van Rossum81194471991-07-27 21:42:02 +0000124#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000125#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000126#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000127#include <sys/socket.h>
128#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +0000129#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000130#else
131#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000132#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000133#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000134#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000135#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000136#else
137#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000138#endif
139
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000140#ifndef O_NDELAY
141#define O_NDELAY O_NONBLOCK /* For QNX only? */
142#endif
143
Jack Jansen508537b1996-02-14 15:57:45 +0000144#ifdef USE_GUSI
145/* fdopen() isn't declared in stdio.h (sigh) */
146#include <GUSI.h>
147#endif
148
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000149
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000150/* Here we have some hacks to choose between K&R or ANSI style function
151 definitions. For NT to build this as an extension module (ie, DLL)
152 it must be compiled by the C++ compiler, as it takes the address of
153 a static data item exported from the main Python DLL.
154*/
Guido van Rossumbcc20741998-08-04 22:53:56 +0000155#if defined(MS_WINDOWS) || defined(__BEOS__)
156/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000157/* seem to be a few differences in the API */
158#define close closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000159#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000160#define FORCE_ANSI_FUNC_DEFS
161#endif
162
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000163#if defined(PYOS_OS2)
164#define close soclose
165#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
166#define FORCE_ANSI_FUNC_DEFS
167#endif
168
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000169#ifdef FORCE_ANSI_FUNC_DEFS
170#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
171fnname( arg1type arg1name )
172
173#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
174fnname( arg1type arg1name, arg2type arg2name )
175
176#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
177fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
178
179#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
180fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
181
182#else /* !FORCE_ANSI_FN_DEFS */
183#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
184fnname( arg1name ) \
185 arg1type arg1name;
186
187#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
188fnname( arg1name, arg2name ) \
189 arg1type arg1name; \
190 arg2type arg2name;
191
192#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
193fnname( arg1name, arg2name, arg3name ) \
194 arg1type arg1name; \
195 arg2type arg2name; \
196 arg3type arg3name;
197
198#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
199fnname( arg1name, arg2name, arg3name, arg4name ) \
200 arg1type arg1name; \
201 arg2type arg2name; \
202 arg3type arg3name; \
203 arg4type arg4name;
204
205#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000206
207/* Global variable holding the exception type for errors detected
208 by this module (but not argument type or memory errors, etc.). */
209
Guido van Rossum73624e91994-10-10 17:59:00 +0000210static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000211
212
213/* Convenience function to raise an error according to errno
214 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000215
Guido van Rossum73624e91994-10-10 17:59:00 +0000216static PyObject *
217PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000218{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000219#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000220 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000221 PyObject *v;
222 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000223 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000224 PyErr_SetObject(PySocket_Error, v);
225 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000226 }
227 return NULL;
228 }
229 else
230#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000231
232#if defined(PYOS_OS2)
233 if (sock_errno() != NO_ERROR) {
234 APIRET rc;
235 ULONG msglen;
236 char outbuf[100];
237 int myerrorcode = sock_errno();
238
239 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
240 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
241 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
242 if (rc == NO_ERROR) {
243 PyObject *v;
244
245 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
246 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
247 char *lastc = &outbuf[ strlen(outbuf)-1 ];
248 while (lastc > outbuf && isspace(*lastc))
249 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
250 }
251 v = Py_BuildValue("(is)", myerrorcode, outbuf);
252 if (v != NULL) {
253 PyErr_SetObject(PySocket_Error, v);
254 Py_DECREF(v);
255 }
256 return NULL;
257 }
258 }
259#endif
260
Guido van Rossum73624e91994-10-10 17:59:00 +0000261 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000262}
263
Guido van Rossum30a685f1991-06-27 15:51:29 +0000264
265/* The object holding a socket. It holds some extra information,
266 like the address family, which is used to decode socket address
267 arguments properly. */
268
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000269typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000270 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000271 int sock_fd; /* Socket file descriptor */
272 int sock_family; /* Address family, e.g., AF_INET */
273 int sock_type; /* Socket type, e.g., SOCK_STREAM */
274 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000275 union sock_addr {
276 struct sockaddr_in in;
277#ifdef AF_UNIX
278 struct sockaddr_un un;
279#endif
280 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000281} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000282
Guido van Rossum30a685f1991-06-27 15:51:29 +0000283
284/* A forward reference to the Socktype type object.
285 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000286 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000287 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000288
Guido van Rossum73624e91994-10-10 17:59:00 +0000289staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000290
Guido van Rossum30a685f1991-06-27 15:51:29 +0000291
292/* Create a new socket object.
293 This just creates the object and initializes it.
294 If the creation fails, return NULL and set an exception (implicit
295 in NEWOBJ()). */
296
Guido van Rossum73624e91994-10-10 17:59:00 +0000297static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000298BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000299{
Guido van Rossum73624e91994-10-10 17:59:00 +0000300 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000301 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000302 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000303 if (s != NULL) {
304 s->sock_fd = fd;
305 s->sock_family = family;
306 s->sock_type = type;
307 s->sock_proto = proto;
308 }
309 return s;
310}
311
Guido van Rossum30a685f1991-06-27 15:51:29 +0000312
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000313/* Lock to allow python interpreter to continue, but only allow one
314 thread to be in gethostbyname */
315#if defined(WITH_THREAD) && !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000316PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000317#endif
318
319
Guido van Rossum30a685f1991-06-27 15:51:29 +0000320/* Convert a string specifying a host name or one of a few symbolic
321 names to a numeric IP address. This usually calls gethostbyname()
322 to do the work; the names "" and "<broadcast>" are special.
323 Return the length (should always be 4 bytes), or negative if
324 an error occurred; then an exception is raised. */
325
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000326static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000327BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000328{
329 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000330 int d1, d2, d3, d4;
331 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000332#ifdef HAVE_GETHOSTBYNAME_R
333 struct hostent hp_allocated;
334 char buf[1001];
335 int buf_len = (sizeof buf) - 1;
336 int errnop;
337#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000338
Guido van Rossuma376cc51996-12-05 23:43:35 +0000339 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000340 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000341 addr_ret->sin_addr.s_addr = INADDR_ANY;
342 return 4;
343 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000344 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000345 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
346 return 4;
347 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000348 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
349 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
350 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
351 addr_ret->sin_addr.s_addr = htonl(
352 ((long) d1 << 24) | ((long) d2 << 16) |
353 ((long) d3 << 8) | ((long) d4 << 0));
354 return 4;
355 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000356 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000357#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000358 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000359#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000360#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000361 PyThread_acquire_lock(gethostbyname_lock,1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000362#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000363 hp = gethostbyname(name);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000364#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000365 PyThread_release_lock(gethostbyname_lock);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000366#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000367#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000368 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000369
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000370 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000371#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000372 /* Let's get real error message to return */
373 extern int h_errno;
374 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
375#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000376 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000377#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000378 return -1;
379 }
380 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
381 return hp->h_length;
382}
383
Guido van Rossum30a685f1991-06-27 15:51:29 +0000384
Guido van Rossum30a685f1991-06-27 15:51:29 +0000385/* Create a string object representing an IP address.
386 This is always a string of the form 'dd.dd.dd.dd' (with variable
387 size numbers). */
388
Guido van Rossum73624e91994-10-10 17:59:00 +0000389static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000390BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000391{
392 long x = ntohl(addr->sin_addr.s_addr);
393 char buf[100];
394 sprintf(buf, "%d.%d.%d.%d",
395 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
396 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000397 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000398}
399
400
401/* Create an object representing the given socket address,
402 suitable for passing it back to bind(), connect() etc.
403 The family field of the sockaddr structure is inspected
404 to determine what kind of address it really is. */
405
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000406/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000407static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000408BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000409{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000410 if (addrlen == 0) {
411 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000412 Py_INCREF(Py_None);
413 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000414 }
415
Guido van Rossumbcc20741998-08-04 22:53:56 +0000416#ifdef __BEOS__
417 /* XXX: BeOS version of accept() doesn't set family coreectly */
418 addr->sa_family = AF_INET;
419#endif
420
Guido van Rossum30a685f1991-06-27 15:51:29 +0000421 switch (addr->sa_family) {
422
423 case AF_INET:
424 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000425 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000426 PyObject *addrobj = makeipaddr(a);
427 PyObject *ret = NULL;
428 if (addrobj) {
429 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
430 Py_DECREF(addrobj);
431 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000432 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000433 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000434
Guido van Rossumb6775db1994-08-01 11:34:53 +0000435#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000436 case AF_UNIX:
437 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000438 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000439 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000440 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000441#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000442
443 /* More cases here... */
444
445 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000446 /* If we don't know the address family, don't raise an
447 exception -- return it as a tuple. */
448 return Py_BuildValue("is#",
449 addr->sa_family,
450 addr->sa_data,
451 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000452
Guido van Rossum30a685f1991-06-27 15:51:29 +0000453 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000454}
455
Guido van Rossum30a685f1991-06-27 15:51:29 +0000456
457/* Parse a socket address argument according to the socket object's
458 address family. Return 1 if the address was in the proper format,
459 0 of not. The address is returned through addr_ret, its length
460 through len_ret. */
461
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000462static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000463BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000464getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000465{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000466 switch (s->sock_family) {
467
Guido van Rossumb6775db1994-08-01 11:34:53 +0000468#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000469 case AF_UNIX:
470 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000471 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000472 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000473 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000474 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000475 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000476 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000477 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000478 PyErr_SetString(PySocket_Error,
479 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000480 return 0;
481 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000482 addr->sun_family = AF_UNIX;
483 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000484 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000485 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000486 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000487 return 1;
488 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000489#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000490
Guido van Rossum30a685f1991-06-27 15:51:29 +0000491 case AF_INET:
492 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000493 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000494 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000495 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000496 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000497 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000498 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000499 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000500 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000501 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000502 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000503 *addr_ret = (struct sockaddr *) addr;
504 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000505 return 1;
506 }
507
Guido van Rossum30a685f1991-06-27 15:51:29 +0000508 /* More cases here... */
509
510 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000511 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000512 return 0;
513
514 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000515}
516
Guido van Rossum30a685f1991-06-27 15:51:29 +0000517
Guido van Rossum710e1df1992-06-12 10:39:36 +0000518/* Get the address length according to the socket object's address family.
519 Return 1 if the family is known, 0 otherwise. The length is returned
520 through len_ret. */
521
522static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000523BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000524{
525 switch (s->sock_family) {
526
Guido van Rossumb6775db1994-08-01 11:34:53 +0000527#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000528 case AF_UNIX:
529 {
530 *len_ret = sizeof (struct sockaddr_un);
531 return 1;
532 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000533#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000534
535 case AF_INET:
536 {
537 *len_ret = sizeof (struct sockaddr_in);
538 return 1;
539 }
540
541 /* More cases here... */
542
543 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000544 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000545 return 0;
546
547 }
548}
549
550
Guido van Rossum30a685f1991-06-27 15:51:29 +0000551/* s.accept() method */
552
Guido van Rossum73624e91994-10-10 17:59:00 +0000553static PyObject *
554BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000555{
556 char addrbuf[256];
557 int addrlen, newfd;
Barry Warsaw752300b1997-01-03 17:18:10 +0000558 PyObject *sock = NULL;
559 PyObject *addr = NULL;
560 PyObject *res = NULL;
561
Guido van Rossum73624e91994-10-10 17:59:00 +0000562 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000563 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000564 if (!getsockaddrlen(s, &addrlen))
565 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000566 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000567 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000568 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000569 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000570 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000571
Guido van Rossum30a685f1991-06-27 15:51:29 +0000572 /* Create the new object with unspecified family,
573 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000574 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000575 s->sock_family,
576 s->sock_type,
577 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000578 if (sock == NULL) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000579 close(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000580 goto finally;
581 }
582 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
583 goto finally;
584
585 if (!(res = Py_BuildValue("OO", sock, addr)))
586 goto finally;
587
588 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000589 Py_XDECREF(sock);
590 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000591 return res;
592}
593
Guido van Rossum82a5c661998-07-07 20:45:43 +0000594static char accept_doc[] =
595"accept() -> (socket object, address info)\n\
596\n\
597Wait for an incoming connection. Return a new socket representing the\n\
598connection, and the address of the client. For IP sockets, the address\n\
599info is a pair (hostaddr, port).";
600
Guido van Rossum30a685f1991-06-27 15:51:29 +0000601
Guido van Rossume4485b01994-09-07 14:32:49 +0000602/* s.setblocking(1 | 0) method */
603
Guido van Rossum73624e91994-10-10 17:59:00 +0000604static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000605BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000606{
607 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000608#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000609 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000610#endif
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000611 if (!PyArg_Parse(args, "i", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000612 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000613 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000614#ifdef __BEOS__
615 block = !block;
616 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
617 (void *)(&block), sizeof( int ) );
618#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000619#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000620#ifdef PYOS_OS2
621 block = !block;
622 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
623#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000624 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
625 if (block)
626 delay_flag &= (~O_NDELAY);
627 else
628 delay_flag |= O_NDELAY;
629 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000630#endif /* !PYOS_OS2 */
631#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000632 block = !block;
633 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000634#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000635#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000636 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000637
Guido van Rossum73624e91994-10-10 17:59:00 +0000638 Py_INCREF(Py_None);
639 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000640}
Guido van Rossume4485b01994-09-07 14:32:49 +0000641
Guido van Rossum82a5c661998-07-07 20:45:43 +0000642static char setblocking_doc[] =
643"setblocking(flag)\n\
644\n\
645Set the socket to blocking (flag is true) or non-blocking (false).\n\
646This uses the FIONBIO ioctl with the O_NDELAY flag.";
647
Guido van Rossume4485b01994-09-07 14:32:49 +0000648
Guido van Rossumaee08791992-09-08 09:05:33 +0000649/* s.setsockopt() method.
650 With an integer third argument, sets an integer option.
651 With a string third argument, sets an option from a buffer;
652 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000653
Guido van Rossum73624e91994-10-10 17:59:00 +0000654static PyObject *
655BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000656{
657 int level;
658 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000659 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000660 char *buf;
661 int buflen;
662 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000663
Guido van Rossum73624e91994-10-10 17:59:00 +0000664 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000665 buf = (char *) &flag;
666 buflen = sizeof flag;
667 }
668 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000669 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +0000670 if (!PyArg_Parse(args, "(iis#)", &level, &optname,
671 &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000672 return NULL;
673 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000674 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000675 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000676 return PySocket_Err();
677 Py_INCREF(Py_None);
678 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000679}
680
Guido van Rossum82a5c661998-07-07 20:45:43 +0000681static char setsockopt_doc[] =
682"setsockopt(level, option, value)\n\
683\n\
684Set a socket option. See the Unix manual for level and option.\n\
685The value argument can either be an integer or a string.";
686
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000687
Guido van Rossumaee08791992-09-08 09:05:33 +0000688/* s.getsockopt() method.
689 With two arguments, retrieves an integer option.
690 With a third integer argument, retrieves a string buffer of that size;
691 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000692
Guido van Rossum73624e91994-10-10 17:59:00 +0000693static PyObject *
694BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000695{
696 int level;
697 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000698 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000699 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000700 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000701
Guido van Rossumbcc20741998-08-04 22:53:56 +0000702#ifdef __BEOS__
703/* We have incomplete socket support. */
704 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
705 return NULL;
706#else
707
Guido van Rossumbe32c891996-06-20 16:25:29 +0000708 if (!PyArg_ParseTuple(args, "ii|i", &level, &optname, &buflen))
709 return NULL;
710
711 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000712 int flag = 0;
713 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000714 res = getsockopt(s->sock_fd, level, optname,
715 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000716 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000717 return PySocket_Err();
718 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000719 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000720 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000721 PyErr_SetString(PySocket_Error,
722 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000723 return NULL;
724 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000725 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000726 if (buf == NULL)
727 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000728 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000729 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000730 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000731 Py_DECREF(buf);
732 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000733 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000734 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000735 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000736#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000737}
738
Guido van Rossum82a5c661998-07-07 20:45:43 +0000739static char getsockopt_doc[] =
740"getsockopt(level, option[, buffersize]) -> value\n\
741\n\
742Get a socket option. See the Unix manual for level and option.\n\
743If a nonzero buffersize argument is given, the return value is a\n\
744string of that length; otherwise it is an integer.";
745
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000746
Guido van Rossum30a685f1991-06-27 15:51:29 +0000747/* s.bind(sockaddr) method */
748
Guido van Rossum73624e91994-10-10 17:59:00 +0000749static PyObject *
750BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000751{
752 struct sockaddr *addr;
753 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000754 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000755 if (!getsockaddrarg(s, args, &addr, &addrlen))
756 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000757 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000758 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000759 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000760 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000761 return PySocket_Err();
762 Py_INCREF(Py_None);
763 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000764}
765
Guido van Rossum82a5c661998-07-07 20:45:43 +0000766static char bind_doc[] =
767"bind(address)\n\
768\n\
769Bind the socket to a local address. For IP sockets, the address is a\n\
770pair (host, port); the host must refer to the local host.";
771
Guido van Rossum30a685f1991-06-27 15:51:29 +0000772
773/* s.close() method.
774 Set the file descriptor to -1 so operations tried subsequently
775 will surely fail. */
776
Guido van Rossum73624e91994-10-10 17:59:00 +0000777static PyObject *
778BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000779{
Guido van Rossum73624e91994-10-10 17:59:00 +0000780 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000781 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000782 if (s->sock_fd != -1) {
783 Py_BEGIN_ALLOW_THREADS
784 (void) close(s->sock_fd);
785 Py_END_ALLOW_THREADS
786 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000787 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000788 Py_INCREF(Py_None);
789 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000790}
791
Guido van Rossum82a5c661998-07-07 20:45:43 +0000792static char close_doc[] =
793"close()\n\
794\n\
795Close the socket. It cannot be used after this call.";
796
Guido van Rossum30a685f1991-06-27 15:51:29 +0000797
798/* s.connect(sockaddr) method */
799
Guido van Rossum73624e91994-10-10 17:59:00 +0000800static PyObject *
801BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000802{
803 struct sockaddr *addr;
804 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000805 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000806 if (!getsockaddrarg(s, args, &addr, &addrlen))
807 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000808 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000809 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000810 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000811 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000812 return PySocket_Err();
813 Py_INCREF(Py_None);
814 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000815}
816
Guido van Rossum82a5c661998-07-07 20:45:43 +0000817static char connect_doc[] =
818"connect(address)\n\
819\n\
820Connect the socket to a remote address. For IP sockets, the address\n\
821is a pair (host, port).";
822
Guido van Rossum30a685f1991-06-27 15:51:29 +0000823
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000824/* s.connect_ex(sockaddr) method */
825
826static PyObject *
827BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
828{
829 struct sockaddr *addr;
830 int addrlen;
831 int res;
832 if (!getsockaddrarg(s, args, &addr, &addrlen))
833 return NULL;
834 Py_BEGIN_ALLOW_THREADS
835 res = connect(s->sock_fd, addr, addrlen);
836 Py_END_ALLOW_THREADS
837 if (res != 0)
838 res = errno;
839 return PyInt_FromLong((long) res);
840}
841
Guido van Rossum82a5c661998-07-07 20:45:43 +0000842static char connect_ex_doc[] =
843"connect_ex(address)\n\
844\n\
845This is like connect(address), but returns an error code (the errno value)\n\
846instead of raising an exception when an error occurs.";
847
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000848
Guido van Rossumed233a51992-06-23 09:07:03 +0000849/* s.fileno() method */
850
Guido van Rossum73624e91994-10-10 17:59:00 +0000851static PyObject *
852BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000853{
Guido van Rossum73624e91994-10-10 17:59:00 +0000854 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000855 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000856 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000857}
858
Guido van Rossum82a5c661998-07-07 20:45:43 +0000859static char fileno_doc[] =
860"fileno() -> integer\n\
861\n\
862Return the integer file descriptor of the socket.";
863
Guido van Rossumed233a51992-06-23 09:07:03 +0000864
Guido van Rossumbe32c891996-06-20 16:25:29 +0000865#ifndef NO_DUP
866/* s.dup() method */
867
868static PyObject *
869BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
870{
871 int newfd;
872 PyObject *sock;
873 if (!PyArg_NoArgs(args))
874 return NULL;
875 newfd = dup(s->sock_fd);
876 if (newfd < 0)
877 return PySocket_Err();
878 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000879 s->sock_family,
880 s->sock_type,
881 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000882 if (sock == NULL)
883 close(newfd);
884 return sock;
885}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000886
887static char dup_doc[] =
888"dup() -> socket object\n\
889\n\
890Return a new socket object connected to the same system resource.";
891
Guido van Rossumbe32c891996-06-20 16:25:29 +0000892#endif
893
894
Guido van Rossumc89705d1992-11-26 08:54:07 +0000895/* s.getsockname() method */
896
Guido van Rossum73624e91994-10-10 17:59:00 +0000897static PyObject *
898BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000899{
900 char addrbuf[256];
901 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000902 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000903 return NULL;
904 if (!getsockaddrlen(s, &addrlen))
905 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000906 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000907 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000908 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000909 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000910 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000911 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000912 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
913}
914
Guido van Rossum82a5c661998-07-07 20:45:43 +0000915static char getsockname_doc[] =
916"getsockname() -> address info\n\
917\n\
918Return the address of the local endpoint. For IP sockets, the address\n\
919info is a pair (hostaddr, port).";
920
Guido van Rossumc89705d1992-11-26 08:54:07 +0000921
Guido van Rossumb6775db1994-08-01 11:34:53 +0000922#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000923/* s.getpeername() method */
924
Guido van Rossum73624e91994-10-10 17:59:00 +0000925static PyObject *
926BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000927{
928 char addrbuf[256];
929 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000930 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000931 return NULL;
932 if (!getsockaddrlen(s, &addrlen))
933 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000934 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000935 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000936 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000937 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000938 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000939 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
940}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000941
942static char getpeername_doc[] =
943"getpeername() -> address info\n\
944\n\
945Return the address of the remote endpoint. For IP sockets, the address\n\
946info is a pair (hostaddr, port).";
947
Guido van Rossumb6775db1994-08-01 11:34:53 +0000948#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000949
950
Guido van Rossum30a685f1991-06-27 15:51:29 +0000951/* s.listen(n) method */
952
Guido van Rossum73624e91994-10-10 17:59:00 +0000953static PyObject *
954BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000955{
956 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000957 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000958 if (!PyArg_Parse(args, "i", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000959 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000960 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000961 if (backlog < 1)
962 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000963 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000964 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000965 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000966 return PySocket_Err();
967 Py_INCREF(Py_None);
968 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000969}
970
Guido van Rossum82a5c661998-07-07 20:45:43 +0000971static char listen_doc[] =
972"listen(backlog)\n\
973\n\
974Enable a server to accept connections. The backlog argument must be at\n\
975least 1; it specifies the number of unaccepted connection that the system\n\
976will allow before refusing new connections.";
977
978
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000979#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000980/* s.makefile(mode) method.
981 Create a new open file object referring to a dupped version of
982 the socket's file descriptor. (The dup() call is necessary so
983 that the open file and socket objects may be closed independent
984 of each other.)
985 The mode argument specifies 'r' or 'w' passed to fdopen(). */
986
Guido van Rossum73624e91994-10-10 17:59:00 +0000987static PyObject *
988BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000989{
Guido van Rossuma597dde1995-01-10 20:56:29 +0000990 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +0000991 char *mode = "r";
992 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000993 int fd;
994 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +0000995 PyObject *f;
996
997 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000998 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +0000999#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001000 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1001 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001002#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001003 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001004#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001005 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001006 if (fd >= 0)
1007 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001008 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001009 }
1010 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1011 if (f != NULL)
1012 PyFile_SetBufSize(f, bufsize);
1013 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001014}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001015
1016static char makefile_doc[] =
1017"makefile([mode[, buffersize]]) -> file object\n\
1018\n\
1019Return a regular file object corresponding to the socket.\n\
1020The mode and buffersize arguments are as for the built-in open() function.";
1021
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001022#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001023
Guido van Rossum82a5c661998-07-07 20:45:43 +00001024
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001025/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001026
Guido van Rossum73624e91994-10-10 17:59:00 +00001027static PyObject *
1028BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001029{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001030 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001031 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001032 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1033 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001034 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001035 if (buf == NULL)
1036 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001037 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001038 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001039 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001040 if (n < 0) {
1041 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001042 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001043 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001044 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001045 return NULL;
1046 return buf;
1047}
1048
Guido van Rossum82a5c661998-07-07 20:45:43 +00001049static char recv_doc[] =
1050"recv(buffersize[, flags]) -> data\n\
1051\n\
1052Receive up to buffersize bytes from the socket. For the optional flags\n\
1053argument, see the Unix manual. When no data is available, block until\n\
1054at least one byte is available or until the remote end is closed. When\n\
1055the remote end is closed and all data is read, return the empty string.";
1056
Guido van Rossum30a685f1991-06-27 15:51:29 +00001057
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001058/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001059
Guido van Rossum73624e91994-10-10 17:59:00 +00001060static PyObject *
1061BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001062{
1063 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001064 PyObject *buf = NULL;
1065 PyObject *addr = NULL;
1066 PyObject *ret = NULL;
1067
Guido van Rossumbe32c891996-06-20 16:25:29 +00001068 int addrlen, len, n, flags = 0;
1069 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1070 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001071 if (!getsockaddrlen(s, &addrlen))
1072 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001073 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001074 if (buf == NULL)
1075 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001076 Py_BEGIN_ALLOW_THREADS
1077 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001078#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001079#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001080 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001081#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001082 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001083#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001084#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001085 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001086#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001087 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001088 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001089 if (n < 0) {
1090 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001091 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001092 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001093 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001094 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001095
1096 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1097 goto finally;
1098
Guido van Rossum73624e91994-10-10 17:59:00 +00001099 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001100 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001101 Py_XDECREF(addr);
1102 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001103 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001104}
1105
Guido van Rossum82a5c661998-07-07 20:45:43 +00001106static char recvfrom_doc[] =
1107"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1108\n\
1109Like recv(buffersize, flags) but also return the sender's address info.";
1110
Guido van Rossum30a685f1991-06-27 15:51:29 +00001111
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001112/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001113
Guido van Rossum73624e91994-10-10 17:59:00 +00001114static PyObject *
1115BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001116{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001117 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001118 int len, n, flags = 0;
1119 if (!PyArg_ParseTuple(args, "s#|i", &buf, &len, &flags))
1120 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001121 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001122 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001123 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001124 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001125 return PySocket_Err();
1126 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001127}
1128
Guido van Rossum82a5c661998-07-07 20:45:43 +00001129static char send_doc[] =
1130"send(data[, flags])\n\
1131\n\
1132Send a data string to the socket. For the optional flags\n\
1133argument, see the Unix manual.";
1134
Guido van Rossum30a685f1991-06-27 15:51:29 +00001135
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001136/* s.sendto(data, [flags,] sockaddr) 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_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001140{
Guido van Rossum73624e91994-10-10 17:59:00 +00001141 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001142 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001143 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001144 int addrlen, len, n, flags;
1145 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001146 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
1147 PyErr_Clear();
1148 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001149 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001150 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001151 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001152 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001153 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001154 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001155 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001156 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001157 return PySocket_Err();
1158 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001159}
1160
Guido van Rossum82a5c661998-07-07 20:45:43 +00001161static char sendto_doc[] =
1162"sendto(data[, flags], address)\n\
1163\n\
1164Like send(data, flags) but allows specifying the destination address.\n\
1165For IP sockets, the address is a pair (hostaddr, port).";
1166
Guido van Rossum30a685f1991-06-27 15:51:29 +00001167
1168/* s.shutdown(how) method */
1169
Guido van Rossum73624e91994-10-10 17:59:00 +00001170static PyObject *
1171BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001172{
1173 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001174 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +00001175 if (!PyArg_Parse(args, "i", &how))
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 Rossumff4949e1992-08-05 19:58:53 +00001178 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001179 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001180 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001181 return PySocket_Err();
1182 Py_INCREF(Py_None);
1183 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001184}
1185
Guido van Rossum82a5c661998-07-07 20:45:43 +00001186static char shutdown_doc[] =
1187"shutdown(flag)\n\
1188\n\
1189Shut down the reading side of the socket (flag == 0), the writing side\n\
1190of the socket (flag == 1), or both ends (flag == 2).";
1191
Guido van Rossum30a685f1991-06-27 15:51:29 +00001192
1193/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001194
Guido van Rossum73624e91994-10-10 17:59:00 +00001195static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001196 {"accept", (PyCFunction)PySocketSock_accept, 0,
1197 accept_doc},
1198 {"bind", (PyCFunction)PySocketSock_bind, 0,
1199 bind_doc},
1200 {"close", (PyCFunction)PySocketSock_close, 0,
1201 close_doc},
1202 {"connect", (PyCFunction)PySocketSock_connect, 0,
1203 connect_doc},
1204 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 0,
1205 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001206#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001207 {"dup", (PyCFunction)PySocketSock_dup, 0,
1208 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001209#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001210 {"fileno", (PyCFunction)PySocketSock_fileno, 0,
1211 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001212#ifdef HAVE_GETPEERNAME
Guido van Rossum82a5c661998-07-07 20:45:43 +00001213 {"getpeername", (PyCFunction)PySocketSock_getpeername, 0,
1214 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001215#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001216 {"getsockname", (PyCFunction)PySocketSock_getsockname, 0,
1217 getsockname_doc},
1218 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1219 getsockopt_doc},
1220 {"listen", (PyCFunction)PySocketSock_listen, 0,
1221 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001222#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001223 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1224 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001225#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001226 {"recv", (PyCFunction)PySocketSock_recv, 1,
1227 recv_doc},
1228 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1229 recvfrom_doc},
1230 {"send", (PyCFunction)PySocketSock_send, 1,
1231 send_doc},
1232 {"sendto", (PyCFunction)PySocketSock_sendto, 0,
1233 sendto_doc},
1234 {"setblocking", (PyCFunction)PySocketSock_setblocking, 0,
1235 setblocking_doc},
1236 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 0,
1237 setsockopt_doc},
1238 {"shutdown", (PyCFunction)PySocketSock_shutdown, 0,
1239 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001240 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001241};
1242
Guido van Rossum30a685f1991-06-27 15:51:29 +00001243
Guido van Rossum73624e91994-10-10 17:59:00 +00001244/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001245 First close the file description. */
1246
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001247static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001248BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001249{
1250 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001251 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001252}
1253
Guido van Rossum30a685f1991-06-27 15:51:29 +00001254
1255/* Return a socket object's named attribute. */
1256
Guido van Rossum73624e91994-10-10 17:59:00 +00001257static PyObject *
1258BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001259{
Guido van Rossum73624e91994-10-10 17:59:00 +00001260 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001261}
1262
Guido van Rossum30a685f1991-06-27 15:51:29 +00001263
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001264static PyObject *
1265BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1266{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001267 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001268 sprintf(buf,
1269 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1270 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001271 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001272}
1273
1274
Guido van Rossumb6775db1994-08-01 11:34:53 +00001275/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001276
Guido van Rossum73624e91994-10-10 17:59:00 +00001277static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001278 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001279 0,
1280 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001281 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001282 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001283 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001284 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001285 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001286 0, /*tp_setattr*/
1287 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001288 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001289 0, /*tp_as_number*/
1290 0, /*tp_as_sequence*/
1291 0, /*tp_as_mapping*/
1292};
1293
Guido van Rossum30a685f1991-06-27 15:51:29 +00001294
Guido van Rossum81194471991-07-27 21:42:02 +00001295/* Python interface to gethostname(). */
1296
1297/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001298static PyObject *
1299BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001300{
1301 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001302 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001303 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +00001304 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001305 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001306 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001307 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001308 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001309 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001310 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001311 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001312}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001313
Guido van Rossum82a5c661998-07-07 20:45:43 +00001314static char gethostname_doc[] =
1315"gethostname() -> string\n\
1316\n\
1317Return the current host name.";
1318
Guido van Rossumff4949e1992-08-05 19:58:53 +00001319
Guido van Rossum30a685f1991-06-27 15:51:29 +00001320/* Python interface to gethostbyname(name). */
1321
1322/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001323static PyObject *
1324BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001325{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001326 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001327 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001328 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001329 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001330 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001331 return NULL;
1332 return makeipaddr(&addrbuf);
1333}
1334
Guido van Rossum82a5c661998-07-07 20:45:43 +00001335static char gethostbyname_doc[] =
1336"gethostbyname(host) -> address\n\
1337\n\
1338Return the IP address (a string of the form '255.255.255.255') for a host.";
1339
1340
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001341/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1342
1343static PyObject *
1344gethost_common(h, addr)
1345 struct hostent *h;
1346 struct sockaddr_in *addr;
1347{
1348 char **pch;
1349 PyObject *rtn_tuple = (PyObject *)NULL;
1350 PyObject *name_list = (PyObject *)NULL;
1351 PyObject *addr_list = (PyObject *)NULL;
1352 PyObject *tmp;
1353 if (h == NULL) {
1354#ifdef HAVE_HSTRERROR
1355 /* Let's get real error message to return */
1356 extern int h_errno;
1357 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1358#else
1359 PyErr_SetString(PySocket_Error, "host not found");
1360#endif
1361 return NULL;
1362 }
1363 if ((name_list = PyList_New(0)) == NULL)
1364 goto err;
1365 if ((addr_list = PyList_New(0)) == NULL)
1366 goto err;
1367 for (pch = h->h_aliases; *pch != NULL; pch++) {
1368 int status;
1369 tmp = PyString_FromString(*pch);
1370 if (tmp == NULL)
1371 goto err;
1372 status = PyList_Append(name_list, tmp);
1373 Py_DECREF(tmp);
1374 if (status)
1375 goto err;
1376 }
1377 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1378 int status;
1379 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1380 tmp = makeipaddr(addr);
1381 if (tmp == NULL)
1382 goto err;
1383 status = PyList_Append(addr_list, tmp);
1384 Py_DECREF(tmp);
1385 if (status)
1386 goto err;
1387 }
1388 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1389 err:
1390 Py_XDECREF(name_list);
1391 Py_XDECREF(addr_list);
1392 return rtn_tuple;
1393}
1394
1395
1396/* Python interface to gethostbyname_ex(name). */
1397
1398/*ARGSUSED*/
1399static PyObject *
1400BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
1401{
1402 char *name;
1403 struct hostent *h;
1404 struct sockaddr_in addr;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001405#ifdef HAVE_GETHOSTBYNAME_R
1406 struct hostent hp_allocated;
1407 char buf[16384];
1408 int buf_len = (sizeof buf) - 1;
1409 int errnop;
1410#endif /* HAVE_GETHOSTBYNAME_R */
1411 if (!PyArg_Parse(args, "s", &name))
1412 return NULL;
1413 if (setipaddr(name, &addr) < 0)
1414 return NULL;
1415 Py_BEGIN_ALLOW_THREADS
1416#ifdef HAVE_GETHOSTBYNAME_R
1417 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
1418#else /* not HAVE_GETHOSTBYNAME_R */
1419#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +00001420 PyThread_acquire_lock(gethostbyname_lock,1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001421#endif
1422 h = gethostbyname(name);
1423#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +00001424 PyThread_release_lock(gethostbyname_lock);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001425#endif
1426#endif /* HAVE_GETHOSTBYNAME_R */
1427 Py_END_ALLOW_THREADS
1428 return gethost_common(h,&addr);
1429}
1430
1431static char ghbn_ex_doc[] =
1432"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1433\n\
1434Return the true host name, a list of aliases, and a list of IP addresses,\n\
1435for a host. The host argument is a string giving a host name or IP number.";
1436
1437
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001438/* Python interface to gethostbyaddr(IP). */
1439
1440/*ARGSUSED*/
1441static PyObject *
1442BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1443{
1444 struct sockaddr_in addr;
1445 char *ip_num;
1446 struct hostent *h;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001447#ifdef HAVE_GETHOSTBYNAME_R
1448 struct hostent hp_allocated;
1449 char buf[16384];
1450 int buf_len = (sizeof buf) - 1;
1451 int errnop;
1452#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001453
1454 if (!PyArg_Parse(args, "s", &ip_num))
1455 return NULL;
1456 if (setipaddr(ip_num, &addr) < 0)
1457 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001458 Py_BEGIN_ALLOW_THREADS
1459#ifdef HAVE_GETHOSTBYNAME_R
1460 h = gethostbyaddr_r((char *)&addr.sin_addr,
1461 sizeof(addr.sin_addr),
1462 AF_INET,
1463 &hp_allocated, buf, buf_len, &errnop);
1464#else /* not HAVE_GETHOSTBYNAME_R */
1465#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +00001466 PyThread_acquire_lock(gethostbyname_lock,1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001467#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001468 h = gethostbyaddr((char *)&addr.sin_addr,
1469 sizeof(addr.sin_addr),
1470 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001471#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +00001472 PyThread_release_lock(gethostbyname_lock);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001473#endif
1474#endif /* HAVE_GETHOSTBYNAME_R */
1475 Py_END_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001476 return gethost_common(h,&addr);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001477}
1478
Guido van Rossum82a5c661998-07-07 20:45:43 +00001479static char gethostbyaddr_doc[] =
1480"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1481\n\
1482Return the true host name, a list of aliases, and a list of IP addresses,\n\
1483for a host. The host argument is a string giving a host name or IP number.";
1484
Guido van Rossum30a685f1991-06-27 15:51:29 +00001485
1486/* Python interface to getservbyname(name).
1487 This only returns the port number, since the other info is already
1488 known or not useful (like the list of aliases). */
1489
1490/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001491static PyObject *
1492BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001493{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001494 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001495 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001496 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001497 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001498 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001499 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001500 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001501 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001502 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001503 return NULL;
1504 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001505 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001506}
1507
Guido van Rossum82a5c661998-07-07 20:45:43 +00001508static char getservbyname_doc[] =
1509"getservbyname(servicename, protocolname) -> integer\n\
1510\n\
1511Return a port number from a service name and protocol name.\n\
1512The protocol name should be 'tcp' or 'udp'.";
1513
Guido van Rossum30a685f1991-06-27 15:51:29 +00001514
Guido van Rossum3901d851996-12-19 16:35:04 +00001515/* Python interface to getprotobyname(name).
1516 This only returns the protocol number, since the other info is
1517 already known or not useful (like the list of aliases). */
1518
1519/*ARGSUSED*/
1520static PyObject *
1521BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1522{
1523 char *name;
1524 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001525#ifdef __BEOS__
1526/* Not available in BeOS yet. - [cjh] */
1527 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1528 return NULL;
1529#else
Guido van Rossum3901d851996-12-19 16:35:04 +00001530 if (!PyArg_Parse(args, "s", &name))
1531 return NULL;
1532 Py_BEGIN_ALLOW_THREADS
1533 sp = getprotobyname(name);
1534 Py_END_ALLOW_THREADS
1535 if (sp == NULL) {
1536 PyErr_SetString(PySocket_Error, "protocol not found");
1537 return NULL;
1538 }
1539 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001540#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001541}
1542
Guido van Rossum82a5c661998-07-07 20:45:43 +00001543static char getprotobyname_doc[] =
1544"getprotobyname(name) -> integer\n\
1545\n\
1546Return the protocol number for the named protocol. (Rarely used.)";
1547
Guido van Rossum3901d851996-12-19 16:35:04 +00001548
Guido van Rossum30a685f1991-06-27 15:51:29 +00001549/* Python interface to socket(family, type, proto).
1550 The third (protocol) argument is optional.
1551 Return a new socket object. */
1552
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001553/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001554static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001555BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001556{
Guido van Rossum73624e91994-10-10 17:59:00 +00001557 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001558#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001559 SOCKET fd;
1560#else
1561 int fd;
1562#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001563 int family, type, proto = 0;
1564 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1565 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001566 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001567 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001568 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001569#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001570 if (fd == INVALID_SOCKET)
1571#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001572 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001573#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001574 return PySocket_Err();
1575 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001576 /* If the object can't be created, don't forget to close the
1577 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001578 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001579 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001580 /* From now on, ignore SIGPIPE and let the error checking
1581 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001582#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001583 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001584#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001585 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001586}
1587
Guido van Rossum82a5c661998-07-07 20:45:43 +00001588static char socket_doc[] =
1589"socket(family, type[, proto]) -> socket object\n\
1590\n\
1591Open a socket of the given type. The family argument specifies the\n\
1592address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1593The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1594or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1595specifying the default protocol.";
1596
1597
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001598#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001599/* Create a socket object from a numeric file description.
1600 Useful e.g. if stdin is a socket.
1601 Additional arguments as for socket(). */
1602
1603/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001604static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001605BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001606{
Guido van Rossum73624e91994-10-10 17:59:00 +00001607 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001608 int fd, family, type, proto = 0;
1609 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1610 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001611 /* Dup the fd so it and the socket can be closed independently */
1612 fd = dup(fd);
1613 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001614 return PySocket_Err();
1615 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001616 /* From now on, ignore SIGPIPE and let the error checking
1617 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001618#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001619 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001620#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001621 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001622}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001623
1624static char fromfd_doc[] =
1625"fromfd(fd, family, type[, proto]) -> socket object\n\
1626\n\
1627Create a socket object from the given file descriptor.\n\
1628The remaining arguments are the same as for socket().";
1629
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001630#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001631
Guido van Rossum82a5c661998-07-07 20:45:43 +00001632
Guido van Rossum006bf911996-06-12 04:04:55 +00001633static PyObject *
1634BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1635{
1636 int x1, x2;
1637
1638 if (!PyArg_Parse(args, "i", &x1)) {
1639 return NULL;
1640 }
1641 x2 = (int)ntohs((short)x1);
1642 return PyInt_FromLong(x2);
1643}
1644
Guido van Rossum82a5c661998-07-07 20:45:43 +00001645static char ntohs_doc[] =
1646"ntohs(integer) -> integer\n\
1647\n\
1648Convert a 16-bit integer from network to host byte order.";
1649
1650
Guido van Rossum006bf911996-06-12 04:04:55 +00001651static PyObject *
1652BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1653{
1654 int x1, x2;
1655
1656 if (!PyArg_Parse(args, "i", &x1)) {
1657 return NULL;
1658 }
1659 x2 = ntohl(x1);
1660 return PyInt_FromLong(x2);
1661}
1662
Guido van Rossum82a5c661998-07-07 20:45:43 +00001663static char ntohl_doc[] =
1664"ntohl(integer) -> integer\n\
1665\n\
1666Convert a 32-bit integer from network to host byte order.";
1667
1668
Guido van Rossum006bf911996-06-12 04:04:55 +00001669static PyObject *
1670BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1671{
1672 int x1, x2;
1673
1674 if (!PyArg_Parse(args, "i", &x1)) {
1675 return NULL;
1676 }
1677 x2 = (int)htons((short)x1);
1678 return PyInt_FromLong(x2);
1679}
1680
Guido van Rossum82a5c661998-07-07 20:45:43 +00001681static char htons_doc[] =
1682"htons(integer) -> integer\n\
1683\n\
1684Convert a 16-bit integer from host to network byte order.";
1685
1686
Guido van Rossum006bf911996-06-12 04:04:55 +00001687static PyObject *
1688BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1689{
1690 int x1, x2;
1691
1692 if (!PyArg_Parse(args, "i", &x1)) {
1693 return NULL;
1694 }
1695 x2 = htonl(x1);
1696 return PyInt_FromLong(x2);
1697}
1698
Guido van Rossum82a5c661998-07-07 20:45:43 +00001699static char htonl_doc[] =
1700"htonl(integer) -> integer\n\
1701\n\
1702Convert a 32-bit integer from host to network byte order.";
1703
1704
Guido van Rossum30a685f1991-06-27 15:51:29 +00001705/* List of functions exported by this module. */
1706
Guido van Rossum73624e91994-10-10 17:59:00 +00001707static PyMethodDef PySocket_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001708 {"gethostbyname", PySocket_gethostbyname, 0, gethostbyname_doc},
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001709 {"gethostbyname_ex", PySocket_gethostbyname_ex, 0, ghbn_ex_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00001710 {"gethostbyaddr", PySocket_gethostbyaddr, 0, gethostbyaddr_doc},
1711 {"gethostname", PySocket_gethostname, 0, gethostname_doc},
1712 {"getservbyname", PySocket_getservbyname, 0, getservbyname_doc},
1713 {"getprotobyname", PySocket_getprotobyname, 0,getprotobyname_doc},
1714 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001715#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001716 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001717#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001718 {"ntohs", PySocket_ntohs, 0, ntohs_doc},
1719 {"ntohl", PySocket_ntohl, 0, ntohl_doc},
1720 {"htons", PySocket_htons, 0, htons_doc},
1721 {"htonl", PySocket_htonl, 0, htonl_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001722 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001723};
1724
Guido van Rossum30a685f1991-06-27 15:51:29 +00001725
1726/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00001727 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001728 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00001729 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001730static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001731BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001732{
Guido van Rossum73624e91994-10-10 17:59:00 +00001733 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00001734 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001735 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00001736
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001737 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001738}
1739
Guido van Rossum30a685f1991-06-27 15:51:29 +00001740
Guido van Rossum8d665e61996-06-26 18:22:49 +00001741#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001742
1743/* Additional initialization and cleanup for NT/Windows */
1744
1745static void
1746NTcleanup()
1747{
1748 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001749}
1750
1751static int
1752NTinit()
1753{
1754 WSADATA WSAData;
1755 int ret;
1756 char buf[100];
1757 ret = WSAStartup(0x0101, &WSAData);
1758 switch (ret) {
1759 case 0: /* no error */
1760 atexit(NTcleanup);
1761 return 1;
1762 case WSASYSNOTREADY:
1763 PyErr_SetString(PyExc_ImportError,
1764 "WSAStartup failed: network not ready");
1765 break;
1766 case WSAVERNOTSUPPORTED:
1767 case WSAEINVAL:
1768 PyErr_SetString(PyExc_ImportError,
1769 "WSAStartup failed: requested version not supported");
1770 break;
1771 default:
1772 sprintf(buf, "WSAStartup failed: error code %d", ret);
1773 PyErr_SetString(PyExc_ImportError, buf);
1774 break;
1775 }
1776 return 0;
1777}
1778
Guido van Rossum8d665e61996-06-26 18:22:49 +00001779#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00001780
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001781#if defined(PYOS_OS2)
1782
1783/* Additional initialization and cleanup for OS/2 */
1784
1785static void
1786OS2cleanup()
1787{
1788 /* No cleanup is necessary for OS/2 Sockets */
1789}
1790
1791static int
1792OS2init()
1793{
1794 char reason[64];
1795 int rc = sock_init();
1796
1797 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00001798 atexit(OS2cleanup);
1799 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001800 }
1801
1802 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
1803 PyErr_SetString(PyExc_ImportError, reason);
1804
Guido van Rossum32c575d1997-12-02 20:37:32 +00001805 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001806}
1807
1808#endif /* PYOS_OS2 */
1809
Guido van Rossumbe32c891996-06-20 16:25:29 +00001810
Guido van Rossum30a685f1991-06-27 15:51:29 +00001811/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001812 * This is called when the first 'import socket' is done,
1813 * via a table in config.c, if config.c is compiled with USE_SOCKET
1814 * defined.
1815 *
1816 * For MS_WINDOWS (which means any Windows variant), this module
1817 * is actually called "_socket", and there's a wrapper "socket.py"
1818 * which implements some missing functionality (such as makefile(),
1819 * dup() and fromfd()). The import of "_socket" may fail with an
1820 * ImportError exception if initialization of WINSOCK fails. When
1821 * WINSOCK is initialized succesfully, a call to WSACleanup() is
1822 * scheduled to be made at exit time.
1823 *
1824 * For OS/2, this module is also called "_socket" and uses a wrapper
1825 * "socket.py" which implements that functionality that is missing
1826 * when PC operating systems don't put socket descriptors in the
1827 * operating system's filesystem layer.
1828 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001829
Guido van Rossum82a5c661998-07-07 20:45:43 +00001830static char module_doc[] =
1831"This module provides socket operations and some related functions.\n\
1832On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
1833On other systems, it only supports IP.\n\
1834\n\
1835Functions:\n\
1836\n\
1837socket() -- create a new socket object\n\
1838fromfd() -- create a socket object from an open file descriptor (*)\n\
1839gethostname() -- return the current hostname\n\
1840gethostbyname() -- map a hostname to its IP number\n\
1841gethostbyaddr() -- map an IP number or hostname to DNS info\n\
1842getservbyname() -- map a service name and a protocol name to a port number\n\
1843getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
1844ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
1845htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
1846\n\
1847(*) not available on all platforms!)\n\
1848\n\
1849Special objects:\n\
1850\n\
1851SocketType -- type object for socket objects\n\
1852error -- exception raised for I/O errors\n\
1853\n\
1854Integer constants:\n\
1855\n\
1856AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
1857SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
1858\n\
1859Many other constants may be defined; these may be used in calls to\n\
1860the setsockopt() and getsockopt() methods.\n\
1861";
1862
1863static char sockettype_doc[] =
1864"A socket represents one endpoint of a network connection.\n\
1865\n\
1866Methods:\n\
1867\n\
1868accept() -- accept a connection, returning new socket and client address\n\
1869bind() -- bind the socket to a local address\n\
1870close() -- close the socket\n\
1871connect() -- connect the socket to a remote address\n\
1872connect_ex() -- connect, return an error code instead of an exception \n\
1873dup() -- return a new socket object identical to the current one (*)\n\
1874fileno() -- return underlying file descriptor\n\
1875getpeername() -- return remote address (*)\n\
1876getsockname() -- return local address\n\
1877getsockopt() -- get socket options\n\
1878listen() -- start listening for incoming connections\n\
1879makefile() -- return a file object corresponding tot the socket (*)\n\
1880recv() -- receive data\n\
1881recvfrom() -- receive data and sender's address\n\
1882send() -- send data\n\
1883sendto() -- send data to a given address\n\
1884setblocking() -- set or clear the blocking I/O flag\n\
1885setsockopt() -- set socket options\n\
1886shutdown() -- shut down traffic in one or both directions\n\
1887\n\
1888(*) not available on all platforms!)";
1889
Guido van Rossum3886bb61998-12-04 18:50:17 +00001890DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00001891#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001892init_socket()
1893#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001894initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00001895#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001896{
Guido van Rossum73624e91994-10-10 17:59:00 +00001897 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001898#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001899 if (!NTinit())
1900 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001901 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001902#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00001903#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001904 if (!OS2init())
1905 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001906 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00001907#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00001908#if defined(__BEOS__)
1909 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
1910#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001911 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001912#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00001913#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001914#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001915 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001916 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
1917 if (PySocket_Error == NULL)
1918 return;
1919 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001920 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001921 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001922 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00001923 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001924 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001925 return;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001926 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001927#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001928 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001929#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001930 insint(d, "SOCK_STREAM", SOCK_STREAM);
1931 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001932#ifndef __BEOS__
1933/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001934 insint(d, "SOCK_RAW", SOCK_RAW);
1935 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1936 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001937#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001938
1939#ifdef SO_DEBUG
1940 insint(d, "SO_DEBUG", SO_DEBUG);
1941#endif
1942#ifdef SO_ACCEPTCONN
1943 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1944#endif
1945#ifdef SO_REUSEADDR
1946 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1947#endif
1948#ifdef SO_KEEPALIVE
1949 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1950#endif
1951#ifdef SO_DONTROUTE
1952 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1953#endif
1954#ifdef SO_BROADCAST
1955 insint(d, "SO_BROADCAST", SO_BROADCAST);
1956#endif
1957#ifdef SO_USELOOPBACK
1958 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1959#endif
1960#ifdef SO_LINGER
1961 insint(d, "SO_LINGER", SO_LINGER);
1962#endif
1963#ifdef SO_OOBINLINE
1964 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1965#endif
1966#ifdef SO_REUSEPORT
1967 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1968#endif
1969
1970#ifdef SO_SNDBUF
1971 insint(d, "SO_SNDBUF", SO_SNDBUF);
1972#endif
1973#ifdef SO_RCVBUF
1974 insint(d, "SO_RCVBUF", SO_RCVBUF);
1975#endif
1976#ifdef SO_SNDLOWAT
1977 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
1978#endif
1979#ifdef SO_RCVLOWAT
1980 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
1981#endif
1982#ifdef SO_SNDTIMEO
1983 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
1984#endif
1985#ifdef SO_RCVTIMEO
1986 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
1987#endif
1988#ifdef SO_ERROR
1989 insint(d, "SO_ERROR", SO_ERROR);
1990#endif
1991#ifdef SO_TYPE
1992 insint(d, "SO_TYPE", SO_TYPE);
1993#endif
1994
1995 /* Maximum number of connections for "listen" */
1996#ifdef SOMAXCONN
1997 insint(d, "SOMAXCONN", SOMAXCONN);
1998#else
1999 insint(d, "SOMAXCONN", 5); /* Common value */
2000#endif
2001
2002 /* Flags for send, recv */
2003#ifdef MSG_OOB
2004 insint(d, "MSG_OOB", MSG_OOB);
2005#endif
2006#ifdef MSG_PEEK
2007 insint(d, "MSG_PEEK", MSG_PEEK);
2008#endif
2009#ifdef MSG_DONTROUTE
2010 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2011#endif
2012#ifdef MSG_EOR
2013 insint(d, "MSG_EOR", MSG_EOR);
2014#endif
2015#ifdef MSG_TRUNC
2016 insint(d, "MSG_TRUNC", MSG_TRUNC);
2017#endif
2018#ifdef MSG_CTRUNC
2019 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2020#endif
2021#ifdef MSG_WAITALL
2022 insint(d, "MSG_WAITALL", MSG_WAITALL);
2023#endif
2024#ifdef MSG_BTAG
2025 insint(d, "MSG_BTAG", MSG_BTAG);
2026#endif
2027#ifdef MSG_ETAG
2028 insint(d, "MSG_ETAG", MSG_ETAG);
2029#endif
2030
2031 /* Protocol level and numbers, usable for [gs]etsockopt */
Guido van Rossum578de301998-05-28 20:18:18 +00002032/* Sigh -- some systems (e.g. Linux) use enums for these. */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002033#ifdef SOL_SOCKET
2034 insint(d, "SOL_SOCKET", SOL_SOCKET);
2035#endif
2036#ifdef IPPROTO_IP
2037 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002038#else
2039 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002040#endif
2041#ifdef IPPROTO_ICMP
2042 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002043#else
2044 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002045#endif
2046#ifdef IPPROTO_IGMP
2047 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2048#endif
2049#ifdef IPPROTO_GGP
2050 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2051#endif
2052#ifdef IPPROTO_TCP
2053 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002054#else
2055 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002056#endif
2057#ifdef IPPROTO_EGP
2058 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2059#endif
2060#ifdef IPPROTO_PUP
2061 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2062#endif
2063#ifdef IPPROTO_UDP
2064 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002065#else
2066 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002067#endif
2068#ifdef IPPROTO_IDP
2069 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2070#endif
2071#ifdef IPPROTO_HELLO
2072 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2073#endif
2074#ifdef IPPROTO_ND
2075 insint(d, "IPPROTO_ND", IPPROTO_ND);
2076#endif
2077#ifdef IPPROTO_TP
2078 insint(d, "IPPROTO_TP", IPPROTO_TP);
2079#endif
2080#ifdef IPPROTO_XTP
2081 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2082#endif
2083#ifdef IPPROTO_EON
2084 insint(d, "IPPROTO_EON", IPPROTO_EON);
2085#endif
2086#ifdef IPPROTO_BIP
2087 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2088#endif
2089/**/
2090#ifdef IPPROTO_RAW
2091 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002092#else
2093 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002094#endif
2095#ifdef IPPROTO_MAX
2096 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2097#endif
2098
2099 /* Some port configuration */
2100#ifdef IPPORT_RESERVED
2101 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2102#else
2103 insint(d, "IPPORT_RESERVED", 1024);
2104#endif
2105#ifdef IPPORT_USERRESERVED
2106 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2107#else
2108 insint(d, "IPPORT_USERRESERVED", 5000);
2109#endif
2110
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002111 /* Some reserved IP v.4 addresses */
2112#ifdef INADDR_ANY
2113 insint(d, "INADDR_ANY", INADDR_ANY);
2114#else
2115 insint(d, "INADDR_ANY", 0x00000000);
2116#endif
2117#ifdef INADDR_BROADCAST
2118 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2119#else
2120 insint(d, "INADDR_BROADCAST", 0xffffffff);
2121#endif
2122#ifdef INADDR_LOOPBACK
2123 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2124#else
2125 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2126#endif
2127#ifdef INADDR_UNSPEC_GROUP
2128 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2129#else
2130 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2131#endif
2132#ifdef INADDR_ALLHOSTS_GROUP
2133 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2134#else
2135 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2136#endif
2137#ifdef INADDR_MAX_LOCAL_GROUP
2138 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2139#else
2140 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2141#endif
2142#ifdef INADDR_NONE
2143 insint(d, "INADDR_NONE", INADDR_NONE);
2144#else
2145 insint(d, "INADDR_NONE", 0xffffffff);
2146#endif
2147
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002148 /* IP [gs]etsockopt options */
2149#ifdef IP_OPTIONS
2150 insint(d, "IP_OPTIONS", IP_OPTIONS);
2151#endif
2152#ifdef IP_HDRINCL
2153 insint(d, "IP_HDRINCL", IP_HDRINCL);
2154#endif
2155#ifdef IP_TOS
2156 insint(d, "IP_TOS", IP_TOS);
2157#endif
2158#ifdef IP_TTL
2159 insint(d, "IP_TTL", IP_TTL);
2160#endif
2161#ifdef IP_RECVOPTS
2162 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2163#endif
2164#ifdef IP_RECVRETOPTS
2165 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2166#endif
2167#ifdef IP_RECVDSTADDR
2168 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2169#endif
2170#ifdef IP_RETOPTS
2171 insint(d, "IP_RETOPTS", IP_RETOPTS);
2172#endif
2173#ifdef IP_MULTICAST_IF
2174 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2175#endif
2176#ifdef IP_MULTICAST_TTL
2177 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2178#endif
2179#ifdef IP_MULTICAST_LOOP
2180 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2181#endif
2182#ifdef IP_ADD_MEMBERSHIP
2183 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2184#endif
2185#ifdef IP_DROP_MEMBERSHIP
2186 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2187#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002188
2189 /* Initialize gethostbyname lock */
2190#if defined(WITH_THREAD) && !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Guido van Rossum65d5b571998-12-21 19:32:43 +00002191 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002192#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002193}